<!-- webkit-test-runner [ enableMetalShaderValidation=true ] -->
<style>
  :root { background: #102030e0; color: #99ddbbcc; font-size: 15px; }
</style>
<script src="../../../resources/js-test-pre.js"></script>
<script id="shared">
const log = console.log;

async function gc() {
  await 0;
  if (globalThis.GCController) {
    globalThis.GCController.collect();
  } else if (globalThis.$vm) {
    globalThis.$vm.gc();
  } else {
    log('no GC available');
  }
}

/**
 * @param {GPUDevice} device
 * @param {GPUComputePassEncoder} computePassEncoder
 */
function clearResourceUsages(device, computePassEncoder) {
  let code = `@compute @workgroup_size(1) fn c() {}`;
  let module = device.createShaderModule({code});
  computePassEncoder.setPipeline(device.createComputePipeline(
    {
      layout: 'auto',
      compute: {module},
    }));
  computePassEncoder.dispatchWorkgroups(1);
}

/**
 * @template {any} T
 * @param {GPUDevice} device
 * @param {string} label
 * @param {()=>T} payload
 * @returns {Promise<T>}
 */
async function validationWrapper(device, label, payload)  {
  device.pushErrorScope('internal');
  device.pushErrorScope('out-of-memory');
  device.pushErrorScope('validation');
  let result = payload();
  let validationError = await device.popErrorScope();
  let outOfMemoryError = await device.popErrorScope();
  let internalError = await device.popErrorScope();
  let error = validationError ?? outOfMemoryError ?? internalError;
  if (error) {
    log('*'.repeat(25));
    log(error[Symbol.toStringTag]);
    log(error.message);
    log(label);
    if (error.stack != `_`) {
      log(error.stack);
    }
    log(location);
    log('*'.repeat(25));
    throw error;
  }
  return result;
}

const videoUrls = [

];

/**
 * @param {number} index
 * @returns {Promise<HTMLVideoElement>}
 */
function videoWithData(index) {
  let video = document.createElement('video');
  video.src = videoUrls[index % videoUrls.length];
  return new Promise(resolve => {
    video.onloadeddata = () => {
      resolve(video);
    };
  });
}

/**
* @returns {Promise<string>}
*/
async function makeDataUrl(width, height, color0, color1) {
  let offscreenCanvas = new OffscreenCanvas(width, height);
  let ctx = offscreenCanvas.getContext('2d');
  let gradient = ctx.createLinearGradient(0, 0, width, height);
  gradient.addColorStop(0, color0);
  gradient.addColorStop(0.1, color1);
  gradient.addColorStop(0.3, color0);
  gradient.addColorStop(0.7, color1);
  gradient.addColorStop(0.9, color0);
  gradient.addColorStop(1, color1);
  ctx.fillStyle = gradient;
  ctx.fillRect(0, 0, width, height);
  let blob = await offscreenCanvas.convertToBlob();
  let fileReader = new FileReader();
  fileReader.readAsDataURL(blob);
  return new Promise(resolve => {
    fileReader.onload = () => {
      resolve(fileReader.result);
    };
  });
}

async function imageWithData(width, height, color0, color1) {
  let dataUrl = await makeDataUrl(width, height, color0, color1);
  let img = document.createElement('img');
  img.src = dataUrl;
  await img.decode();
  return img;
}

/**
 * @param {string} payload
 * @returns {string}
 */
function toBlobUrl(payload) {
  let blob = new Blob([payload], {type: 'text/javascript'});
  return URL.createObjectURL(blob);
}
</script>

<script>
globalThis.testRunner?.dumpAsText();
globalThis.testRunner?.waitUntilDone();


async function window0() {
let promise0 = navigator.gpu.requestAdapter({});
let promise1 = navigator.gpu.requestAdapter({});
let adapter0 = await promise1;
let device0 = await adapter0.requestDevice({
  requiredFeatures: [
    'depth32float-stencil8',
    'texture-compression-etc2',
    'texture-compression-astc',
    'indirect-first-instance',
    'bgra8unorm-storage',
  ],
  requiredLimits: {
    minUniformBufferOffsetAlignment: 256,
    maxUniformBufferBindingSize: 111657663,
    maxStorageBufferBindingSize: 167601739,
    maxInterStageShaderComponents: 64,
  },
});
let commandEncoder0 = device0.createCommandEncoder();
let computePassEncoder0 = commandEncoder0.beginComputePass({});
let buffer0 = device0.createBuffer({
  size: 14302,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE,
});
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let buffer1 = device0.createBuffer({size: 7115, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder1 = device0.createCommandEncoder();
let commandEncoder2 = device0.createCommandEncoder({});
try {
buffer1.unmap();
} catch {}
let buffer2 = device0.createBuffer({
  size: 21204,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture0 = device0.createTexture({
  size: [384, 1824, 1],
  mipLevelCount: 2,
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder1 = commandEncoder1.beginComputePass({});
let renderBundleEncoder0 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], stencilReadOnly: false});
try {
commandEncoder2.copyTextureToBuffer({
  texture: texture0,
  mipLevel: 0,
  origin: {x: 9, y: 39, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 164 widthInBlocks: 41 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1148 */
  offset: 1148,
  bytesPerRow: 29696,
  buffer: buffer2,
}, {width: 41, height: 441, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder0.pushDebugGroup('\u130e');
} catch {}
let bindGroupLayout0 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 119,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 204,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
    {binding: 78, visibility: GPUShaderStage.FRAGMENT, externalTexture: {}},
  ],
});
let pipelineLayout0 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout0]});
let commandEncoder3 = device0.createCommandEncoder({});
let computePassEncoder2 = commandEncoder2.beginComputePass({});
let renderBundle0 = renderBundleEncoder0.finish({});
let offscreenCanvas0 = new OffscreenCanvas(133, 15);
let texture1 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let gpuCanvasContext0 = offscreenCanvas0.getContext('webgpu');
let bindGroupLayout1 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 177,
      visibility: GPUShaderStage.VERTEX,
      storageTexture: { format: 'r32sint', access: 'read-only', viewDimension: '1d' },
    },
    {
      binding: 381,
      visibility: GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'float', multisampled: false },
    },
  ],
});
let textureView0 = texture1.createView({mipLevelCount: 1});
try {
commandEncoder3.clearBuffer(buffer1, 548, 2488);
} catch {}
try {
device0.queue.writeBuffer(buffer2, 276, new Float32Array(7705), 2113, 340);
} catch {}
let bindGroupLayout2 = device0.createBindGroupLayout({
  label: '\ua1ae\u1f29\u20a8\ubc42\u{1f783}',
  entries: [
    {
      binding: 67,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: 'cube', sampleType: 'float', multisampled: false },
    },
    {
      binding: 185,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '1d', sampleType: 'unfilterable-float', multisampled: false },
    },
  ],
});
let commandEncoder4 = device0.createCommandEncoder({});
let texture2 = device0.createTexture({
  size: [192],
  dimension: '1d',
  format: 'rgba8unorm',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler0 = device0.createSampler({
  label: '\u0d9f\u40d1\u0acd\ufcd0\u092a\u{1f8ea}',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 66.90,
  lodMaxClamp: 73.38,
  maxAnisotropy: 10,
});
let imageData0 = new ImageData(28, 52);
let texture3 = device0.createTexture({
  size: [256],
  dimension: '1d',
  format: 'r32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder3 = commandEncoder3.beginComputePass({label: '\u0f7b\uf240\u623d\u8052\u6f06\u0e6b\u0569\uf331\uec8c\u0fcc'});
try {
computePassEncoder0.popDebugGroup();
} catch {}
let shaderModule0 = device0.createShaderModule({
  code: `
requires packed_4x8_integer_dot_product;

enable f16;

@group(0) @binding(204) var<storage, read> buffer4: array<f16, 10>;

fn unconst_f32(v: f32) -> f32 { return v; }

struct FragmentOutput0 {
  @location(0) f0: vec4f,
}

@id(7456) override override3: u32;

alias vec3b = vec3<bool>;

fn unconst_f16(v: f16) -> f16 { return v; }

struct T0 {
  @align(1) @size(20) f0: array<u32>,
}

struct VertexOutput1 {
  @location(11) f1: vec4u,
  @location(13) @interpolate(flat, centroid) f2: vec2u,
  @location(15) @interpolate(flat, centroid) f3: u32,
  @location(7) @interpolate(flat, sample) f4: vec2i,
  @location(5) f5: f16,
  @location(10) f6: vec4i,
  @location(9) @interpolate(flat, sample) f7: vec2f,
  @location(4) @interpolate(perspective) f8: vec2f,
  @builtin(position) f9: vec4f,
  @location(3) @interpolate(perspective, centroid) f10: vec2f,
}

struct T4 {
  f0: i32,
  @align(2) f1: T1,
}

override override4: u32;

struct T1 {
  @size(16) f0: vec4h,
}

fn fn0(a0: ptr<workgroup, array<array<f16, 13>, 4>>, a1: ptr<storage, array<u32>, read_write>, a2: array<array<array<array<u32, 1>, 1>, 4>, 14>) {
  let ptr0: ptr<storage, array<f16, 10>, read> = &buffer4;
  let ptr1: ptr<workgroup, f16> = &(*a0)[3][u32(unconst_u32(187))];
  (*a0)[u32(unconst_u32(361))][12] = f16(vp0[17][1][0]);
  (*a0)[u32(unconst_u32(189))][u32(unconst_u32(195))] = f16(vp0[17][1][0]);
  let ptr2: ptr<private, array<array<f32, 1>, 2>> = &vp0[17];
  let ptr3: ptr<private, array<array<f32, 1>, 2>> = &vp0[17];
  let ptr4: ptr<private, array<f32, 1>> = &(*ptr2)[1];
}

var<workgroup> vw0: VertexOutput0;

fn unconst_i32(v: i32) -> i32 { return v; }

struct T3 {
  @align(2) @size(52) f0: array<u32>,
}

override override2: i32;

struct T2 {
  @align(2) @size(52) f0: array<u32>,
}

fn unconst_u32(v: u32) -> u32 { return v; }

@group(0) @binding(78) var et0: texture_external;

var<private> vp0: array<array<array<f32, 1>, 2>, 18> = array(array(array(f32()), array(f32())), array(array<f32, 1>(), array<f32, 1>()), array(array<f32, 1>(f32()), array(f32())), array<array<f32, 1>, 2>(), array<array<f32, 1>, 2>(), array(array<f32, 1>(), array(f32())), array<array<f32, 1>, 2>(), array(array<f32, 1>(f32()), array(f32())), array(array<f32, 1>(f32()), array(f32())), array(array<f32, 1>(), array<f32, 1>(f32())), array<array<f32, 1>, 2>(array<f32, 1>(f32()), array<f32, 1>()), array<array<f32, 1>, 2>(array(f32()), array(f32())), array<array<f32, 1>, 2>(), array<array<f32, 1>, 2>(), array<array<f32, 1>, 2>(array(f32()), array(f32())), array<array<f32, 1>, 2>(), array<array<f32, 1>, 2>(array(f32()), array(f32())), array(array(f32()), array(f32())));

struct VertexOutput2 {
  @location(11) f11: vec2u,
  @location(8) f12: f32,
  @invariant @builtin(position) f13: vec4f,
  @location(9) @interpolate(flat, centroid) f14: vec2h,
  @location(5) f15: f32,
  @location(12) f16: vec2u,
  @location(14) @interpolate(flat, sample) f17: vec4u,
  @location(6) @interpolate(flat, sample) f18: vec2u,
  @location(10) f19: vec2h,
  @location(4) @interpolate(perspective, center) f20: vec4f,
  @location(13) f21: vec2h,
}

struct VertexOutput0 {
  @builtin(position) f0: vec4f,
}

@id(32378) override override1: f32;

fn unconst_bool(v: bool) -> bool { return v; }

@group(0) @binding(119) var<storage, read_write> buffer3: array<array<array<array<array<array<f16, 5>, 1>, 1>, 1>, 5>>;

@id(24730) override override0: f32;

@vertex
fn vertex0() -> VertexOutput0 {
  var out: VertexOutput0;
  out.f0 -= vec4f(f32((*&buffer4)[9]));
  var vf0: u32 = override3;
  let vf1: f16 = length(vec4h(unconst_f16(3903.9), unconst_f16(-910.1), unconst_f16(-5331.3), unconst_f16(866.7)));
  let vf2: u32 = firstLeadingBit(u32(unconst_u32(213)));
  out = VertexOutput0(vec4f(vp0[bitcast<u32>(override2)][1][0]));
  let ptr5: ptr<storage, f16, read> = &buffer4[override3];
  vf0 = pack4xU8Clamp(insertBits(vec4u(unconst_u32(105), unconst_u32(118), unconst_u32(185), unconst_u32(33)), vec4u(unconst_u32(167), unconst_u32(166), unconst_u32(279), unconst_u32(104)), vf0, u32(buffer4[9])));
  vp0[u32(unconst_u32(82))][u32(log(vec3f(unconst_f32(-0.2316), unconst_f32(0.01777), unconst_f32(-0.1023)))[1])][u32(buffer4[9])] = cos(f32(unconst_f32(-0.01286)));
  out.f0 = vec4f(override1);
  out = VertexOutput0(unpack2x16unorm(vec3u(pow(vec3h(unconst_f16(4227.3), unconst_f16(943.0), unconst_f16(5038.7)), vec3h(unconst_f16(1044.7), unconst_f16(5697.4), unconst_f16(16864.1)))).y).rggg);
  out.f0 = vec4f(atan2(f32(unconst_f32(0.1590)), f32(unconst_f32(0.05283))));
  vp0[u32((*&buffer4)[9])][u32(unconst_u32(80))][u32(unconst_u32(26))] -= vp0[17][1][0];
  out.f0 = vec4f(f32(buffer4[u32(vp0[17][1][u32(unconst_u32(111))])]));
  let ptr6: ptr<private, f32> = &vp0[17][1][0];
  let vf3: i32 = override2;
  var vf4: f16 = vf1;
  var vf5: f16 = vf1;
  let vf6: f16 = vf1;
  var vf7: vec3h = pow(vec3h(unconst_f16(880.7), unconst_f16(4851.4), unconst_f16(16510.2)), vec3h(unconst_f16(7785.7), unconst_f16(23560.6), unconst_f16(9436.4)));
  vf7 *= vec3h((*&buffer4)[9]);
  return out;
  _ = override3;
  _ = override2;
  _ = override1;
}

@vertex
fn vertex1() -> VertexOutput1 {
  var out: VertexOutput1;
  out = VertexOutput1(bitcast<vec4u>(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).xxxy), vec2u(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).br), u32(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).r), bitcast<vec2i>(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).gb), vec3h(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))))[2], vec4i(pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).zyyz), pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).rg, pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).zy, pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).brbb, pow(vec3f(unconst_f32(0.00130), unconst_f32(0.2806), unconst_f32(0.08548)), vec3f(unconst_f32(0.1301), unconst_f32(0.04212), unconst_f32(0.05466))).gb);
  var vf8: vec3f = pow(vec3f(unconst_f32(0.3921), unconst_f32(0.01871), unconst_f32(0.07492)), vec3f(f32((*&buffer4)[u32(unconst_u32(113))])));
  let ptr7: ptr<private, array<array<array<f32, 1>, 2>, 18>> = &vp0;
  let ptr8: ptr<storage, f16, read> = &(*&buffer4)[9];
  let ptr9: ptr<storage, f16, read> = &buffer4[9];
  out.f9 -= vec4f(f32(override3));
  out.f2 = vec2u(u32(vp0[17][1][u32(unconst_u32(162))]));
  var vf9: vec4f = cos(vec4f(unconst_f32(0.06753), unconst_f32(0.2483), unconst_f32(0.05104), unconst_f32(-0.1021)));
  out = VertexOutput1(unpack4xU8(u32(vf8[u32(unconst_u32(436))])), vec2u(u32(vf8[u32(unconst_u32(436))])), bitcast<u32>(vf8[u32(unconst_u32(436))]), vec2i(i32(vf8[u32(unconst_u32(436))])), f16(vf8[u32(unconst_u32(436))]), vec4i(i32(vf8[u32(unconst_u32(436))])), vec2f(vf8[u32(unconst_u32(436))]), vec2f(vf8[u32(unconst_u32(436))]), vec4f(vf8[u32(unconst_u32(436))]), vec2f(vf8[u32(unconst_u32(436))]));
  out.f6 = vec4i(i32((*ptr7)[17][u32(vp0[u32(unconst_u32(304))][1][0])][0]));
  let ptr10: ptr<storage, array<f16, 10>, read> = &buffer4;
  var vf10: vec4h = degrees(vec4h(acosh(f16(unconst_f16(16053.4)))));
  return out;
  _ = override3;
}

@vertex
fn vertex2(@location(3) @interpolate(linear) a0: vec2f, @location(10) @interpolate(flat, sample) a1: i32) -> VertexOutput2 {
  var out: VertexOutput2;
  out.f12 = bitcast<f32>(pack4x8unorm(vec4f(bitcast<f32>(pack4x8unorm(vec4f(unconst_f32(0.1454), unconst_f32(0.04121), unconst_f32(0.00396), unconst_f32(0.1437)))))));
  out.f16 -= vec2u(u32(max(f32(unconst_f32(0.04939)), f32(faceForward(vec4h(exp2(vec3f(unconst_f32(0.05062), unconst_f32(0.08465), unconst_f32(0.04569))).rgrb), vec4h(f16(a0[1])), vec4h(f16(acosh(max(f32(unconst_f32(0.07032)), bitcast<f32>(firstLeadingBit(vec3u(unconst_u32(373), unconst_u32(265), unconst_u32(206)))[1]))))))[2]))));
  return out;
}

@fragment
fn fragment0(@builtin(sample_mask) a0: u32) -> FragmentOutput0 {
  var out: FragmentOutput0;
  let vf11: u32 = pack4xI8(vec4i(unconst_i32(79), unconst_i32(-58), unconst_i32(166), unconst_i32(32)));
  let ptr11: ptr<storage, array<array<array<array<f16, 5>, 1>, 1>, 1>, read_write> = &buffer3[arrayLength(&buffer3)][4];
  var vf12: u32 = override3;
  let ptr12: ptr<storage, f16, read_write> = &(*ptr11)[0][0][0][4];
  vf12 = vf11;
  vp0[u32(unconst_u32(182))][u32(unconst_u32(184))][0] += f32(textureDimensions(et0)[1]);
  vp0[u32(unconst_u32(416))][u32(unconst_u32(96))][u32(buffer3[arrayLength(&buffer3)][4][0][0][0][4])] -= f32((*&buffer3)[arrayLength(&(*&buffer3))][4][0][0][0][4]);
  let ptr13: ptr<storage, array<array<f16, 5>, 1>, read_write> = &(*&buffer3)[arrayLength(&(*&buffer3))][4][0][0];
  let ptr14: ptr<storage, array<array<array<array<f16, 5>, 1>, 1>, 1>, read_write> = &(*&buffer3)[arrayLength(&(*&buffer3))][4];
  let ptr15: ptr<storage, f16, read_write> = &(*ptr11)[0][0][0][u32(unconst_u32(31))];
  out.f0 = vec4f(vp0[u32(unconst_u32(47))][1][0]);
  out.f0 = vec4f(f32(buffer3[arrayLength(&buffer3)][4][0][0][0][4]));
  out = FragmentOutput0(vec4f(f32(buffer3[arrayLength(&buffer3)][4][0][0][u32(buffer3[arrayLength(&buffer3)][4][u32(buffer3[arrayLength(&buffer3) - 1][4][0][0][0][4])][0][0][4])][4])));
  vp0[u32((*&buffer3)[arrayLength(&(*&buffer3))][4][0][0][0][4])][u32((*ptr14)[0][vf11][0][4])][u32(unconst_u32(1))] -= vp0[17][1][0];
  let ptr16: ptr<storage, f16, read_write> = &(*ptr12);
  return out;
  _ = override3;
}

@compute @workgroup_size(2, 1, 1)
fn compute0() {
  let ptr17: ptr<storage, array<array<f16, 5>, 1>, read_write> = &(*&buffer3)[arrayLength(&(*&buffer3))][4][0][bitcast<u32>(vp0[17][1][0])];
  vp0[u32(buffer3[arrayLength(&buffer3)][4][0][0][0][4])][u32(buffer3[arrayLength(&buffer3) - 1][4][0][0][0][4])][u32(unconst_u32(81))] *= bitcast<f32>(countLeadingZeros(i32(unconst_i32(115))));
  vw0.f0 = vec4f(f32(buffer3[arrayLength(&buffer3)][4][0][0][0][4]));
  var vf13: vec4h = asin(vec4h(buffer3[arrayLength(&buffer3)][4][0][0][0][4]));
  buffer3[bitcast<u32>((*&vw0).f0[1])][pack4x8snorm(vw0.f0)][u32(unconst_u32(399))][u32((*&buffer3)[arrayLength(&(*&buffer3))][4][0][0][0][4])][u32(unconst_u32(38))][u32(buffer3[arrayLength(&buffer3)][4][0][0][0][4])] -= (*ptr17)[0][4];
  var vf14: u32 = override3;
  vp0[u32((*&buffer3)[arrayLength(&(*&buffer3))][4][0][0][0][4])][u32((*&buffer3)[arrayLength(&(*&buffer3))][4][0][bitcast<u32>(step(vec2h(unconst_f16(6942.4), unconst_f16(6959.0)), vec2h(unconst_f16(11830.0), unconst_f16(9083.1))))][0][4])][u32(unconst_u32(166))] += f32(cross(vec3h((*&buffer3)[arrayLength(&(*&buffer3))][4][0][0][0][4]), vec3h(unconst_f16(-1526.5), unconst_f16(1509.6), unconst_f16(11992.3))).x);
  _ = override3;
}`,
  hints: {},
});
let bindGroupLayout3 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 251,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'uniform', minBindingSize: 0, hasDynamicOffset: false },
    },
  ],
});
let commandEncoder5 = device0.createCommandEncoder({});
let texture4 = device0.createTexture({
  label: '\u0687\u{1fe68}\u1826\u0dbb\uafb1\u2a47\u005d\u{1f6be}\u01f6\u0738\u{1f6df}',
  size: [96],
  dimension: '1d',
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let offscreenCanvas1 = new OffscreenCanvas(395, 18);
let shaderModule1 = device0.createShaderModule({
  label: '\ue37f\u05a9\u0000\u0ca6\u6648\u0a27\u{1fd39}\u416e',
  code: `
enable f16;

enable f16;

enable f16;

diagnostic(info, xyz);

enable f16;

requires packed_4x8_integer_dot_product;

struct T1 {
  @size(20) f0: array<u32>,
}

var<workgroup> vw1: mat4x3f;

fn unconst_u32(v: u32) -> u32 { return v; }

var<private> vp1 = modf(vec4f());

struct T3 {
  @size(16) f0: mat3x2h,
}

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(204) var<storage, read> buffer6: array<array<array<f16, 1>, 5>, 2>;

fn fn1() {
  vp1.fract = vec4f(f32(override6));
  fn0();
  var vf16: f16 = override6;
  vf16 *= f16(override8);
  let vf17: vec4h = cos(vec4h(unconst_f16(10142.9), unconst_f16(20909.9), unconst_f16(2438.6), unconst_f16(37154.3)));
  vp1.whole = vec4f(f32(exp(vec4h(vp1.fract)[3])));
  vf16 = exp((*&buffer6)[1][4][0]);
  let ptr22: ptr<storage, array<array<array<f16, 1>, 5>, 2>, read> = &buffer6;
  vp1.fract *= vec4f(f32((*ptr22)[1][4][0]));
  let ptr23: ptr<storage, f16, read> = &buffer6[1][4][0];
  vf16 = buffer6[1][4][0];
  vp1.fract -= vec4f(tan(f32(buffer6[1][4][0])));
  var vf18 = fn0();
  fn0();
  _ = override6;
  _ = override8;
}

struct FragmentOutput2 {
  @location(0) f0: vec4f,
  @location(5) f1: vec4u,
}

alias vec3b = vec3<bool>;

var<workgroup> vw3: atomic<u32>;

fn unconst_i32(v: i32) -> i32 { return v; }

@group(0) @binding(119) var<storage, read_write> buffer5: array<array<array<array<f16, 1>, 1>, 25>>;

struct T0 {
  @align(2) @size(52) f0: array<u32>,
}

struct FragmentOutput1 {
  @location(1) f0: vec4i,
  @location(0) f1: vec4f,
}

fn fn2() -> T3 {
  var out: T3;
  out.f0 = mat3x2h(floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]), floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]), floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]), floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]), floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]), floor(vec2h(countLeadingZeros(vec2i(unconst_i32(36), unconst_i32(234))))[0]));
  out = T3(mat3x2h(buffer6[1][4][0], buffer6[1][4][0], buffer6[1][4][0], buffer6[1][4][0], buffer6[1][4][0], buffer6[1][4][0]));
  let vf19: vec2i = countLeadingZeros(vec2i(unconst_i32(195), unconst_i32(194)));
  var vf20: bool = all(vec4<bool>(unconst_bool(false), unconst_bool(false), unconst_bool(false), unconst_bool(false)));
  vp1 = modf(vec4f(f32(buffer6[1][4][0])));
  var vf21: vec3f = pow(vec3f(vf19.yxx), vec3f(unconst_f32(0.08533), unconst_f32(0.2587), unconst_f32(0.4279)));
  let ptr24: ptr<storage, array<array<f16, 1>, 5>, read> = &buffer6[u32(unconst_u32(71))];
  fn1();
  fn0();
  fn0();
  let ptr25: ptr<storage, f16, read> = &(*&buffer6)[1][4][0];
  return out;
  _ = override8;
  _ = override6;
}

struct S0 {
  @builtin(sample_mask) f0: u32,
}

struct T2 {
  @align(2) @size(52) f0: array<u32>,
}

struct VertexOutput3 {
  @location(6) f22: vec2u,
  @location(1) @interpolate(flat, centroid) f23: vec4u,
  @location(14) @interpolate(flat, centroid) f24: vec4i,
  @invariant @builtin(position) f25: vec4f,
  @location(15) f26: vec2h,
  @location(3) f27: f16,
}

@id(1297) override override8: i32;

fn fn0() -> vec4f {
  var out: vec4f;
  let ptr18: ptr<storage, f16, read> = &buffer6[1][4][u32(buffer6[1][4][0])];
  let ptr19: ptr<private, vec4f> = &vp1.whole;
  out -= unpack4x8unorm(pack4xI8Clamp(vec4i(unconst_i32(-16), unconst_i32(257), unconst_i32(342), unconst_i32(282))));
  out -= vec4f(bitcast<f32>(pack2x16snorm(vec2f(unconst_f32(0.08125), unconst_f32(-0.1415)))));
  out *= vec4f(bitcast<f32>(reverseBits(u32(unconst_u32(170)))));
  let vf15: f32 = (*ptr19)[u32((*&buffer6)[1][4][0])];
  out = vec4f(f32(buffer6[u32(unconst_u32(70))][4][0]));
  let ptr20: ptr<storage, array<f16, 1>, read> = &(*&buffer6)[1][4];
  let ptr21: ptr<storage, array<array<f16, 1>, 5>, read> = &buffer6[1];
  vp1.whole -= vec4f(f32(buffer6[1][4][0]));
  return out;
}

@group(0) @binding(78) var et1: texture_external;

var<workgroup> vw2: mat4x2f;

fn unconst_bool(v: bool) -> bool { return v; }

override override6: f16;

fn unconst_f32(v: f32) -> f32 { return v; }

@id(50861) override override7: f16 = 2137.5;

override override5: f32;

@vertex
fn vertex3(@location(8) a0: f16) -> VertexOutput3 {
  var out: VertexOutput3;
  fn1();
  var vf22: f32 = ldexp(f32(unconst_f32(0.1102)), i32(unconst_i32(217)));
  out.f23 <<= vec4u(round(vec2f(f32((*&buffer6)[1][4][0]))).gggg);
  let ptr26: ptr<storage, array<f16, 1>, read> = &(*&buffer6)[1][u32(unconst_u32(89))];
  let ptr27: ptr<storage, array<array<array<f16, 1>, 5>, 2>, read> = &buffer6;
  var vf23 = fn0();
  out = VertexOutput3(vec2u(vp1.whole.aa), bitcast<vec4u>(vp1.whole), bitcast<vec4i>(vp1.whole), vp1.whole, vec2h(vp1.whole.xy), vec4h(vp1.whole)[0]);
  let ptr28: ptr<storage, f16, read> = &(*ptr26)[0];
  out.f22 >>= vec2u(u32((*ptr26)[u32(unconst_u32(11))]));
  vf23 = vec4f(vf23[bitcast<u32>(vp1.fract[0])]);
  out.f23 -= vec4u(u32(buffer6[1][4][0]));
  fn1();
  vp1.whole = vec4f(f32((*&buffer6)[1][4][0]));
  vf22 += f32((*ptr27)[1][4][0]);
  out = VertexOutput3(vec2u(u32((*ptr27)[1][4][0])), unpack4xU8(u32((*ptr27)[1][4][0])), vec4i(i32((*ptr27)[1][4][0])), vec4f(f32((*ptr27)[1][4][0])), vec2h((*ptr27)[1][4][0]), (*ptr27)[1][4][0]);
  let vf24: i32 = override8;
  fn1();
  out.f25 *= vf23;
  return out;
  _ = override8;
  _ = override6;
}

@fragment
fn fragment1(@invariant @builtin(position) a0: vec4f) -> FragmentOutput1 {
  var out: FragmentOutput1;
  buffer5[u32((*&buffer5)[arrayLength(&(*&buffer5))][24][0][u32(unconst_u32(132))])][24][u32(unconst_u32(69))][u32(buffer6[1][4][0])] *= f16(countTrailingZeros(vec2u(unconst_u32(16), unconst_u32(425))).y);
  let ptr29: ptr<storage, array<array<f16, 1>, 1>, read_write> = &(*&buffer5)[arrayLength(&(*&buffer5))][24];
  out.f0 |= vec4i(i32((*&buffer5)[arrayLength(&(*&buffer5))][24][0][0]));
  out.f1 = vec4f(f32((*&buffer6)[1][4][0]));
  let ptr30: ptr<storage, f16, read> = &(*&buffer6)[1][4][0];
  fn1();
  var vf25: vec2f = unpack2x16float(u32(unconst_u32(106)));
  fn1();
  var vf26 = fn2();
  let vf27: f16 = override6;
  vp1.fract *= vec4f(f32(buffer6[1][4][u32((*ptr30))]));
  let ptr31: ptr<storage, f16, read_write> = &buffer5[arrayLength(&buffer5)][24][0][0];
  return out;
  _ = override6;
  _ = override8;
}

@fragment
fn fragment2(@location(14) a0: vec4i, a1: S0) -> FragmentOutput2 {
  var out: FragmentOutput2;
  out.f1 *= unpack4xU8(u32((*&buffer6)[1][4][0]));
  buffer5[bitcast<u32>(max(vec2h(unconst_f16(6212.0), unconst_f16(9124.2)), vec2h(unconst_f16(17363.4), unconst_f16(3663.1))))][arrayLength(&buffer5)][u32(unconst_u32(97))][u32(buffer5[arrayLength(&buffer5)][24][0][0])] += f16(vp1.whole.a);
  let ptr32: ptr<storage, f16, read> = &(*&buffer6)[1][4][0];
  out.f1 >>= bitcast<vec4u>(ceil(unpack4x8snorm(arrayLength(&(*&buffer5)))));
  fn1();
  let vf28: i32 = a0[u32(unconst_u32(141))];
  fn1();
  return out;
  _ = override8;
  _ = override6;
}

@compute @workgroup_size(2, 1, 1)
fn compute1() {
  atomicSub(&vw3, u32(unconst_u32(331)));
  let ptr33: ptr<storage, f16, read_write> = &(*&buffer5)[arrayLength(&(*&buffer5))][24][0][0];
  fn1();
  fn0();
  let ptr34: ptr<workgroup, vec2f> = &vw2[1];
  atomicOr(&vw3, u32(unconst_u32(98)));
  var vf29 = fn2();
  let vf30: bool = any(vec3<bool>(bool(floor(f16(unconst_f16(16501.8))))));
  storageBarrier();
  vw1 = mat4x3f(f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]), f32(buffer5[arrayLength(&buffer5) - 1][24][0][0]));
  atomicCompareExchangeWeak(&vw3, unconst_u32(10), unconst_u32(136));
  buffer5[u32(unconst_u32(77))][24][u32((*&buffer6)[1][4][u32(unconst_u32(336))])][0] -= vec3h((*&vw1)[1])[1];
  vw2 = mat4x2f(vw1[2][0], vw1[2][0], vw1[2][0], vw1[2][0], vw1[2][0], vw1[2][0], vw1[2][0], vw1[2][0]);
  atomicStore(&vw3, u32(unconst_u32(130)));
  _ = override6;
  _ = override8;
}`,
  sourceMap: {},
});
let pipelineLayout1 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder6 = device0.createCommandEncoder({});
let texture5 = device0.createTexture({
  size: [96, 456, 1],
  mipLevelCount: 2,
  format: 'rgb9e5ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView1 = texture3.createView({label: '\ue951\u0070\u004d\u9472\u00c2\u{1f969}\u0a59\uecdb\u808e'});
let renderBundleEncoder1 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], stencilReadOnly: false});
let renderBundle1 = renderBundleEncoder1.finish();
let shaderModule2 = device0.createShaderModule({
  code: `
requires pointer_composite_access;

enable f16;

diagnostic(info, xyz);

var<workgroup> vw5: mat2x2h;

@id(48256) override override15: i32;

@id(31102) override override12: f16;

struct FragmentOutput3 {
  @location(0) @interpolate(linear, center) f0: vec4f,
  @builtin(sample_mask) f1: u32,
}

fn unconst_f16(v: f16) -> f16 { return v; }

fn fn0() -> FragmentOutput3 {
  var out: FragmentOutput3;
  let ptr35: ptr<storage, FragmentOutput3, read> = &buffer8[bitcast<i32>(buffer7[0].f1[0][2])];
  buffer7[buffer8[arrayLength(&buffer8)].f1].f2 = buffer7[0].f1[0][2][u32(unconst_u32(258))];
  var vf31: u32 = arrayLength(&buffer8);
  var vf32: f16 = (*&buffer7)[0].f1[0][1][0];
  var vf33: vec3f = quantizeToF16(vec3f(unconst_f32(0.07930), unconst_f32(0.5802), unconst_f32(0.1703)));
  vf32 = f16(max(f32(unconst_f32(0.1688)), f32(unconst_f32(0.02376))));
  let ptr36: ptr<storage, array<FragmentOutput3>, read> = &buffer8;
  out.f0 = vec4f(buffer7[0].f1[0][2].yxyy);
  let ptr37: ptr<private, f16> = &vp2.fract;
  let ptr38: ptr<storage, FragmentOutput3, read> = &(*ptr36)[i32(unconst_i32(-200))];
  let vf34: f16 = buffer7[0].f1[0][override16][bitcast<u32>(override14)];
  vf32 = f16(override16);
  vf31 |= u32(buffer8[arrayLength(&buffer8) - 1].f0[1]);
  vf32 += vp2.fract;
  var vf35: u32 = override10;
  var vf36: u32 = arrayLength(&(*ptr36));
  vf36 |= u32(override13);
  vf36 *= bitcast<u32>((*&buffer8)[arrayLength(&(*&buffer8))].f0[1]);
  let ptr39: ptr<storage, FragmentOutput3, read> = &(*&buffer8)[bitcast<i32>(override22)];
  buffer7[u32(unconst_u32(387))].f1[u32(unconst_u32(108))] = mat4x2h(f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]), f16((*ptr35).f0[0]));
  let vf37: vec4h = exp2(vec4h(unconst_f16(620.3), unconst_f16(4369.6), unconst_f16(12142.3), unconst_f16(16084.6)));
  let vf38: f32 = override14;
  return out;
  _ = override22;
  _ = override13;
  _ = override16;
  _ = override14;
  _ = override10;
}

var<private> vp2 = frexp(f16());

fn unconst_f32(v: f32) -> f32 { return v; }

override override18: f32;

var<workgroup> vw4: u32;

var<workgroup> vw6: mat2x2f;

@id(17545) override override9 = 0.05920;

var<private> vp3: vec4h = vec4h();

@id(9309) override override16: u32;

struct T0 {
  @align(2) @size(16) f0: array<array<atomic<u32>, 1>, 2>,
  @align(1) @size(32) f1: array<mat4x2h, 1>,
  f2: f16,
}

struct VertexOutput4 {
  @location(8) f28: vec2h,
  @location(5) f29: vec2i,
  @builtin(position) f30: vec4f,
  @location(13) @interpolate(perspective, center) f31: vec4h,
  @location(9) @interpolate(flat) f32: vec4u,
}

var<workgroup> vw7: atomic<i32>;

override override21: i32;

@id(17568) override override14 = 0.02356;

fn unconst_i32(v: i32) -> i32 { return v; }

override override20 = true;

@group(0) @binding(204) var<storage, read> buffer8: array<FragmentOutput3>;

@group(0) @binding(119) var<storage, read_write> buffer7: array<T0, 1>;

override override10: u32 = 275;

@id(13010) override override11: u32;

alias vec3b = vec3<bool>;

@id(2316) override override13: i32 = 253;

fn unconst_u32(v: u32) -> u32 { return v; }

@id(8798) override override19: u32 = 205;

fn unconst_bool(v: bool) -> bool { return v; }

@id(11936) override override17: f16;

@id(14802) override override22: u32 = 48;

@vertex
fn vertex4(@builtin(vertex_index) a0: u32, @location(9) @interpolate(flat) a1: f32) -> VertexOutput4 {
  var out: VertexOutput4;
  out.f30 = vec4f(f32((*&buffer8)[i32(unconst_i32(106))].f1));
  out.f32 = vec4u(u32(buffer8[arrayLength(&buffer8)].f0[3]));
  let ptr40: ptr<storage, FragmentOutput3, read> = &buffer8[arrayLength(&buffer8) - 1];
  out = VertexOutput4(bitcast<vec2h>(buffer8[u32(unconst_u32(284))].f1), vec2i(bitcast<i32>(buffer8[u32(unconst_u32(284))].f1)), vec4f(bitcast<f32>(buffer8[u32(unconst_u32(284))].f1)), vec4h(f16(buffer8[u32(unconst_u32(284))].f1)), vec4u(buffer8[u32(unconst_u32(284))].f1));
  out.f32 = vec4u(tan(vec2h(unconst_f16(19663.3), unconst_f16(-15046.8))).yxxx);
  let vf39: f16 = log2(f16(buffer8[arrayLength(&buffer8) - 1].f1));
  let ptr41: ptr<storage, FragmentOutput3, read> = &buffer8[arrayLength(&buffer8) - 1];
  out.f30 = unpack4x8unorm(override11);
  let vf40: u32 = a0;
  var vf41: u32 = arrayLength(&(*&buffer8));
  var vf42: f16 = override12;
  out.f28 = vec2h(clamp(vec4i(unconst_i32(240), unconst_i32(219), unconst_i32(-21), unconst_i32(428)), vec4i(unconst_i32(4), unconst_i32(168), unconst_i32(80), unconst_i32(183)), vec4i(unconst_i32(306), unconst_i32(232), unconst_i32(83), unconst_i32(161))).xz);
  let ptr42: ptr<storage, u32, read> = &(*ptr41).f1;
  var vf43: u32 = override22;
  let vf44: f16 = log2(f16(a0));
  out.f32 = bitcast<vec4u>(clamp(vec4i(bitcast<i32>(buffer8[arrayLength(&buffer8)].f1)), bitcast<vec4i>((*ptr41).f0), vec4i(i32(vf44))));
  out.f31 = vec4h(buffer8[u32(unconst_u32(655))].f0);
  let vf45: f32 = (*ptr40).f0[pack4x8unorm(buffer8[i32(sin(f16(override16)))].f0)];
  let ptr43: ptr<storage, FragmentOutput3, read> = &buffer8[i32(unconst_i32(148))];
  vf43 >>= u32((*ptr43).f0[0]);
  let ptr44: ptr<storage, FragmentOutput3, read> = &(*&buffer8)[arrayLength(&(*&buffer8))];
  return out;
  _ = override12;
  _ = override11;
  _ = override16;
  _ = override22;
}

@fragment
fn fragment3() -> FragmentOutput3 {
  var out: FragmentOutput3;
  fn0();
  fn0();
  vp3 *= vec4h(f16(buffer8[arrayLength(&buffer8)].f0[3]));
  out.f1 &= u32(buffer7[0].f2);
  vp2.fract *= f16(unpack4x8snorm(bitcast<u32>(atan(f32(override11))))[1]);
  var vf46 = fn0();
  var vf47 = fn0();
  fn0();
  out.f0 = vec4f(bitcast<f32>(vp2.exp));
  var vf48 = fn0();
  vp2.fract += vec4h((*&buffer8)[arrayLength(&(*&buffer8))].f0).g;
  var vf49 = fn0();
  vf46.f0 = unpack4x8snorm(vf48.f1);
  let ptr45: ptr<function, FragmentOutput3> = &vf46;
  return out;
  _ = override11;
  _ = override13;
  _ = override22;
  _ = override14;
  _ = override10;
  _ = override16;
}

@compute @workgroup_size(3, 1, 1)
fn compute2(@builtin(num_workgroups) a0: vec3u, @builtin(workgroup_id) a1: vec3u) {
  let ptr46: ptr<workgroup, mat2x2f> = &vw6;
  vw6 -= mat2x2f(bitcast<f32>(pack4xU8(vec4u(unconst_u32(186), unconst_u32(124), unconst_u32(364), unconst_u32(336)))), bitcast<f32>(pack4xU8(vec4u(unconst_u32(186), unconst_u32(124), unconst_u32(364), unconst_u32(336)))), f32(pack4xU8(vec4u(unconst_u32(186), unconst_u32(124), unconst_u32(364), unconst_u32(336)))), bitcast<f32>(pack4xU8(vec4u(unconst_u32(186), unconst_u32(124), unconst_u32(364), unconst_u32(336)))));
  let ptr47: ptr<storage, mat4x2h, read_write> = &(*&buffer7)[0].f1[u32(unconst_u32(151))];
  let ptr48: ptr<storage, atomic<u32>, read_write> = &(*&buffer7)[0].f0[1][0];
  let vf50: u32 = override10;
  vp3 = bitcast<vec4h>(vw6[1]);
  vp3 = vec4h(override12);
  vw4 -= bitcast<u32>(atomicLoad(&vw7));
  var vf51: f16 = (*&buffer7)[0].f1[0][1][0];
  var vf52: vec2h = (*&vw5)[u32(unconst_u32(122))];
  vp2.fract += vw5[u32(unconst_u32(186))][u32(unconst_u32(438))];
  let ptr49: ptr<storage, array<array<atomic<u32>, 1>, 2>, read_write> = &(*&buffer7)[0].f0;
  var vf53: vec2h = floor(vec2h(unconst_f16(-18988.9), unconst_f16(4264.4)));
  let ptr50: ptr<storage, FragmentOutput3, read> = &(*&buffer8)[i32(unconst_i32(110))];
  var vf54: u32 = pack4x8snorm(vec4f(unconst_f32(0.1745), unconst_f32(0.1634), unconst_f32(0.2293), unconst_f32(0.2473)));
  vw6 = mat2x2f(bitcast<f32>(atomicExchange(&vw7, i32(unconst_i32(-17)))), bitcast<f32>(atomicExchange(&vw7, i32(unconst_i32(-17)))), f32(atomicExchange(&vw7, i32(unconst_i32(-17)))), bitcast<f32>(atomicExchange(&vw7, i32(unconst_i32(-17)))));
  vw6 -= mat2x2f(vec2f(vf52), vec2f(vf52));
  var vf55: f16 = buffer7[0].f1[0][3][u32(vf53[bitcast<u32>((*&buffer8)[u32(unconst_u32(95))].f0[2])])];
  let vf56: f16 = (*&buffer7)[0].f1[0][1][pack2x16float((*ptr46)[0])];
  _ = override12;
  _ = override10;
}`,
  sourceMap: {},
  hints: {},
});
let pipelineLayout2 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture6 = device0.createTexture({
  label: '\uefeb\u14c2\u0c03\u{1fa29}\u9c36\u8fcf',
  size: [96, 456, 1],
  mipLevelCount: 3,
  format: 'astc-12x12-unorm-srgb',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView2 = texture5.createView({dimension: '2d-array', mipLevelCount: 1});
let computePassEncoder4 = commandEncoder6.beginComputePass({label: '\uc0e0\u7c1e\u0ae3\u0c50\u0ad5'});
let sampler1 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 16.52,
  lodMaxClamp: 72.55,
  maxAnisotropy: 17,
});
await gc();
let buffer9 = device0.createBuffer({
  label: '\u{1f9df}\u0a20\u2588\u65ae\u21aa\u{1f902}\u1956\u0d41\u2813\u988a',
  size: 1914,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture7 = device0.createTexture({
  size: [256],
  dimension: '1d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture8 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder5 = commandEncoder5.beginComputePass({});
let shaderModule3 = device0.createShaderModule({
  code: `
enable f16;

requires packed_4x8_integer_dot_product;

diagnostic(info, xyz);

var<workgroup> vw8: array<i32, 15>;

struct T0 {
  @align(2) f0: array<array<array<vec2h, 1>, 1>, 1>,
  @align(2) @size(16) f1: mat2x2h,
}

var<private> vp4: VertexOutput5 = VertexOutput5(vec4f());

@group(0) @binding(119) var<storage, read_write> buffer10: array<array<array<array<array<f16, 1>, 25>, 1>, 1>>;

fn unconst_f16(v: f16) -> f16 { return v; }

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

@group(0) @binding(78) var et2: texture_external;

override override23 = 0.01269;

struct VertexOutput5 {
  @builtin(position) f33: vec4f,
}

var<private> vp5: VertexOutput5 = VertexOutput5();

var<workgroup> vw9: mat2x2f;

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

@group(0) @binding(204) var<storage, read> buffer11: T0;

@vertex
fn vertex5(@location(5) a0: vec4f) -> VertexOutput5 {
  var out: VertexOutput5;
  let ptr51: ptr<storage, array<array<array<vec2h, 1>, 1>, 1>, read> = &(*&buffer11).f0;
  let ptr52: ptr<storage, vec2h, read> = &buffer11.f0[0][0][u32(unconst_u32(27))];
  vp5 = VertexOutput5(vec4f(buffer11.f0[0][0][0].xyxy));
  out = VertexOutput5(vec4f((*ptr51)[0][0][u32(unconst_u32(248))].yyxx));
  out.f33 *= unpack4x8snorm(pack4xU8(vec4u((*ptr51)[0][0][0].grrg)));
  let ptr53: ptr<private, VertexOutput5> = &vp4;
  return out;
}

@fragment
fn fragment4() -> @location(200) @interpolate(flat) vec4f {
  var out: vec4f;
  let ptr54: ptr<storage, mat2x2h, read> = &buffer11.f1;
  buffer10[bitcast<u32>((*&buffer11).f1[1])][bitcast<u32>((*&buffer11).f0[0][0][0])][u32(unconst_u32(178))][u32(unconst_u32(156))][u32(unconst_u32(136))] = cross(vec3h(unconst_f16(25822.2), unconst_f16(15927.7), unconst_f16(5255.6)), (*&buffer11).f0[0][0][0].ggg).z;
  return out;
}

@compute @workgroup_size(2, 1, 1)
fn compute3() {
  let ptr55: ptr<storage, mat2x2h, read> = &(*&buffer11).f1;
  let ptr56: ptr<storage, vec2h, read> = &buffer11.f0[0][0][0];
  let ptr57: ptr<storage, array<array<array<vec2h, 1>, 1>, 1>, read> = &(*&buffer11).f0;
  vp5.f33 = vec4f(f32(buffer10[arrayLength(&buffer10)][0][0][24][0]));
  let ptr58: ptr<storage, array<array<array<array<f16, 1>, 25>, 1>, 1>, read_write> = &buffer10[u32(unconst_u32(139))];
  let ptr59: ptr<storage, vec2h, read> = &(*ptr57)[0][0][u32(unconst_u32(133))];
  let ptr60: ptr<storage, vec2h, read> = &buffer11.f0[0][0][0];
  let ptr61: ptr<storage, array<array<vec2h, 1>, 1>, read> = &(*&buffer11).f0[0];
  let vf57: vec2f = (*&vw9)[u32(unconst_u32(113))];
  let vf58: f32 = vp5.f33[3];
  var vf59: u32 = arrayLength(&(*&buffer10));
  vp5.f33 = vec4f(exp(f32(unconst_f32(0.7133))));
}`,
  sourceMap: {},
  hints: {},
});
let texture9 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  format: 'bgra8unorm-srgb',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let buffer12 = device0.createBuffer({
  size: 9347,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture10 = device0.createTexture({
  size: [192, 912, 1],
  format: 'eac-rg11snorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture11 = device0.createTexture({
  size: [384, 1824, 1],
  mipLevelCount: 7,
  dimension: '2d',
  format: 'r16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler2 = device0.createSampler({
  label: '\u{1fd04}\u9295\ue56f\u6e59\u2afe\u3fe2\u05b6\uc839\uf8b2\u7848',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 76.69,
  lodMaxClamp: 84.06,
});
let buffer13 = device0.createBuffer({size: 20742, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
let texture12 = device0.createTexture({
  size: {width: 4},
  dimension: '1d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder6 = commandEncoder4.beginComputePass({});
try {
buffer13.unmap();
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
offscreenCanvas0.height = 776;
let buffer14 = device0.createBuffer({size: 27288, usage: GPUBufferUsage.MAP_WRITE});
let texture13 = device0.createTexture({
  label: '\u{1fa11}\u76b8\u5048',
  size: [256],
  dimension: '1d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView3 = texture6.createView({dimension: '2d-array', baseMipLevel: 1, mipLevelCount: 1});
let buffer15 = device0.createBuffer({
  size: 4336,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder7 = device0.createCommandEncoder({});
let textureView4 = texture13.createView({dimension: '1d'});
let textureView5 = texture2.createView({dimension: '1d'});
let computePassEncoder7 = commandEncoder7.beginComputePass();
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
let offscreenCanvas2 = new OffscreenCanvas(75, 100);
let videoFrame0 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'unspecified', primaries: 'bt709', transfer: 'logSqrt'} });
let bindGroup0 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView0}, {binding: 177, resource: textureView4}],
});
let commandEncoder8 = device0.createCommandEncoder({});
let texture14 = device0.createTexture({
  size: [1410, 16, 1],
  mipLevelCount: 2,
  format: 'astc-10x8-unorm-srgb',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture15 = device0.createTexture({
  size: [192],
  sampleCount: 1,
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder8 = commandEncoder8.beginComputePass({});
let sampler3 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'nearest',
  lodMinClamp: 45.17,
  lodMaxClamp: 92.02,
});
let texture16 = device0.createTexture({
  size: [48, 228, 1],
  sampleCount: 1,
  dimension: '2d',
  format: 'etc2-rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView6 = texture11.createView({dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder2.setBindGroup(0, bindGroup0);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let commandEncoder9 = device0.createCommandEncoder({});
let texture17 = device0.createTexture({
  size: [48, 228, 1],
  format: 'r16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture18 = device0.createTexture({
  size: [1, 1, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let sampler4 = device0.createSampler({
  label: '\u{1fb32}\u{1fef1}\ufab0',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 9.511,
  lodMaxClamp: 10.74,
  compare: 'less-equal',
  maxAnisotropy: 11,
});
let externalTexture0 = device0.importExternalTexture({source: videoFrame0, colorSpace: 'display-p3'});
try {
commandEncoder9.copyBufferToTexture({
  /* bytesInLastRow: 64 widthInBlocks: 16 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 28 */
  offset: 28,
  bytesPerRow: 21504,
  buffer: buffer12,
}, {
  texture: texture4,
  mipLevel: 0,
  origin: {x: 24, y: 0, z: 0},
  aspect: 'all',
}, {width: 16, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture16,
  mipLevel: 0,
  origin: {x: 4, y: 4, z: 0},
  aspect: 'all',
}, new Uint8Array(38).fill(108), /* required buffer size: 38 */
{offset: 38, bytesPerRow: 37}, {width: 4, height: 128, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout3 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder10 = device0.createCommandEncoder({label: '\u{1f66f}\u0679\u{1ffb5}'});
let texture19 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  mipLevelCount: 2,
  dimension: '2d',
  format: 'eac-r11unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture20 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 147},
  mipLevelCount: 1,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler5 = device0.createSampler({addressModeU: 'repeat', lodMinClamp: 91.37, lodMaxClamp: 93.43});
let buffer16 = device0.createBuffer({
  label: '\u9ddd\u{1f64e}\u156a\u0bca\udb70\u79f3\u49ce\u024a\u{1fa1e}',
  size: 6274,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let commandEncoder11 = device0.createCommandEncoder({});
let textureView7 = texture19.createView({dimension: 'cube', baseMipLevel: 0, mipLevelCount: 1, arrayLayerCount: 6});
let textureView8 = texture2.createView({});
let computePassEncoder9 = commandEncoder11.beginComputePass({});
let renderBundleEncoder2 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float']});
let renderBundle2 = renderBundleEncoder2.finish({});
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas0,
  origin: { x: 4, y: 195 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder12 = device0.createCommandEncoder();
try {
computePassEncoder6.setBindGroup(0, bindGroup0, new Uint32Array(711), 80, 0);
} catch {}
try {
commandEncoder9.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 3584 */
  offset: 3584,
  bytesPerRow: 39936,
  buffer: buffer16,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder9.insertDebugMarker('\u019e');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData0,
  origin: { x: 5, y: 15 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData1 = new ImageData(60, 8);
let bindGroupLayout4 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 175,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'uint', multisampled: true },
    },
  ],
});
let commandEncoder13 = device0.createCommandEncoder({});
let texture21 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  sampleCount: 4,
  format: 'r16uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder10 = commandEncoder9.beginComputePass({});
try {
computePassEncoder1.setBindGroup(2, bindGroup0);
} catch {}
try {
commandEncoder12.copyTextureToBuffer({
  texture: texture14,
  mipLevel: 1,
  origin: {x: 20, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 80 widthInBlocks: 5 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 16 */
  offset: 16,
  buffer: buffer0,
}, {width: 50, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture12,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(317).fill(114), /* required buffer size: 317 */
{offset: 317}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let textureView9 = texture21.createView({});
let textureView10 = texture7.createView({});
try {
computePassEncoder4.setBindGroup(1, bindGroup0);
} catch {}
try {
commandEncoder13.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 6408 */
  offset: 6408,
  bytesPerRow: 9472,
  buffer: buffer0,
}, {
  texture: texture8,
  mipLevel: 1,
  origin: {x: 0, y: 4, z: 0},
  aspect: 'all',
}, {width: 2, height: 15, depthOrArrayLayers: 0});
} catch {}
let imageData2 = new ImageData(36, 80);
let commandEncoder14 = device0.createCommandEncoder({});
let computePassEncoder11 = commandEncoder12.beginComputePass({label: '\u4eda\u0d91\u0479'});
let sampler6 = device0.createSampler({
  label: '\u0c47\u0183\uaa19\ube99\ua3cb\u{1fc1b}\u0af0\u{1f9e8}\u49c2\u0835',
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 12.77,
});
try {
computePassEncoder11.setBindGroup(1, bindGroup0, new Uint32Array(1067), 103, 0);
} catch {}
try {
commandEncoder10.copyBufferToBuffer(buffer16, 404, buffer2, 14780, 584);
} catch {}
try {
commandEncoder10.copyBufferToTexture({
  /* bytesInLastRow: 96 widthInBlocks: 6 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 4192 */
  offset: 4192,
  bytesPerRow: 13056,
  buffer: buffer12,
}, {
  texture: texture16,
  mipLevel: 0,
  origin: {x: 0, y: 4, z: 0},
  aspect: 'all',
}, {width: 24, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer17 = device0.createBuffer({size: 9162, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
let textureView11 = texture8.createView({dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder1.setBindGroup(0, bindGroup0);
} catch {}
try {
computePassEncoder1.setBindGroup(2, bindGroup0, new Uint32Array(55), 6, 0);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas0,
  origin: { x: 6, y: 73 },
  flipY: true,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\uc051\uc052\u0fae';
} catch {}
let textureView12 = texture18.createView({});
let computePassEncoder12 = commandEncoder13.beginComputePass();
try {
device0.queue.writeTexture({
  texture: texture15,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(45).fill(36), /* required buffer size: 45 */
{offset: 45}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer18 = device0.createBuffer({size: 11361, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX});
let textureView13 = texture4.createView({});
let computePassEncoder13 = commandEncoder10.beginComputePass({});
let renderPassEncoder0 = commandEncoder14.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 759.9, g: -628.2, b: -801.7, a: 791.4, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder13.setBindGroup(2, bindGroup0, []);
} catch {}
try {
renderPassEncoder0.setBindGroup(1, bindGroup0);
} catch {}
try {
renderPassEncoder0.setBindGroup(2, bindGroup0, new Uint32Array(2257), 752, 0);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder0.insertDebugMarker('\u0bed');
} catch {}
let gpuCanvasContext1 = offscreenCanvas1.getContext('webgpu');
let imageData3 = new ImageData(44, 28);
let bindGroup1 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView0}, {binding: 177, resource: textureView10}],
});
let commandEncoder15 = device0.createCommandEncoder({});
let texture22 = device0.createTexture({
  label: '\u{1fe0b}\u3171\u0ca4\u{1fd88}',
  size: {width: 1, height: 1, depthOrArrayLayers: 16},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView14 = texture11.createView({dimension: '2d-array', baseMipLevel: 1, mipLevelCount: 1});
let computePassEncoder14 = commandEncoder15.beginComputePass();
let sampler7 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 68.23,
  lodMaxClamp: 68.88,
  compare: 'greater-equal',
});
try {
renderPassEncoder0.setIndexBuffer(buffer0, 'uint32', 708, 964);
} catch {}
try {
buffer1.unmap();
} catch {}
let promise2 = device0.queue.onSubmittedWorkDone();
let gpuCanvasContext2 = offscreenCanvas2.getContext('webgpu');
let buffer19 = device0.createBuffer({
  size: 4721,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let querySet0 = device0.createQuerySet({type: 'occlusion', count: 110});
try {
computePassEncoder5.setBindGroup(3, bindGroup0, new Uint32Array(488), 6, 0);
} catch {}
try {
  await buffer14.mapAsync(GPUMapMode.WRITE, 0, 14652);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture5,
  mipLevel: 1,
  origin: {x: 0, y: 19, z: 0},
  aspect: 'all',
}, new Uint8Array(4).fill(99), /* required buffer size: 4 */
{offset: 4, bytesPerRow: 102}, {width: 1, height: 23, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas2,
  origin: { x: 11, y: 1 },
  flipY: true,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let sampler8 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 60.72,
  lodMaxClamp: 66.56,
  maxAnisotropy: 15,
});
try {
computePassEncoder8.setBindGroup(2, bindGroup1, new Uint32Array(15), 2, 0);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
let imageData4 = new ImageData(8, 56);
let videoFrame1 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'rgb', primaries: 'bt470bg', transfer: 'pq'} });
let bindGroup2 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 67, resource: textureView7}, {binding: 185, resource: textureView5}],
});
let buffer20 = device0.createBuffer({
  size: 40925,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let commandEncoder16 = device0.createCommandEncoder({});
let computePassEncoder15 = commandEncoder16.beginComputePass({});
let sampler9 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 29.18,
  lodMaxClamp: 55.73,
  maxAnisotropy: 15,
});
try {
renderPassEncoder0.setBindGroup(1, bindGroup2, new Uint32Array(4600), 1_322, 0);
} catch {}
try {
renderPassEncoder0.setStencilReference(162);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer15, 'uint16', 414, 282);
} catch {}
let bindGroup3 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 67, resource: textureView7}, {binding: 185, resource: textureView8}],
});
let sampler10 = device0.createSampler({
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 9.338,
  lodMaxClamp: 17.27,
  compare: 'equal',
  maxAnisotropy: 18,
});
try {
computePassEncoder1.setBindGroup(3, bindGroup3);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle2, renderBundle2, renderBundle2]);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer19, 'uint32', 352, 2_035);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(5, buffer18, 0, 730);
} catch {}
try {
gpuCanvasContext1.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.STORAGE_BINDING});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer21 = device0.createBuffer({
  label: '\u3246\u6061\u7ef4\u117a\u{1f849}\u{1fb74}',
  size: 1888,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let texture23 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let sampler11 = device0.createSampler({
  label: '\u0135\ucb75\u{1f995}\u4048\u4e26\ude71',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 3.019,
  lodMaxClamp: 31.46,
});
try {
computePassEncoder3.setBindGroup(0, bindGroup1, []);
} catch {}
try {
renderPassEncoder0.setBindGroup(2, bindGroup2, new Uint32Array(263), 28, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(3, buffer9);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData3,
  origin: { x: 0, y: 12 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 0,
  origin: {x: 6, y: 49, z: 2},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 9, height: 5, depthOrArrayLayers: 0});
} catch {}
try {
globalThis.someLabel = device0.label;
} catch {}
let pipelineLayout4 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder17 = device0.createCommandEncoder({});
let texture24 = device0.createTexture({size: [192], dimension: '1d', format: 'rgba16float', usage: GPUTextureUsage.TEXTURE_BINDING});
let computePassEncoder16 = commandEncoder17.beginComputePass();
try {
renderPassEncoder0.setBindGroup(3, bindGroup3);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer12, 'uint32', 1_476, 1_731);
} catch {}
try {
buffer20.unmap();
} catch {}
let pipeline0 = device0.createComputePipeline({layout: pipelineLayout0, compute: {module: shaderModule3}});
let bindGroup4 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer13, offset: 512, size: 9296}}],
});
let buffer22 = device0.createBuffer({size: 19095, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let textureView15 = texture15.createView({baseArrayLayer: 0});
try {
computePassEncoder1.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup1);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle0, renderBundle0]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture15,
  mipLevel: 0,
  origin: {x: 74, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(68).fill(87), /* required buffer size: 68 */
{offset: 68, rowsPerImage: 63}, {width: 15, height: 0, depthOrArrayLayers: 0});
} catch {}
let querySet1 = device0.createQuerySet({type: 'occlusion', count: 901});
try {
computePassEncoder4.setBindGroup(1, bindGroup0, new Uint32Array(1710), 450, 0);
} catch {}
try {
computePassEncoder4.setPipeline(pipeline0);
} catch {}
try {
buffer17.unmap();
} catch {}
try {
device0.label = '\u{1f685}\u69f0\u0aa1\u5a51\u02ac\u27ad';
} catch {}
let commandEncoder18 = device0.createCommandEncoder({label: '\u016b\u5819\u02b7\u082b\u8198\u6924\u{1f600}'});
let renderPassEncoder1 = commandEncoder18.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 261.2, g: -385.8, b: -619.3, a: -879.7, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 12282486,
});
try {
renderPassEncoder0.setBindGroup(3, bindGroup2, new Uint32Array(474), 61, 0);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle0]);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4, buffer18, 900, 123);
} catch {}
try {
buffer15.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer1, 216, new Float32Array(5673), 1761, 924);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData4,
  origin: { x: 1, y: 2 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup5 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer16, offset: 0, size: 2286}}],
});
try {
computePassEncoder13.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(2, buffer18, 716);
} catch {}
let promise3 = device0.queue.onSubmittedWorkDone();
let buffer23 = device0.createBuffer({
  size: 6898,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder19 = device0.createCommandEncoder({});
let texture25 = device0.createTexture({
  label: '\u0430\ud98a\ucedc\u342b\ud51e\u{1fd12}\u68fc',
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder17 = commandEncoder19.beginComputePass({});
try {
computePassEncoder3.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle1, renderBundle2, renderBundle2]);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture26 = gpuCanvasContext1.getCurrentTexture();
try {
computePassEncoder10.setBindGroup(2, bindGroup3, new Uint32Array(751), 62, 0);
} catch {}
try {
computePassEncoder11.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup1, new Uint32Array(214), 12, 0);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle2]);
} catch {}
let commandEncoder20 = device0.createCommandEncoder();
let texture27 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 2},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder18 = commandEncoder20.beginComputePass({});
try {
computePassEncoder2.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(2, bindGroup0);
} catch {}
try {
renderPassEncoder1.setBindGroup(3, bindGroup4, new Uint32Array(2585), 150, 0);
} catch {}
try {
renderPassEncoder0.setBlendConstant({ r: 445.1, g: -371.0, b: 701.5, a: -810.9, });
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer12, 'uint32', 512, 1_005);
} catch {}
let imageData5 = new ImageData(20, 36);
let commandEncoder21 = device0.createCommandEncoder({});
let texture28 = device0.createTexture({
  label: '\u3343\u{1f73b}\u{1fe13}\u{1faab}\u0ad7\u{1fe9b}',
  size: {width: 8, height: 1, depthOrArrayLayers: 62},
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder13.setBindGroup(0, bindGroup4);
} catch {}
try {
computePassEncoder6.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup3, []);
} catch {}
try {
renderPassEncoder0.setBlendConstant({ r: 817.4, g: 756.6, b: 929.9, a: 465.2, });
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer12, 'uint32', 6_684, 77);
} catch {}
let arrayBuffer0 = buffer14.getMappedRange(3208, 2028);
try {
commandEncoder21.copyBufferToTexture({
  /* bytesInLastRow: 64 widthInBlocks: 16 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 3884 */
  offset: 3884,
  bytesPerRow: 30464,
  buffer: buffer23,
}, {
  texture: texture13,
  mipLevel: 0,
  origin: {x: 50, y: 0, z: 0},
  aspect: 'all',
}, {width: 16, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder21.clearBuffer(buffer2);
} catch {}
try {
device0.queue.writeBuffer(buffer1, 1160, new DataView(new ArrayBuffer(3307)), 884, 112);
} catch {}
let textureView16 = texture3.createView({baseMipLevel: 0});
try {
computePassEncoder18.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup2);
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
try {
commandEncoder9.label = '\u896c\u07e3\ufe06\u3d8f\u795d\u47b8\u25d4\uc55d\u9409\u0c2d\u{1f680}';
} catch {}
let pipelineLayout5 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture29 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView17 = texture16.createView({});
try {
computePassEncoder13.setBindGroup(2, bindGroup0, new Uint32Array(2677), 1_849, 0);
} catch {}
try {
computePassEncoder16.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup2, []);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle1, renderBundle0, renderBundle1, renderBundle0, renderBundle0, renderBundle1, renderBundle2, renderBundle2, renderBundle0]);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer9, 'uint32', 124, 21);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
try {
globalThis.someLabel = device0.label;
} catch {}
let bindGroup6 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 185, resource: textureView15}, {binding: 67, resource: textureView7}],
});
let buffer24 = device0.createBuffer({size: 1361, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM});
let texture30 = device0.createTexture({size: [2, 1, 72], format: 'rgba16float', usage: GPUTextureUsage.RENDER_ATTACHMENT});
let renderPassEncoder2 = commandEncoder21.beginRenderPass({colorAttachments: [{view: textureView12, loadOp: 'load', storeOp: 'store'}]});
let renderBundleEncoder3 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], depthReadOnly: true});
try {
renderPassEncoder0.setBindGroup(2, bindGroup5);
} catch {}
let bindGroup7 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer16, offset: 1024, size: 650}}],
});
let texture31 = device0.createTexture({
  size: [1],
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView18 = texture30.createView({dimension: '2d', baseArrayLayer: 3});
let renderBundle3 = renderBundleEncoder3.finish();
try {
renderPassEncoder0.executeBundles([renderBundle1, renderBundle1, renderBundle0]);
} catch {}
try {
renderPassEncoder1.setViewport(0.6289393783394793, 0.7020965617999606, 0.14232455750439726, 0.025881217890475757, 0.47590336978825454, 0.9737921056066983);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer19, 'uint16', 352, 45);
} catch {}
let bindGroup8 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer9, offset: 0, size: 159}}],
});
let textureView19 = texture8.createView({dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder0.setBindGroup(0, bindGroup4);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer19, 'uint16', 564, 775);
} catch {}
let videoFrame2 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-ncl', primaries: 'smpteRp431', transfer: 'iec61966-2-1'} });
try {
globalThis.someLabel = externalTexture0.label;
} catch {}
let bindGroup9 = device0.createBindGroup({layout: bindGroupLayout4, entries: [{binding: 175, resource: textureView9}]});
try {
computePassEncoder2.setBindGroup(1, bindGroup2, new Uint32Array(122), 31, 0);
} catch {}
try {
computePassEncoder5.setPipeline(pipeline0);
} catch {}
let commandEncoder22 = device0.createCommandEncoder({});
let texture32 = device0.createTexture({
  label: '\ud78d\u2ab5',
  size: {width: 8, height: 1, depthOrArrayLayers: 982},
  mipLevelCount: 3,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let computePassEncoder19 = commandEncoder22.beginComputePass({});
try {
computePassEncoder0.setBindGroup(3, bindGroup0, new Uint32Array(328), 175, 0);
} catch {}
try {
renderPassEncoder2.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer15, 'uint32', 272, 381);
} catch {}
let buffer25 = device0.createBuffer({
  label: '\uf504\ua2d9\udcc6\uaa1e\u67e1',
  size: 2592,
  usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder23 = device0.createCommandEncoder({});
let textureView20 = texture22.createView({label: '\u34ce\u0bf1\u052a\u6dc7\u1197', dimension: 'cube', baseMipLevel: 0, baseArrayLayer: 1});
let renderPassEncoder3 = commandEncoder23.beginRenderPass({
  label: '\u7a79\u5d3f',
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 257.0, g: -209.0, b: 691.7, a: 527.6, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 19131819,
});
try {
computePassEncoder17.setBindGroup(1, bindGroup7);
} catch {}
try {
computePassEncoder8.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setScissorRect(0, 0, 0, 0);
} catch {}
let buffer26 = device0.createBuffer({size: 24874, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM});
let texture33 = device0.createTexture({
  label: '\ue545\u13c1\u62d9\u{1fea0}',
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView21 = texture6.createView({dimension: '2d-array', mipLevelCount: 2});
try {
computePassEncoder9.setBindGroup(2, bindGroup4, new Uint32Array(118), 15, 0);
} catch {}
try {
renderPassEncoder2.setBindGroup(2, bindGroup4);
} catch {}
let buffer27 = device0.createBuffer({size: 2564, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE, mappedAtCreation: false});
let textureView22 = texture33.createView({dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder12.setBindGroup(0, bindGroup8);
} catch {}
try {
computePassEncoder17.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setStencilReference(135);
} catch {}
try {
  await promise2;
} catch {}
let commandEncoder24 = device0.createCommandEncoder({});
let computePassEncoder20 = commandEncoder24.beginComputePass({label: '\u41e2\u78cd\ub4e1\u{1f9b1}\ub212\u9879\u7cb9\u98e8\u{1f80e}\u{1fff6}\ue7f8'});
let sampler12 = device0.createSampler({
  label: '\u{1f984}\u{1f9ff}\ubd5c\u12df\u61e3\u0bb3\u79f2\ue409\u0a0a',
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'nearest',
  mipmapFilter: 'linear',
  lodMinClamp: 87.96,
  lodMaxClamp: 91.32,
});
try {
computePassEncoder4.setBindGroup(3, bindGroup1);
} catch {}
try {
computePassEncoder14.setBindGroup(3, bindGroup9, new Uint32Array(2156), 180, 0);
} catch {}
try {
computePassEncoder15.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup4);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer9, 'uint32', 4, 92);
} catch {}
let bindGroupLayout5 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 13,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', minBindingSize: 0, hasDynamicOffset: false },
    },
    {
      binding: 138,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'sint', multisampled: false },
    },
  ],
});
let buffer28 = device0.createBuffer({size: 3577, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder25 = device0.createCommandEncoder({});
let texture34 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler13 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 70.21,
  maxAnisotropy: 13,
});
try {
computePassEncoder4.setBindGroup(3, bindGroup7, new Uint32Array(459), 63, 0);
} catch {}
try {
renderPassEncoder1.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer15, 'uint16', 530, 927);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(0, buffer2, 0);
} catch {}
let promise4 = device0.queue.onSubmittedWorkDone();
let texture35 = device0.createTexture({
  size: [384, 1824, 1],
  mipLevelCount: 5,
  format: 'rg8sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder21 = commandEncoder25.beginComputePass({});
let externalTexture1 = device0.importExternalTexture({source: videoFrame2});
try {
renderPassEncoder1.setBindGroup(1, bindGroup5);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture8,
  mipLevel: 0,
  origin: {x: 3, y: 2, z: 0},
  aspect: 'all',
}, new Uint8Array(49).fill(249), /* required buffer size: 49 */
{offset: 49, bytesPerRow: 181}, {width: 4, height: 43, depthOrArrayLayers: 0});
} catch {}
let commandEncoder26 = device0.createCommandEncoder();
let textureView23 = texture34.createView({
  label: '\u0a7f\u{1fffd}\ue8b1\u091c\u0674\udf54',
  mipLevelCount: 1,
  baseArrayLayer: 0,
  arrayLayerCount: 1,
});
let texture36 = device0.createTexture({size: [1], dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.COPY_DST});
let textureView24 = texture16.createView({label: '\u3368\ub0a9\u040c\u{1fbd9}\u03ea\u{1fbbb}\u973b\u{1f6f5}\ucbcc'});
let computePassEncoder22 = commandEncoder26.beginComputePass({label: '\u09a8\u6070\u959a'});
try {
computePassEncoder0.setBindGroup(1, bindGroup4, new Uint32Array(924), 8, 0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer9, 'uint32', 148, 223);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
  alphaMode: 'opaque',
});
} catch {}
let commandEncoder27 = device0.createCommandEncoder({});
let textureView25 = texture8.createView({mipLevelCount: 1});
let renderPassEncoder4 = commandEncoder27.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: 670.9, g: -239.8, b: -856.5, a: -171.5, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
try {
renderPassEncoder4.setVertexBuffer(3, buffer15);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  alphaMode: 'opaque',
});
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let commandEncoder28 = device0.createCommandEncoder({label: '\u0698\u0c3f\u0abb\u7cd6\u0ce0\u1fb7\u{1f60c}\u0830\u0d35'});
let renderPassEncoder5 = commandEncoder28.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: -986.9, g: -163.9, b: -672.8, a: -121.4, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 300887905,
});
try {
computePassEncoder11.setBindGroup(2, bindGroup0);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer9, 'uint16', 900, 73);
} catch {}
try {
renderPassEncoder0.setBindGroup(1, bindGroup3);
} catch {}
try {
renderPassEncoder2.setBindGroup(3, bindGroup5, new Uint32Array(1010), 9, 0);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer24, 'uint16', 86, 19);
} catch {}
try {
  await promise3;
} catch {}
let imageData6 = new ImageData(64, 68);
try {
globalThis.someLabel = device0.label;
} catch {}
let buffer29 = device0.createBuffer({size: 4169, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX});
let commandEncoder29 = device0.createCommandEncoder({});
try {
computePassEncoder19.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder0.setPipeline(pipeline0);
} catch {}
let bindGroup10 = device0.createBindGroup({
  label: '\u0d57\uffa9\u{1f60f}\u{1f66a}\u0f58\u87c0',
  layout: bindGroupLayout0,
  entries: [
    {binding: 204, resource: {buffer: buffer27, offset: 0, size: 112}},
    {binding: 119, resource: {buffer: buffer20, offset: 20480, size: 892}},
    {binding: 78, resource: externalTexture1},
  ],
});
let pipelineLayout6 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture37 = device0.createTexture({
  size: [96, 456, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder21.setBindGroup(2, bindGroup6, new Uint32Array(726), 36, 0);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup10);
} catch {}
try {
renderPassEncoder1.insertDebugMarker('\u022f');
} catch {}
let commandEncoder30 = device0.createCommandEncoder({});
let texture38 = device0.createTexture({
  size: [48, 228, 35],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder6 = commandEncoder29.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: -985.0, g: 93.24, b: -861.1, a: 999.4, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 58237784,
});
try {
renderPassEncoder5.setIndexBuffer(buffer29, 'uint32', 108, 694);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
commandEncoder30.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1536 */
  offset: 1536,
  buffer: buffer20,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder30.copyTextureToBuffer({
  texture: texture17,
  mipLevel: 0,
  origin: {x: 0, y: 19, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 18 widthInBlocks: 9 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 644 */
  offset: 644,
  bytesPerRow: 16640,
  buffer: buffer12,
}, {width: 9, height: 19, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture20,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 34},
  aspect: 'all',
}, new Uint8Array(24_611).fill(108), /* required buffer size: 24_611 */
{offset: 67, bytesPerRow: 26, rowsPerImage: 118}, {width: 1, height: 0, depthOrArrayLayers: 9});
} catch {}
let renderPassEncoder7 = commandEncoder30.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: -106.1, g: -932.1, b: -651.2, a: 999.4, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
let sampler14 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 41.43,
  lodMaxClamp: 95.72,
  compare: 'equal',
});
let externalTexture2 = device0.importExternalTexture({source: videoFrame2, colorSpace: 'srgb'});
try {
renderPassEncoder7.setIndexBuffer(buffer0, 'uint16', 430, 3_132);
} catch {}
let bindGroup11 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [
    {binding: 78, resource: externalTexture2},
    {binding: 119, resource: {buffer: buffer23, offset: 2304, size: 1592}},
    {binding: 204, resource: {buffer: buffer19, offset: 256, size: 1448}},
  ],
});
let buffer30 = device0.createBuffer({size: 15426, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE, mappedAtCreation: false});
let renderBundleEncoder4 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], depthReadOnly: true, stencilReadOnly: false});
try {
buffer23.unmap();
} catch {}
let promise5 = device0.queue.onSubmittedWorkDone();
let bindGroup12 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 67, resource: textureView7}, {binding: 185, resource: textureView1}],
});
let sampler15 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 69.89,
  lodMaxClamp: 94.61,
});
try {
computePassEncoder21.setBindGroup(0, bindGroup2, new Uint32Array(2445), 82, 0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer20, 'uint16', 220, 18_121);
} catch {}
try {
buffer20.unmap();
} catch {}
await gc();
let commandEncoder31 = device0.createCommandEncoder({label: '\u7bf2\u02db\uaddc'});
let textureView26 = texture3.createView({});
let computePassEncoder23 = commandEncoder31.beginComputePass({});
try {
computePassEncoder10.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(2, bindGroup9, new Uint32Array(772), 140, 0);
} catch {}
try {
adapter0.label = '\u0a38\udc93\ua523\u6c82\u{1f6d3}\u024d\u5f7b\u{1f69d}';
} catch {}
let bindGroupLayout6 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 67,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      sampler: { type: 'non-filtering' },
    },
    {
      binding: 126,
      visibility: 0,
      storageTexture: { format: 'bgra8unorm', access: 'write-only', viewDimension: '3d' },
    },
  ],
});
let texture39 = device0.createTexture({
  label: '\u6cd0\u{1fed5}',
  size: [1, 1, 226],
  dimension: '3d',
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler16 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 10.95,
  lodMaxClamp: 83.24,
});
try {
computePassEncoder12.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer12, 'uint32', 212, 122);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(3, buffer23, 1_424, 450);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 1, depthOrArrayLayers: 982}
*/
{
  source: videoFrame0,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture32,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 2},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await promise4;
} catch {}
let commandEncoder32 = device0.createCommandEncoder({label: '\u{1f6c6}\u4653\u013a\u63a2'});
let textureView27 = texture39.createView({dimension: '3d'});
let textureView28 = texture34.createView({mipLevelCount: 1});
let computePassEncoder24 = commandEncoder32.beginComputePass({});
let renderBundle4 = renderBundleEncoder4.finish({});
try {
renderPassEncoder0.setBindGroup(2, bindGroup11);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer20, 'uint32', 88, 2_367);
} catch {}
try {
renderPassEncoder5.setVertexBuffer(4, buffer18, 3_836, 2_042);
} catch {}
try {
device0.queue.submit([]);
} catch {}
let commandEncoder33 = device0.createCommandEncoder({});
let textureView29 = texture39.createView({arrayLayerCount: 1});
let texture40 = device0.createTexture({
  size: {width: 1, height: 1, depthOrArrayLayers: 1},
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder25 = commandEncoder33.beginComputePass({label: '\ufb20\ub624\u{1fe6a}'});
try {
renderPassEncoder7.setBindGroup(2, bindGroup6, new Uint32Array(1161), 28, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(3, undefined, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let texture41 = device0.createTexture({size: {width: 256}, dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.COPY_DST});
let sampler17 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'linear',
  lodMinClamp: 83.75,
  lodMaxClamp: 88.58,
});
try {
computePassEncoder10.setBindGroup(2, bindGroup7);
} catch {}
try {
computePassEncoder14.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup6);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let querySet2 = device0.createQuerySet({type: 'occlusion', count: 1589});
try {
computePassEncoder15.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer0, 'uint32', 536, 1_259);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture31,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(116).fill(155), /* required buffer size: 116 */
{offset: 116}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup13 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer17, offset: 5632, size: 870}}],
});
let buffer31 = device0.createBuffer({size: 1491, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder34 = device0.createCommandEncoder({});
try {
renderPassEncoder1.setBindGroup(2, bindGroup3);
} catch {}
try {
renderPassEncoder2.setBindGroup(2, bindGroup10, new Uint32Array(242), 11, 0);
} catch {}
try {
commandEncoder34.resolveQuerySet(querySet0, 6, 14, buffer2, 0);
} catch {}
let commandEncoder35 = device0.createCommandEncoder({});
let texture42 = device0.createTexture({
  size: [8],
  dimension: '1d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture43 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
let textureView30 = texture40.createView({format: 'rgba16float'});
try {
renderPassEncoder4.setIndexBuffer(buffer29, 'uint32', 340, 1_550);
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let pipelineLayout7 = device0.createPipelineLayout({
  label: '\u186f\u050a\ud4aa\uef8e\ud0a4\uece0',
  bindGroupLayouts: [bindGroupLayout3, bindGroupLayout5],
});
let buffer32 = device0.createBuffer({size: 9507, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder36 = device0.createCommandEncoder({});
let textureView31 = texture24.createView({});
let computePassEncoder26 = commandEncoder36.beginComputePass({});
try {
commandEncoder35.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 2608 */
  offset: 2608,
  rowsPerImage: 810,
  buffer: buffer28,
}, {
  texture: texture36,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder35.copyTextureToBuffer({
  texture: texture3,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 732 widthInBlocks: 183 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1504 */
  offset: 1504,
  buffer: buffer15,
}, {width: 183, height: 0, depthOrArrayLayers: 0});
} catch {}
let promise6 = device0.queue.onSubmittedWorkDone();
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 1, depthOrArrayLayers: 62}
*/
{
  source: videoFrame0,
  origin: { x: 0, y: 1 },
  flipY: true,
}, {
  texture: texture28,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 15},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
await gc();
let videoFrame3 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'yCgCo', primaries: 'smpte240m', transfer: 'iec6196624'} });
let buffer33 = device0.createBuffer({
  label: '\uac3e\u03c7\u{1fba8}\u{1fcf8}\u07df\uc9dc\ueea4\u4826\u{1fd37}\u{1f7b4}',
  size: 7203,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
let texture44 = device0.createTexture({
  size: [1, 1, 1079],
  mipLevelCount: 3,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder27 = commandEncoder35.beginComputePass({});
let renderPassEncoder8 = commandEncoder34.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: -627.1, g: 652.4, b: -28.55, a: 910.7, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler18 = device0.createSampler({
  label: '\u228b\u0aba\u01f0\u6f03\u14fc\u{1fdfd}\u699f\uccde',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 38.73,
  lodMaxClamp: 82.62,
  maxAnisotropy: 9,
});
try {
computePassEncoder21.setBindGroup(2, bindGroup7);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup10, new Uint32Array(888), 453, 0);
} catch {}
let buffer34 = device0.createBuffer({
  label: '\ufd9d\ucce6\u0048\u{1f607}\uca40\u87da\u8853',
  size: 6891,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder37 = device0.createCommandEncoder();
let sampler19 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 18.43,
});
try {
computePassEncoder0.setBindGroup(3, bindGroup4);
} catch {}
try {
computePassEncoder16.setBindGroup(2, bindGroup7, new Uint32Array(258), 0, 0);
} catch {}
try {
renderPassEncoder4.setViewport(1.169094246301282, 0.39430995549606807, 0.2818875991361675, 0.5111056456130434, 0.3375714223942159, 0.804822555113248);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer0, 'uint16', 1_274, 2_527);
} catch {}
try {
commandEncoder37.copyTextureToBuffer({
  texture: texture31,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 48 */
  offset: 48,
  rowsPerImage: 90,
  buffer: buffer12,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer35 = device0.createBuffer({
  size: 8233,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
try {
  await buffer32.mapAsync(GPUMapMode.WRITE, 0, 1412);
} catch {}
try {
commandEncoder37.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 480 */
  offset: 480,
  bytesPerRow: 16128,
  buffer: buffer22,
}, {
  texture: texture27,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer36 = device0.createBuffer({
  label: '\u{1fade}\u3ad5',
  size: 192,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT,
});
let textureView32 = texture21.createView({mipLevelCount: 1});
let texture45 = device0.createTexture({
  size: [256, 256, 17],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView33 = texture44.createView({mipLevelCount: 1});
let computePassEncoder28 = commandEncoder37.beginComputePass({});
try {
renderPassEncoder8.setBindGroup(1, bindGroup8, new Uint32Array(725), 17, 0);
} catch {}
let imageBitmap0 = await createImageBitmap(offscreenCanvas2);
let buffer37 = device0.createBuffer({
  size: 16048,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture46 = device0.createTexture({
  size: [8, 1, 2],
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView34 = texture16.createView({dimension: '2d-array', format: 'etc2-rgba8unorm'});
try {
computePassEncoder1.setBindGroup(1, bindGroup4, new Uint32Array(185), 4, 0);
} catch {}
try {
renderPassEncoder3.setBindGroup(1, bindGroup6, []);
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer0, 'uint32', 1_880, 662);
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
let texture47 = device0.createTexture({
  label: '\u0c1b\u9751\u983a\ubfd9\u4461\u334e\u0740\u9685\u0df3\u38e1\u{1f605}',
  size: {width: 384, height: 1824, depthOrArrayLayers: 84},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView35 = texture17.createView({aspect: 'all', baseArrayLayer: 0});
let sampler20 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 25.07,
  compare: 'never',
  maxAnisotropy: 1,
});
try {
computePassEncoder20.setBindGroup(2, bindGroup7, new Uint32Array(4809), 597, 0);
} catch {}
try {
computePassEncoder28.setPipeline(pipeline0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture34,
  mipLevel: 0,
  origin: {x: 6, y: 23, z: 0},
  aspect: 'all',
}, new Uint8Array(84).fill(77), /* required buffer size: 84 */
{offset: 84, bytesPerRow: 39}, {width: 19, height: 19, depthOrArrayLayers: 0});
} catch {}
let imageData7 = new ImageData(8, 24);
try {
computePassEncoder20.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(7, buffer33, 0, 1_969);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
buffer17.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture31,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(611).fill(85), /* required buffer size: 611 */
{offset: 611, bytesPerRow: 83}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let commandEncoder38 = device0.createCommandEncoder({});
let texture48 = device0.createTexture({
  size: [96, 456, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder13.setBindGroup(3, bindGroup4);
} catch {}
try {
computePassEncoder15.setBindGroup(0, bindGroup11, new Uint32Array(1262), 38, 0);
} catch {}
try {
computePassEncoder22.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer24, 'uint16', 172, 170);
} catch {}
try {
commandEncoder38.resolveQuerySet(querySet0, 8, 12, buffer19, 0);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(25).fill(96), /* required buffer size: 25 */
{offset: 25}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let pipelineLayout8 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout2]});
try {
computePassEncoder6.setBindGroup(1, bindGroup7, new Uint32Array(1541), 92, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder15); computePassEncoder15.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder26.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder6.setBlendConstant({ r: 916.4, g: 381.0, b: -343.0, a: 119.3, });
} catch {}
try {
renderPassEncoder4.setVertexBuffer(4, buffer21, 192, 670);
} catch {}
try {
buffer12.unmap();
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
let commandEncoder39 = device0.createCommandEncoder({});
try {
computePassEncoder0.setBindGroup(3, bindGroup6);
} catch {}
try {
computePassEncoder20.setBindGroup(3, bindGroup3, new Uint32Array(1427), 296, 0);
} catch {}
try {
computePassEncoder24.setPipeline(pipeline0);
} catch {}
try {
commandEncoder39.copyBufferToTexture({
  /* bytesInLastRow: 2 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 652 */
  offset: 652,
  bytesPerRow: 16128,
  rowsPerImage: 545,
  buffer: buffer23,
}, {
  texture: texture34,
  mipLevel: 1,
  origin: {x: 2, y: 6, z: 0},
  aspect: 'all',
}, {width: 2, height: 12, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder39.copyTextureToTexture({
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture25,
  mipLevel: 0,
  origin: {x: 1, y: 14, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder40 = device0.createCommandEncoder({label: '\ude6d\u{1fc04}'});
let textureView36 = texture23.createView({dimension: '2d', format: 'rgba16float', baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: 4});
let renderPassEncoder9 = commandEncoder39.beginRenderPass({
  label: '\ued23\u048f\uff41\u{1f886}\ua41c\ud86c\u5cff\u0b40\u{1fdc8}\u{1fe9a}',
  colorAttachments: [{view: textureView18, loadOp: 'clear', storeOp: 'store'}],
});
try {
computePassEncoder18.setBindGroup(1, bindGroup6, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder15); computePassEncoder15.dispatchWorkgroupsIndirect(buffer33, 216); };
} catch {}
try {
computePassEncoder27.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setBindGroup(2, bindGroup12);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup13, new Uint32Array(3989), 244, 0);
} catch {}
try {
renderPassEncoder4.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer20, 'uint32', 980, 7_818);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(5, buffer12, 0);
} catch {}
try {
commandEncoder40.resolveQuerySet(querySet2, 211, 29, buffer35, 256);
} catch {}
let sampler21 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 27.77,
  lodMaxClamp: 70.51,
});
try {
computePassEncoder9.setBindGroup(2, bindGroup6, new Uint32Array(2463), 188, 0);
} catch {}
try {
computePassEncoder23.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer19, 'uint32', 288, 843);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let renderPassEncoder10 = commandEncoder40.beginRenderPass({
  colorAttachments: [{
  view: textureView36,
  clearValue: { r: -674.4, g: -538.5, b: -812.5, a: 818.5, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder7.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder10.setIndexBuffer(buffer15, 'uint32', 188, 2_050);
} catch {}
try {
commandEncoder38.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 896 */
  offset: 896,
  bytesPerRow: 256,
  buffer: buffer35,
}, {
  texture: texture8,
  mipLevel: 1,
  origin: {x: 2, y: 8, z: 0},
  aspect: 'all',
}, {width: 0, height: 22, depthOrArrayLayers: 0});
} catch {}
let commandEncoder41 = device0.createCommandEncoder({});
try {
computePassEncoder25.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.beginOcclusionQuery(72);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer34, 'uint32', 860, 4_376);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let textureView37 = texture43.createView({dimension: 'cube', mipLevelCount: 1, baseArrayLayer: 1});
let computePassEncoder29 = commandEncoder38.beginComputePass({});
let renderPassEncoder11 = commandEncoder41.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: -976.3, g: -694.4, b: -689.7, a: 71.51, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler22 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 19.04,
  maxAnisotropy: 20,
});
try {
computePassEncoder26.setBindGroup(3, bindGroup9, new Uint32Array(609), 99, 0);
} catch {}
try {
computePassEncoder29.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer29, 'uint16', 340, 1_967);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise5;
} catch {}
let bindGroupLayout7 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 218,
      visibility: GPUShaderStage.COMPUTE,
      texture: { viewDimension: '2d', sampleType: 'float', multisampled: false },
    },
  ],
});
let buffer38 = device0.createBuffer({
  label: '\u089a\u80d5\u5a0e\u0b55\u0daf\ua9e2\u0e4e',
  size: 3254,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
});
try {
renderPassEncoder3.setBindGroup(1, bindGroup13);
} catch {}
try {
renderPassEncoder10.setBindGroup(1, bindGroup0, new Uint32Array(446), 34, 0);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
try {
  await promise6;
} catch {}
let bindGroup14 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [
    {binding: 78, resource: externalTexture1},
    {binding: 204, resource: {buffer: buffer17, offset: 1280, size: 3444}},
    {binding: 119, resource: {buffer: buffer2, offset: 1536, size: 2632}},
  ],
});
try {
computePassEncoder16.setBindGroup(2, bindGroup12);
} catch {}
try {
renderPassEncoder7.setViewport(0.33856950648373085, 0.2286052320017009, 0.7779620285457735, 0.2613912974799919, 0.7646739845021481, 0.9762464381372122);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(0, buffer12, 360, 450);
} catch {}
let arrayBuffer1 = buffer32.getMappedRange(288, 628);
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture47,
  mipLevel: 1,
  origin: {x: 59, y: 64, z: 9},
  aspect: 'all',
}, new Uint8Array(115_967).fill(82), /* required buffer size: 115_967 */
{offset: 260, bytesPerRow: 113, rowsPerImage: 351}, {width: 27, height: 322, depthOrArrayLayers: 3});
} catch {}
let bindGroup15 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer13, offset: 4608, size: 418}}],
});
let textureView38 = texture34.createView({aspect: 'all', mipLevelCount: 1});
try {
computePassEncoder7.setBindGroup(3, bindGroup15, new Uint32Array(700), 14, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder15); computePassEncoder15.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder9.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder7.executeBundles([renderBundle1, renderBundle0, renderBundle0, renderBundle0]);
} catch {}
try {
renderPassEncoder11.setViewport(0.9186925914892786, 0.5138089637115533, 0.007778193473987515, 0.4738591642317467, 0.848935947747906, 0.9547329801423309);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture45,
  mipLevel: 0,
  origin: {x: 34, y: 11, z: 0},
  aspect: 'all',
}, new Uint8Array(209_257).fill(116), /* required buffer size: 209_257 */
{offset: 138, bytesPerRow: 157, rowsPerImage: 172}, {width: 19, height: 128, depthOrArrayLayers: 8});
} catch {}
let pipelineLayout9 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder42 = device0.createCommandEncoder({});
let renderPassEncoder12 = commandEncoder42.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: -949.7, g: 519.1, b: 136.4, a: 928.7, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 144459544,
});
try {
computePassEncoder21.setBindGroup(1, bindGroup9);
} catch {}
try {
computePassEncoder21.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(0, buffer2, 0, 11_128);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let textureView39 = texture38.createView({label: '\uf07f\u095e\u3231\u{1f869}\u8cd1\u{1fe58}', mipLevelCount: 1});
try {
computePassEncoder1.setBindGroup(0, bindGroup14);
} catch {}
try {
computePassEncoder9.setBindGroup(0, bindGroup11, new Uint32Array(340), 120, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture45,
  mipLevel: 0,
  origin: {x: 10, y: 64, z: 0},
  aspect: 'all',
}, new Uint8Array(26_576).fill(157), /* required buffer size: 26_576 */
{offset: 396, bytesPerRow: 174}, {width: 10, height: 151, depthOrArrayLayers: 1});
} catch {}
let commandEncoder43 = device0.createCommandEncoder({});
let textureView40 = texture33.createView({mipLevelCount: 1});
let computePassEncoder30 = commandEncoder43.beginComputePass({});
try {
renderPassEncoder4.setIndexBuffer(buffer37, 'uint32', 320, 952);
} catch {}
let bindGroupLayout8 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 506,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba32uint', access: 'write-only', viewDimension: '2d' },
    },
    {
      binding: 182,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'sint', multisampled: false },
    },
  ],
});
let texture49 = device0.createTexture({
  size: {width: 1, height: 1, depthOrArrayLayers: 21},
  sampleCount: 1,
  format: 'rgba32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler23 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 5.823,
  lodMaxClamp: 68.64,
});
try {
renderPassEncoder7.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup5, new Uint32Array(6210), 1_262, 0);
} catch {}
try {
renderPassEncoder4.endOcclusionQuery();
} catch {}
try {
renderPassEncoder8.setVertexBuffer(5, buffer9);
} catch {}
let textureView41 = texture49.createView({dimension: '2d', aspect: 'all', baseArrayLayer: 3});
let textureView42 = texture31.createView({});
try {
computePassEncoder0.setBindGroup(1, bindGroup0, new Uint32Array(5288), 37, 0);
} catch {}
try {
computePassEncoder30.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setVertexBuffer(4_294_967_295, undefined, 0, 345_971_755);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture38,
  mipLevel: 1,
  origin: {x: 0, y: 1, z: 6},
  aspect: 'all',
}, new Uint8Array(64).fill(209), /* required buffer size: 64 */
{offset: 64, bytesPerRow: 35}, {width: 7, height: 78, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout9 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 22,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
  ],
});
let buffer39 = device0.createBuffer({size: 8022, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder44 = device0.createCommandEncoder({});
let texture50 = device0.createTexture({
  size: {width: 1},
  dimension: '1d',
  format: 'rgba32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView43 = texture10.createView({});
let computePassEncoder31 = commandEncoder44.beginComputePass({label: '\u{1fe0c}\u4313\u8dbe\u92a6\u26e1\u0a83\u0006'});
try {
adapter0.label = '\u{1f646}\u{1fec6}\u{1f787}\u01c8\u2d2c\uc4d7\u0220\ud793\u08ad\u0559\ua7b5';
} catch {}
let textureView44 = texture12.createView({baseMipLevel: 0});
let sampler24 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 44.29,
  lodMaxClamp: 94.22,
  maxAnisotropy: 18,
});
try {
computePassEncoder31.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.beginOcclusionQuery(131);
} catch {}
try {
device0.queue.writeBuffer(buffer35, 940, new Int16Array(21862), 362, 660);
} catch {}
let textureView45 = texture42.createView({format: 'r32sint', mipLevelCount: 1});
let sampler25 = device0.createSampler({addressModeW: 'repeat', magFilter: 'nearest', minFilter: 'nearest', lodMaxClamp: 58.56});
try {
renderPassEncoder10.setBindGroup(3, bindGroup14);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer37, 'uint32', 412, 2_318);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(7, buffer35, 200, 1_964);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture5,
  mipLevel: 1,
  origin: {x: 0, y: 21, z: 0},
  aspect: 'all',
}, new Uint8Array(64).fill(226), /* required buffer size: 64 */
{offset: 64, bytesPerRow: 73, rowsPerImage: 10}, {width: 13, height: 8, depthOrArrayLayers: 0});
} catch {}
let videoFrame4 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt470bg', primaries: 'jedecP22Phosphors', transfer: 'bt2020_12bit'} });
let commandEncoder45 = device0.createCommandEncoder({});
let computePassEncoder32 = commandEncoder45.beginComputePass({label: '\ue0d0\u{1ffa8}\u00e7\u078f\u{1fcfb}\u0bf2\u0bd7\u3772'});
let sampler26 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 52.15,
  lodMaxClamp: 79.70,
});
try {
renderPassEncoder11.executeBundles([renderBundle2, renderBundle0, renderBundle2, renderBundle0, renderBundle0, renderBundle0]);
} catch {}
try {
renderPassEncoder10.setIndexBuffer(buffer19, 'uint16', 2_074, 157);
} catch {}
try {
buffer12.unmap();
} catch {}
let commandEncoder46 = device0.createCommandEncoder({});
let computePassEncoder33 = commandEncoder46.beginComputePass({});
let sampler27 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 93.65,
  lodMaxClamp: 97.91,
});
try {
computePassEncoder33.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setBindGroup(2, bindGroup10);
} catch {}
let videoFrame5 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'unspecified', primaries: 'film', transfer: 'logSqrt'} });
try {
computePassEncoder32.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder5.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer20, 'uint32', 4_636, 5_083);
} catch {}
try {
globalThis.someLabel = sampler27.label;
} catch {}
let commandEncoder47 = device0.createCommandEncoder({});
let computePassEncoder34 = commandEncoder47.beginComputePass({});
try {
computePassEncoder10.setBindGroup(0, bindGroup14, new Uint32Array(5171), 554, 0);
} catch {}
try {
computePassEncoder15.end();
} catch {}
try {
computePassEncoder34.setPipeline(pipeline0);
} catch {}
let bindGroup16 = device0.createBindGroup({
  label: '\u{1ff06}\uc964\u1a13\u0be6\ue6c7\u1909\u0db6\u6f5c',
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView25}, {binding: 177, resource: textureView4}],
});
let buffer40 = device0.createBuffer({
  size: 11958,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder48 = device0.createCommandEncoder({});
let texture51 = device0.createTexture({
  size: {width: 1},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder35 = commandEncoder48.beginComputePass({label: '\u{1fc96}\u2888\u{1ff36}\u042d\u10f6\u8979\u{1fa87}\uc73b\ufee3\u{1fa24}\uc086'});
let renderBundleEncoder5 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], stencilReadOnly: true});
let renderBundle5 = renderBundleEncoder5.finish({label: '\u045b\u0417\u006f\u02ce\u02e8\u8692\u02b0\u{1fad4}\u40b4\u2ba0\u0b5a'});
let sampler28 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 59.95,
  lodMaxClamp: 88.68,
});
try {
computePassEncoder9.setBindGroup(3, bindGroup1, new Uint32Array(635), 58, 0);
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer36, 'uint16', 10, 78);
} catch {}
try {
commandEncoder16.copyTextureToBuffer({
  texture: texture7,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 56 widthInBlocks: 14 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1328 */
  offset: 1328,
  bytesPerRow: 18688,
  buffer: buffer26,
}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let videoFrame6 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'rgb', primaries: 'smpteSt4281', transfer: 'pq'} });
let sampler29 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 65.26,
  lodMaxClamp: 72.08,
  compare: 'greater-equal',
  maxAnisotropy: 3,
});
try {
renderPassEncoder6.setBindGroup(2, bindGroup15, new Uint32Array(1614), 15, 0);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle0]);
} catch {}
try {
renderPassEncoder9.setIndexBuffer(buffer37, 'uint16', 1_064, 1_990);
} catch {}
try {
commandEncoder16.copyTextureToBuffer({
  texture: texture14,
  mipLevel: 0,
  origin: {x: 170, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 448 widthInBlocks: 28 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 944 */
  offset: 944,
  bytesPerRow: 4608,
  buffer: buffer1,
}, {width: 280, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let imageData8 = new ImageData(68, 12);
let commandEncoder49 = device0.createCommandEncoder({});
let texture52 = device0.createTexture({
  label: '\u9883\u80a8',
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView46 = texture28.createView({});
try {
computePassEncoder35.setPipeline(pipeline0);
} catch {}
let bindGroup17 = device0.createBindGroup({
  label: '\uac73\u022b\u3b23',
  layout: bindGroupLayout8,
  entries: [{binding: 506, resource: textureView41}, {binding: 182, resource: textureView23}],
});
let buffer41 = device0.createBuffer({size: 6629, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: false});
let textureView47 = texture52.createView({});
let computePassEncoder36 = commandEncoder49.beginComputePass();
let renderPassEncoder13 = commandEncoder16.beginRenderPass({
  colorAttachments: [{
  view: textureView30,
  clearValue: { r: -266.5, g: -845.3, b: 730.1, a: 290.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 28686035,
});
try {
computePassEncoder7.setBindGroup(1, bindGroup2);
} catch {}
try {
computePassEncoder21.setBindGroup(0, bindGroup10, new Uint32Array(441), 6, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder9); computePassEncoder9.dispatchWorkgroups(1); };
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let textureView48 = texture2.createView({});
let sampler30 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 94.94,
  lodMaxClamp: 96.40,
});
try {
computePassEncoder16.setBindGroup(2, bindGroup6, new Uint32Array(271), 15, 0);
} catch {}
try {
computePassEncoder36.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.setBindGroup(1, bindGroup15, new Uint32Array(2815), 437, 0);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(1, buffer40);
} catch {}
try {
buffer1.unmap();
} catch {}
let commandEncoder50 = device0.createCommandEncoder({});
let texture53 = device0.createTexture({
  size: [192],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView49 = texture7.createView({mipLevelCount: 1});
let sampler31 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 44.00,
  lodMaxClamp: 45.84,
});
try {
computePassEncoder26.setBindGroup(0, bindGroup10, []);
} catch {}
try {
computePassEncoder9.end();
} catch {}
try {
renderPassEncoder12.setBindGroup(0, bindGroup4);
} catch {}
try {
renderPassEncoder8.setVertexBuffer(0, buffer21);
} catch {}
try {
commandEncoder11.copyBufferToBuffer(buffer23, 2720, buffer40, 5940, 400);
} catch {}
let buffer42 = device0.createBuffer({
  size: 3019,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let computePassEncoder37 = commandEncoder50.beginComputePass({});
let renderPassEncoder14 = commandEncoder11.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: 328.5, g: 440.0, b: -554.7, a: 977.8, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet1,
});
let sampler32 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  lodMinClamp: 43.18,
  lodMaxClamp: 86.07,
});
try {
computePassEncoder30.setBindGroup(3, bindGroup3);
} catch {}
try {
computePassEncoder37.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder9.setBindGroup(1, bindGroup12);
} catch {}
let promise7 = device0.queue.onSubmittedWorkDone();
let texture54 = device0.createTexture({
  label: '\u0eb7\uf3de\ubc24\u3934\u{1ff74}\u0be3\ue6ee\ud21d\u98ad',
  size: [256, 256, 17],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView50 = texture8.createView({mipLevelCount: 1});
try {
renderPassEncoder6.setBindGroup(3, bindGroup11);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer24, 'uint32', 116, 362);
} catch {}
let promise8 = device0.queue.onSubmittedWorkDone();
let buffer43 = device0.createBuffer({
  size: 21260,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder51 = device0.createCommandEncoder({});
let textureView51 = texture31.createView({});
let computePassEncoder38 = commandEncoder51.beginComputePass();
try {
renderPassEncoder11.setBindGroup(1, bindGroup4);
} catch {}
try {
renderPassEncoder4.endOcclusionQuery();
} catch {}
try {
renderPassEncoder2.setVertexBuffer(5, buffer21, 0);
} catch {}
let imageData9 = new ImageData(4, 4);
let videoFrame7 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRA',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'smpte170m', primaries: 'jedecP22Phosphors', transfer: 'smpteSt4281'} });
let bindGroup18 = device0.createBindGroup({
  label: '\u5a35\u5be8\u510c\u08ae\u0c7d\ua32d\u1399\u0602',
  layout: bindGroupLayout5,
  entries: [
    {binding: 138, resource: textureView38},
    {binding: 13, resource: {buffer: buffer42, offset: 1280, size: 216}},
  ],
});
let textureView52 = texture38.createView({mipLevelCount: 1});
try {
renderPassEncoder0.setBindGroup(3, bindGroup0);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let sampler33 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 17.11,
  maxAnisotropy: 15,
});
try {
computePassEncoder26.setBindGroup(0, bindGroup14);
} catch {}
try {
computePassEncoder38.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(1, bindGroup9, new Uint32Array(403), 11, 0);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer37, 'uint32', 24, 3_244);
} catch {}
try {
  await promise7;
} catch {}
let buffer44 = device0.createBuffer({
  size: 44390,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder52 = device0.createCommandEncoder({});
let computePassEncoder39 = commandEncoder52.beginComputePass();
let sampler34 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 8.309,
  lodMaxClamp: 94.09,
  maxAnisotropy: 2,
});
let externalTexture3 = device0.importExternalTexture({
  label: '\u0e42\u0a6a\ub8e4\u{1fd50}\u016b\u7396\u7f33\u{1fc7c}\u8634\u073e\ua309',
  source: videoFrame1,
});
try {
computePassEncoder22.setBindGroup(0, bindGroup6, []);
} catch {}
try {
renderPassEncoder6.setBindGroup(1, bindGroup4);
} catch {}
try {
renderPassEncoder10.setIndexBuffer(buffer29, 'uint32', 228, 231);
} catch {}
try {
buffer15.unmap();
} catch {}
try {
computePassEncoder27.insertDebugMarker('\u0686');
} catch {}
let commandEncoder53 = device0.createCommandEncoder({});
let renderPassEncoder15 = commandEncoder53.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 36.60, g: -867.9, b: -36.40, a: -293.6, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler35 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 84.84,
  compare: 'less',
});
let commandEncoder54 = device0.createCommandEncoder();
let textureView53 = texture20.createView({});
let computePassEncoder40 = commandEncoder54.beginComputePass({});
let renderBundleEncoder6 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], depthReadOnly: true, stencilReadOnly: true});
let sampler36 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  mipmapFilter: 'nearest',
  lodMinClamp: 44.17,
  lodMaxClamp: 76.12,
});
try {
computePassEncoder39.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder6.setIndexBuffer(buffer34, 'uint16', 1_666, 294);
} catch {}
try {
computePassEncoder11.label = '\u0c82\u{1f656}\u07f1\u{1fb80}\u40ba\u{1ff14}\u6cc1';
} catch {}
let bindGroup19 = device0.createBindGroup({
  label: '\u41c1\u4f71\u{1f78e}\u01c4\ud217\ud6ab\uda28\u70dd',
  layout: bindGroupLayout7,
  entries: [{binding: 218, resource: textureView25}],
});
let texture55 = gpuCanvasContext2.getCurrentTexture();
let textureView54 = texture27.createView({dimension: '2d', format: 'rgba16float', arrayLayerCount: 1});
try {
computePassEncoder40.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder7.setIndexBuffer(buffer12, 'uint16', 808, 1_313);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(1, buffer18, 0);
} catch {}
try {
buffer15.unmap();
} catch {}
let bindGroup20 = device0.createBindGroup({
  label: '\u5165\u{1f8ca}\uab8b\u{1fa4d}\u1be7\u6051',
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer16, offset: 0, size: 2099}}],
});
let pipelineLayout10 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout0]});
let buffer45 = device0.createBuffer({
  label: '\u1d80\u{1f8e9}\u0de0\u1db2\u0b7b\u{1f98e}\u2426\u{1ff45}',
  size: 7889,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
try {
renderPassEncoder6.executeBundles([renderBundle1, renderBundle1]);
} catch {}
try {
renderBundleEncoder6.setBindGroup(1, bindGroup1);
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
offscreenCanvas2.width = 103;
let buffer46 = device0.createBuffer({size: 19807, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder55 = device0.createCommandEncoder({label: '\u{1f6b8}\u{1f901}\u0fd7\u249b\u0c34\u094f\u009b\u788c'});
let texture56 = device0.createTexture({
  size: [96, 456, 211],
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder41 = commandEncoder55.beginComputePass();
try {
renderPassEncoder13.setBindGroup(2, bindGroup19);
} catch {}
try {
renderBundleEncoder6.setBindGroup(2, bindGroup4, new Uint32Array(2243), 273, 0);
} catch {}
try {
device0.queue.writeBuffer(buffer2, 1776, new Float32Array(7220), 632, 4);
} catch {}
let commandEncoder56 = device0.createCommandEncoder({});
let renderBundle6 = renderBundleEncoder6.finish();
try {
computePassEncoder18.setBindGroup(2, bindGroup7);
} catch {}
try {
computePassEncoder26.setBindGroup(2, bindGroup16, new Uint32Array(2024), 23, 0);
} catch {}
try {
computePassEncoder41.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setBindGroup(0, bindGroup5);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer40, 'uint16', 254, 578);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(6, buffer42, 820, 914);
} catch {}
try {
commandEncoder56.copyBufferToTexture({
  /* bytesInLastRow: 504 widthInBlocks: 63 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1568 */
  offset: 1568,
  bytesPerRow: 8960,
  buffer: buffer35,
}, {
  texture: texture45,
  mipLevel: 0,
  origin: {x: 5, y: 54, z: 2},
  aspect: 'all',
}, {width: 63, height: 36, depthOrArrayLayers: 0});
} catch {}
let commandEncoder57 = device0.createCommandEncoder({});
let texture57 = device0.createTexture({
  size: [96, 456, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder24.setBindGroup(2, bindGroup20, new Uint32Array(5354), 117, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder26); computePassEncoder26.dispatchWorkgroups(1, 2, 1); };
} catch {}
try {
renderPassEncoder2.setBindGroup(3, bindGroup17, new Uint32Array(928), 16, 0);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer20, 'uint16', 1_940, 1_425);
} catch {}
try {
device0.queue.writeBuffer(buffer16, 204, new BigUint64Array(6284), 3609, 44);
} catch {}
let bindGroup21 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 126, resource: textureView27}, {binding: 67, resource: sampler30}],
});
let textureView55 = texture49.createView({dimension: '2d', baseArrayLayer: 4});
let texture58 = device0.createTexture({size: {width: 8}, dimension: '1d', format: 'rgba16float', usage: GPUTextureUsage.COPY_SRC});
let computePassEncoder42 = commandEncoder56.beginComputePass({});
try {
computePassEncoder31.setBindGroup(3, bindGroup20, new Uint32Array(2986), 79, 0);
} catch {}
try {
renderPassEncoder1.setBindGroup(1, bindGroup15);
} catch {}
try {
commandEncoder57.resolveQuerySet(querySet2, 154, 201, buffer12, 256);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
computePassEncoder42.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder15.setBindGroup(0, bindGroup17, new Uint32Array(1388), 26, 0);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(2, buffer45);
} catch {}
try {
  await shaderModule0.getCompilationInfo();
} catch {}
try {
commandEncoder57.copyBufferToTexture({
  /* bytesInLastRow: 32 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 640 */
  offset: 640,
  bytesPerRow: 42496,
  buffer: buffer42,
}, {
  texture: texture46,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder30.setBindGroup(0, bindGroup10);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder1); computePassEncoder1.dispatchWorkgroupsIndirect(buffer36, 32); };
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer37, 'uint32', 3_796, 307);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
try {
device0.queue.writeBuffer(buffer35, 440, new DataView(new ArrayBuffer(5611)), 193, 356);
} catch {}
let texture59 = gpuCanvasContext1.getCurrentTexture();
let computePassEncoder43 = commandEncoder57.beginComputePass({});
let sampler37 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 76.74,
  lodMaxClamp: 94.26,
  compare: 'always',
});
try {
computePassEncoder7.setBindGroup(2, bindGroup3, new Uint32Array(2010), 189, 0);
} catch {}
try {
renderPassEncoder7.executeBundles([renderBundle2]);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: videoFrame5,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture45,
  mipLevel: 0,
  origin: {x: 38, y: 1, z: 2},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder58 = device0.createCommandEncoder({});
let computePassEncoder44 = commandEncoder58.beginComputePass({});
try {
computePassEncoder40.setBindGroup(1, bindGroup2, []);
} catch {}
try {
computePassEncoder43.setBindGroup(3, bindGroup1, new Uint32Array(2473), 420, 0);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(6, buffer15, 2_348);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture27,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(20).fill(159), /* required buffer size: 20 */
{offset: 20}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer47 = device0.createBuffer({
  size: 41938,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let renderBundleEncoder7 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], stencilReadOnly: true});
try {
computePassEncoder44.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup10, new Uint32Array(2493), 284, 0);
} catch {}
try {
renderPassEncoder6.setScissorRect(1, 0, 0, 0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer9, 'uint32', 4, 561);
} catch {}
try {
device0.queue.writeBuffer(buffer41, 1288, new DataView(new ArrayBuffer(55686)), 3225, 264);
} catch {}
let pipeline1 = device0.createComputePipeline({
  layout: pipelineLayout10,
  compute: {module: shaderModule2, entryPoint: 'compute2', constants: {31_102: 0}},
});
try {
computePassEncoder43.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder14.beginOcclusionQuery(57);
} catch {}
try {
renderPassEncoder14.endOcclusionQuery();
} catch {}
try {
renderPassEncoder7.setViewport(0.34108510118000623, 0.050542871644330356, 1.267731123449632, 0.7938197075734088, 0.6015398284950983, 0.8380195645251681);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer0, 'uint16', 3_902, 1_067);
} catch {}
let promise9 = device0.queue.onSubmittedWorkDone();
let imageData10 = new ImageData(20, 4);
let buffer48 = device0.createBuffer({
  size: 10991,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let sampler38 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 75.07,
  lodMaxClamp: 90.57,
  maxAnisotropy: 12,
});
try {
computePassEncoder8.setBindGroup(3, bindGroup6, new Uint32Array(1476), 1_082, 0);
} catch {}
try {
computePassEncoder1.end();
} catch {}
try {
renderBundleEncoder7.setBindGroup(2, bindGroup9, new Uint32Array(4390), 1_983, 0);
} catch {}
try {
renderBundleEncoder7.setIndexBuffer(buffer9, 'uint32', 156, 686);
} catch {}
try {
commandEncoder1.clearBuffer(buffer34, 1068, 1216);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas1,
  origin: { x: 3, y: 0 },
  flipY: true,
}, {
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout10 = device0.createBindGroupLayout({
  label: '\u071c\u6697\ua4a2\u1411\u{1f9a0}',
  entries: [
    {
      binding: 2,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32uint', access: 'read-write', viewDimension: '2d' },
    },
  ],
});
let bindGroup22 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView25}, {binding: 177, resource: textureView44}],
});
let texture60 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 9},
  sampleCount: 1,
  format: 'r32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderPassEncoder16 = commandEncoder1.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -35.17, g: -976.9, b: -790.7, a: -217.5, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundle7 = renderBundleEncoder7.finish();
try {
computePassEncoder40.setBindGroup(0, bindGroup14);
} catch {}
try {
renderPassEncoder8.setBindGroup(2, bindGroup13);
} catch {}
try {
buffer47.unmap();
} catch {}
let videoFrame8 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt709', primaries: 'unspecified', transfer: 'iec61966-2-1'} });
let buffer49 = device0.createBuffer({size: 763, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let textureView56 = texture60.createView({dimension: '2d', format: 'r32uint', baseArrayLayer: 2});
try {
renderPassEncoder6.executeBundles([renderBundle2, renderBundle0, renderBundle7, renderBundle1, renderBundle2, renderBundle2, renderBundle0, renderBundle7, renderBundle1, renderBundle1]);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(4, buffer15);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture42,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(358).fill(19), /* required buffer size: 358 */
{offset: 358, rowsPerImage: 24}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup23 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 2, resource: textureView56}]});
let pipelineLayout11 = device0.createPipelineLayout({label: '\u{1f9a3}\u0602\u0978\u7592\u0e2d\u0958\u0ef3', bindGroupLayouts: []});
let buffer50 = device0.createBuffer({
  label: '\u{1f8d8}\ue44b\u{1fae1}\u6567\u03d6\ud3a1\u0732',
  size: 5342,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE,
});
let texture61 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 30},
  mipLevelCount: 1,
  format: 'r32uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture62 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 16},
  dimension: '2d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView57 = texture32.createView({mipLevelCount: 1});
try {
renderPassEncoder15.setBindGroup(3, bindGroup13);
} catch {}
try {
renderPassEncoder4.beginOcclusionQuery(22);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
let bindGroupLayout11 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 31,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: 'cube-array', sampleType: 'uint', multisampled: false },
    },
  ],
});
let commandEncoder59 = device0.createCommandEncoder({});
let texture63 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'depth24plus-stencil8',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture64 = device0.createTexture({
  size: [4, 1, 1],
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView58 = texture40.createView({dimension: '2d-array'});
let sampler39 = device0.createSampler({
  label: '\u{1fd81}\u{1f8a4}\u0476\u0265\u01cd\u06c1\u6c7e\ue0cb\u37e1\uec1f',
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 94.62,
  lodMaxClamp: 95.50,
  compare: 'never',
});
try {
computePassEncoder13.setBindGroup(0, bindGroup12, new Uint32Array(2461), 17, 0);
} catch {}
try {
renderPassEncoder2.executeBundles([renderBundle7, renderBundle7]);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer0, 'uint16', 3_996, 206);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(2, buffer47, 1_596);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture62,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 4},
  aspect: 'all',
}, new Uint8Array(128_005).fill(227), /* required buffer size: 128_005 */
{offset: 133, bytesPerRow: 288, rowsPerImage: 222}, {width: 0, height: 0, depthOrArrayLayers: 3});
} catch {}
let texture65 = device0.createTexture({
  label: '\u047c\u2114\u7fdb\ua9ac\u{1f7e4}\u{1f9b1}\u0044\u006b\uc993\u{1f979}\u{1f81d}',
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  sampleCount: 1,
  format: 'rg8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView59 = texture20.createView({});
let renderPassEncoder17 = commandEncoder59.beginRenderPass({
  colorAttachments: [{
  view: textureView57,
  depthSlice: 225,
  clearValue: { r: -396.0, g: -581.5, b: -211.9, a: -796.1, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
let sampler40 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMaxClamp: 98.04,
  maxAnisotropy: 1,
});
try {
renderPassEncoder14.beginOcclusionQuery(278);
} catch {}
try {
renderPassEncoder13.setVertexBuffer(2, buffer9, 468, 152);
} catch {}
let commandEncoder60 = device0.createCommandEncoder({});
let querySet3 = device0.createQuerySet({type: 'occlusion', count: 675});
let texture66 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  format: 'rg32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture67 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  format: 'rg32sint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder45 = commandEncoder60.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder10); computePassEncoder10.dispatchWorkgroupsIndirect(buffer19, 696); };
} catch {}
try {
computePassEncoder45.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(3, buffer18, 0, 1_368);
} catch {}
let texture68 = device0.createTexture({
  size: [256, 256, 17],
  sampleCount: 1,
  format: 'rgba16uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture69 = device0.createTexture({
  size: [48, 228, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
let textureView60 = texture64.createView({format: 'rgba16float', mipLevelCount: 1, baseArrayLayer: 0});
try {
computePassEncoder32.setBindGroup(3, bindGroup19, new Uint32Array(4427), 1_094, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer20, 8_104); };
} catch {}
try {
renderPassEncoder13.setBindGroup(2, bindGroup14, new Uint32Array(1173), 198, 0);
} catch {}
let bindGroup24 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 13, resource: {buffer: buffer30, offset: 0, size: 760}},
    {binding: 138, resource: textureView38},
  ],
});
let commandEncoder61 = device0.createCommandEncoder();
let textureView61 = texture61.createView({dimension: '2d', baseArrayLayer: 8});
let textureView62 = texture7.createView({label: '\u329b\u08b3\u{1ff58}\u0527\ua94f'});
try {
computePassEncoder24.setBindGroup(1, bindGroup12);
} catch {}
try {
computePassEncoder24.setBindGroup(1, bindGroup4, new Uint32Array(26), 0, 0);
} catch {}
try {
renderPassEncoder16.setBindGroup(1, bindGroup17);
} catch {}
try {
buffer35.unmap();
} catch {}
try {
commandEncoder61.copyBufferToTexture({
  /* bytesInLastRow: 21 widthInBlocks: 21 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 3254 */
  offset: 3254,
  bytesPerRow: 6912,
  buffer: buffer23,
}, {
  texture: texture34,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 21, height: 16, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout12 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 76,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'uint', multisampled: false },
    },
  ],
});
let commandEncoder62 = device0.createCommandEncoder({});
let textureView63 = texture68.createView({dimension: 'cube-array', baseArrayLayer: 4, arrayLayerCount: 6});
let textureView64 = texture27.createView({arrayLayerCount: 1});
try {
computePassEncoder36.setBindGroup(0, bindGroup23);
} catch {}
try {
computePassEncoder26.end();
} catch {}
let buffer51 = device0.createBuffer({size: 16879, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let textureView65 = texture68.createView({dimension: 'cube-array', baseMipLevel: 0, arrayLayerCount: 12});
let texture70 = device0.createTexture({
  label: '\u6487\u0a01\u{1fa49}\ue756\u68ca\uad1b\ud756\u{1fd6c}\ue4cb',
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
let computePassEncoder46 = commandEncoder36.beginComputePass({});
let renderPassEncoder18 = commandEncoder61.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: 921.2, g: -330.1, b: -353.9, a: 186.8, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet2,
});
let sampler41 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 57.90,
});
try {
computePassEncoder35.setBindGroup(2, bindGroup1, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroups(1, 1, 1); };
} catch {}
try {
renderPassEncoder13.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder14.setViewport(37.510519682741474, 63.36318545926361, 1.3660721329698413, 24.803136277890008, 0.7918520809417453, 0.7942230285866074);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer15, 'uint32', 80, 1_283);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(4, buffer47, 276, 5_397);
} catch {}
try {
commandEncoder62.copyBufferToTexture({
  /* bytesInLastRow: 84 widthInBlocks: 21 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1508 */
  offset: 1508,
  bytesPerRow: 81408,
  buffer: buffer37,
}, {
  texture: texture52,
  mipLevel: 0,
  origin: {x: 16, y: 63, z: 0},
  aspect: 'all',
}, {width: 21, height: 49, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder62.resolveQuerySet(querySet0, 6, 9, buffer13, 512);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture13,
  mipLevel: 0,
  origin: {x: 7, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(142).fill(222), /* required buffer size: 142 */
{offset: 142}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let img0 = await imageWithData(22, 65, '#10101010', '#20202020');
let pipelineLayout12 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer52 = device0.createBuffer({
  size: 1203,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let textureView66 = texture16.createView({});
try {
computePassEncoder20.setBindGroup(0, bindGroup14, new Uint32Array(6), 0, 0);
} catch {}
try {
renderPassEncoder2.setBindGroup(3, bindGroup19, new Uint32Array(1382), 7, 0);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
let commandEncoder63 = device0.createCommandEncoder();
let renderPassEncoder19 = commandEncoder63.beginRenderPass({
  label: '\u0e9a\u0246\u58fd\u0a27\u{1f7e7}',
  colorAttachments: [{
  view: textureView46,
  depthSlice: 4,
  clearValue: { r: -333.6, g: -207.3, b: -403.0, a: -7.010, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let sampler42 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 55.85,
  lodMaxClamp: 61.89,
});
try {
computePassEncoder37.setBindGroup(0, bindGroup17);
} catch {}
try {
computePassEncoder46.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder7.setBindGroup(2, bindGroup19);
} catch {}
try {
renderPassEncoder7.executeBundles([renderBundle7]);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer19, 'uint32', 976, 2_357);
} catch {}
try {
device0.queue.writeBuffer(buffer15, 864, new BigUint64Array(28369), 3008, 64);
} catch {}
let buffer53 = device0.createBuffer({
  size: 26512,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let commandEncoder64 = device0.createCommandEncoder({});
let texture71 = device0.createTexture({
  size: [1, 1, 9],
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let computePassEncoder47 = commandEncoder64.beginComputePass({});
let sampler43 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 80.61,
  lodMaxClamp: 95.14,
  compare: 'never',
});
try {
computePassEncoder30.setBindGroup(2, bindGroup23);
} catch {}
try {
computePassEncoder47.setPipeline(pipeline0);
} catch {}
let arrayBuffer2 = buffer32.getMappedRange(16, 48);
try {
commandEncoder62.copyBufferToTexture({
  /* bytesInLastRow: 56 widthInBlocks: 14 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 5768 */
  offset: 5768,
  bytesPerRow: 8192,
  buffer: buffer33,
}, {
  texture: texture69,
  mipLevel: 0,
  origin: {x: 4, y: 3, z: 0},
  aspect: 'all',
}, {width: 14, height: 22, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer15, 3984, new BigUint64Array(12168), 150, 0);
} catch {}
document.body.append(img0);
let bindGroup25 = device0.createBindGroup({layout: bindGroupLayout4, entries: [{binding: 175, resource: textureView9}]});
let computePassEncoder48 = commandEncoder62.beginComputePass({});
try {
computePassEncoder36.setBindGroup(2, bindGroup20, new Uint32Array(351), 62, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder48.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder15.setBindGroup(2, bindGroup21, new Uint32Array(2285), 28, 0);
} catch {}
try {
renderPassEncoder4.endOcclusionQuery();
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
let bindGroupLayout13 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 135,
      visibility: GPUShaderStage.VERTEX,
      storageTexture: { format: 'rgba16sint', access: 'read-only', viewDimension: '2d-array' },
    },
    {
      binding: 457,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'write-only', viewDimension: '3d' },
    },
  ],
});
let texture72 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 275},
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler44 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 1.867,
  lodMaxClamp: 88.11,
});
try {
computePassEncoder19.setBindGroup(1, bindGroup9, new Uint32Array(2310), 710, 0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer34, 'uint32', 72, 25);
} catch {}
try {
device0.queue.writeBuffer(buffer50, 2008, new DataView(new ArrayBuffer(8470)), 5001, 128);
} catch {}
let shaderModule4 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

requires readonly_and_readwrite_storage_textures;

enable f16;

@group(0) @binding(78) var et3: texture_external;

var<workgroup> vw10: mat3x3h;

fn unconst_u32(v: u32) -> u32 { return v; }

struct S2 {
  @location(6) f0: vec2u,
}

fn fn1() -> array<array<array<mat2x2h, 1>, 2>, 13> {
  var out: array<array<array<mat2x2h, 1>, 2>, 13>;
  let ptr68: ptr<storage, array<f16, 1>, read> = &buffer55[1][0][0][4][0];
  return out;
}

@group(0) @binding(204) var<storage, read> buffer55: array<array<array<array<array<array<f16, 1>, 1>, 5>, 1>, 1>, 2>;

struct T3 {
  @align(2) @size(52) f0: array<u32>,
}

struct T2 {
  f0: array<array<f32, 1>, 1>,
}

struct T1 {
  @align(2) @size(20) f0: array<u32>,
}

fn unconst_i32(v: i32) -> i32 { return v; }

alias vec3b = vec3<bool>;

struct S1 {
  @builtin(instance_index) f0: u32,
  @location(0) @interpolate(flat) f1: vec2i,
}

fn unconst_f16(v: f16) -> f16 { return v; }

var<private> vp6 = array(frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()));

fn unconst_f32(v: f32) -> f32 { return v; }

@group(0) @binding(119) var<storage, read_write> buffer54: array<array<array<array<array<array<array<f16, 25>, 1>, 1>, 1>, 1>, 1>>;

fn fn0() -> S2 {
  var out: S2;
  let ptr62: ptr<storage, array<array<array<array<array<f16, 1>, 1>, 5>, 1>, 1>, read> = &(*&buffer55)[u32(buffer55[1][0][0][4][0][0])];
  vp6[u32(unconst_u32(78))].exp *= vp6[u32(buffer55[1][0][0][4][0][0])].exp;
  buffer54[u32(unconst_u32(518))][u32(unconst_u32(64))][u32(unconst_u32(75))][u32(unconst_u32(25))][u32(unconst_u32(48))][u32(unconst_u32(75))][24] += sign(buffer55[1][0][0][4][0][0]);
  let ptr63: ptr<storage, array<array<array<f16, 1>, 1>, 5>, read> = &(*&buffer55)[1][0][0];
  let ptr64: ptr<storage, array<array<array<array<array<f16, 1>, 1>, 5>, 1>, 1>, read> = &buffer55[1];
  let ptr65: ptr<storage, array<f16, 1>, read> = &(*ptr64)[0][0][4][0];
  let ptr66 = &vp6;
  var vf60: f16 = sign(f16(unconst_f16(278.5)));
  buffer54[u32((*ptr62)[0][0][4][0][0])][u32((*&buffer55)[1][0][0][4][0][u32(unconst_u32(438))])][u32((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24])][u32(unconst_u32(0))][u32(unconst_u32(19))][u32(unconst_u32(60))][u32(buffer55[1][0][pack4x8unorm(acos(vec4f(f32((*ptr64)[u32((*&buffer55)[1][0][0][4][0][0])][0][4][0][0]))))][4][0][0])] *= (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24];
  vf60 = (*ptr62)[u32(unconst_u32(270))][0][4][0][0];
  vf60 -= (*&buffer55)[1][0][0][4][0][0];
  let ptr67: ptr<storage, array<array<array<array<f16, 25>, 1>, 1>, 1>, read_write> = &(*&buffer54)[arrayLength(&(*&buffer54))][0][0];
  buffer54[u32((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24])][u32(unconst_u32(60))][u32(unconst_u32(58))][u32(vp6[31].fract)][u32(unconst_u32(31))][u32(unconst_u32(67))][u32((*ptr67)[0][0][0][24])] *= (*ptr63)[4][0][0];
  vp6[u32((*ptr63)[4][0][0])] = frexp((*&buffer55)[1][0][0][4][0][0]);
  return out;
}

fn unconst_bool(v: bool) -> bool { return v; }

struct T0 {
  @size(20) f0: atomic<u32>,
}

struct FragmentOutput4 {
  @location(2) f0: f32,
  @location(0) @interpolate(flat) f1: vec4u,
  @location(1) f2: vec2i,
}

@vertex
fn vertex6(a0: S1) -> @builtin(position) vec4f {
  var out: vec4f;
  let ptr69: ptr<storage, array<array<f16, 1>, 1>, read> = &buffer55[1][0][0][4];
  out += vec4f(f32(buffer55[1][0][0][4][0][0]));
  var vf61 = fn1();
  vp6[u32(buffer55[1][0][0][4][0][0])] = frexp(buffer55[1][0][0][u32(unconst_u32(294))][0][0]);
  let ptr70: ptr<storage, array<array<array<f16, 1>, 1>, 5>, read> = &buffer55[1][0][0];
  fn1();
  var vf62 = fn1();
  let ptr71: ptr<storage, f16, read> = &(*ptr69)[0][u32(unconst_u32(3))];
  var vf63 = fn1();
  fn1();
  var vf64 = fn1();
  return out;
}

@fragment
fn fragment5(@location(15) @interpolate(perspective, sample) a0: vec2h, @location(1) @interpolate(flat) a1: vec4u, @location(14) @interpolate(flat, centroid) a2: vec4i, a3: S2, @location(3) @interpolate(flat) a4: f16) -> FragmentOutput4 {
  var out: FragmentOutput4;
  var vf65 = fn1();
  let ptr72: ptr<storage, array<f16, 25>, read_write> = &buffer54[arrayLength(&buffer54)][0][0][0][0][0];
  let ptr73: ptr<storage, array<array<array<array<array<f16, 1>, 1>, 5>, 1>, 1>, read> = &(*&buffer55)[1];
  return out;
}

@compute @workgroup_size(1, 1, 1)
fn compute4(@builtin(num_workgroups) a0: vec3u) {
  buffer54[u32(unconst_u32(13))][u32(unconst_u32(51))][u32(unconst_u32(299))][0][u32((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24])][u32(unconst_u32(149))][u32((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24])] += buffer55[1][0][0][4][0][0];
  let ptr74: ptr<storage, array<array<array<array<array<array<array<f16, 25>, 1>, 1>, 1>, 1>, 1>>, read_write> = &(*&buffer54);
  vw10 += mat3x3h((*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0], (*&buffer55)[1][u32(unconst_u32(12))][0][4][0][0]);
  fn1();
  var vf66 = fn0();
  let ptr75: ptr<storage, array<f16, 1>, read> = &buffer55[1][0][0][4][0];
  fn0();
  vw10 = mat3x3h(buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0], buffer55[1][u32(unconst_u32(106))][0][4][0][0]);
  vw10 = mat3x3h(buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0], buffer55[1][0][0][4][0][0]);
  vf66.f0 |= vec2u(u32((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24]));
  var vf67 = fn0();
  let ptr76: ptr<storage, array<array<array<f16, 25>, 1>, 1>, read_write> = &(*ptr74)[arrayLength(&(*ptr74))][0][0][0];
  vw10 = mat3x3h((*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24], (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24]);
  vp6[u32(unconst_u32(7))].fract += (*&buffer54)[arrayLength(&(*&buffer54))][0][0][0][0][0][24];
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup26 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 2, resource: textureView61}]});
let commandEncoder65 = device0.createCommandEncoder({});
let textureView67 = texture72.createView({label: '\u{1f833}\u850e\u0eb0\u5565\u{1f75d}\u387a\u0b85\ub7ca'});
try {
{ clearResourceUsages(device0, computePassEncoder20); computePassEncoder20.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder14.endOcclusionQuery();
} catch {}
try {
renderPassEncoder10.setVertexBuffer(7, buffer19, 268, 962);
} catch {}
try {
commandEncoder65.resolveQuerySet(querySet2, 83, 83, buffer25, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let pipelineLayout13 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder66 = device0.createCommandEncoder();
let texture73 = device0.createTexture({
  label: '\u890b\udef7\ucb53\u0249\u{1fd49}\u6f3f\u{1f7c8}\u7ba3',
  size: {width: 4, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture74 = gpuCanvasContext0.getCurrentTexture();
let renderPassEncoder20 = commandEncoder65.beginRenderPass({
  colorAttachments: [{
  view: textureView57,
  depthSlice: 613,
  clearValue: { r: -203.0, g: 554.4, b: -524.5, a: -687.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
let sampler45 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'linear',
  mipmapFilter: 'nearest',
  lodMaxClamp: 23.67,
});
try {
computePassEncoder29.setBindGroup(0, bindGroup9, []);
} catch {}
try {
renderPassEncoder8.setBindGroup(0, bindGroup4, new Uint32Array(2092), 215, 0);
} catch {}
try {
buffer15.unmap();
} catch {}
try {
commandEncoder66.clearBuffer(buffer48, 124, 1240);
} catch {}
try {
adapter0.label = '\u094d\u5e3d\ud5ef\u{1f6b8}\u31a8\uc33e\u475e\ubc97\udf71\u8bb5';
} catch {}
let textureView68 = texture73.createView({dimension: '2d-array'});
let texture75 = device0.createTexture({
  size: [48, 228, 1],
  mipLevelCount: 2,
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder2.setBindGroup(1, bindGroup12);
} catch {}
try {
commandEncoder66.copyBufferToBuffer(buffer9, 708, buffer19, 764, 312);
} catch {}
try {
  await promise8;
} catch {}
let commandEncoder67 = device0.createCommandEncoder({});
try {
computePassEncoder0.setBindGroup(3, bindGroup20, new Uint32Array(1610), 677, 0);
} catch {}
try {
renderPassEncoder7.setBindGroup(1, bindGroup23, new Uint32Array(524), 66, 0);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(5, buffer18, 0);
} catch {}
try {
commandEncoder67.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 384 */
  offset: 384,
  bytesPerRow: 768,
  buffer: buffer20,
}, {
  texture: texture46,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder66.copyTextureToBuffer({
  texture: texture17,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 12 widthInBlocks: 6 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 3558 */
  offset: 3558,
  bytesPerRow: 4864,
  buffer: buffer40,
}, {width: 6, height: 47, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\ueedf\u{1f768}\u0580';
} catch {}
let buffer56 = device0.createBuffer({
  label: '\u09ce\u{1f9af}',
  size: 2319,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let texture76 = device0.createTexture({
  size: [1, 1, 6],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder21 = commandEncoder66.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: -16.17, g: -788.7, b: 304.8, a: 604.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder30.setBindGroup(1, bindGroup22, new Uint32Array(1120), 41, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
await gc();
let textureView69 = texture61.createView({dimension: '2d', baseArrayLayer: 5});
let textureView70 = texture9.createView({aspect: 'all'});
let computePassEncoder49 = commandEncoder67.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder20); computePassEncoder20.dispatchWorkgroupsIndirect(buffer33, 536); };
} catch {}
try {
computePassEncoder49.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder14.setVertexBuffer(4, buffer34, 2_524, 149);
} catch {}
try {
device0.queue.writeBuffer(buffer41, 2348, new DataView(new ArrayBuffer(22421)), 2883, 44);
} catch {}
let textureView71 = texture73.createView({dimension: '2d-array', baseArrayLayer: 0});
let texture77 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 8},
  mipLevelCount: 3,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder43.setBindGroup(2, bindGroup4, new Uint32Array(1023), 7, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer33, 32); };
} catch {}
try {
renderPassEncoder10.setIndexBuffer(buffer37, 'uint32', 2_476, 2_138);
} catch {}
let arrayBuffer3 = buffer14.getMappedRange(5240, 940);
try {
buffer28.unmap();
} catch {}
await gc();
let bindGroupLayout14 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 41,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
  ],
});
let buffer57 = device0.createBuffer({size: 19807, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
try {
computePassEncoder28.setBindGroup(0, bindGroup20);
} catch {}
try {
computePassEncoder40.setBindGroup(1, bindGroup23, new Uint32Array(219), 49, 0);
} catch {}
try {
renderPassEncoder16.setBindGroup(1, bindGroup2, new Uint32Array(2044), 130, 0);
} catch {}
try {
renderPassEncoder9.setStencilReference(179);
} catch {}
try {
  await promise9;
} catch {}
let shaderModule5 = device0.createShaderModule({
  label: '\u533f\u095c\u0364\u01bc\u0cc8\ue578\u05e7',
  code: `
enable f16;

requires pointer_composite_access;

var<private> vp9: VertexOutput6 = VertexOutput6(vec4f(), vec2f(), vec2i(), vec4f());

fn fn1() -> array<f16, 40> {
  var out: array<f16, 40>;
  let vf72: f32 = vp9.f37[pack4x8snorm(fma(vec4f(unconst_f32(0.00507), unconst_f32(0.00547), unconst_f32(0.00471), unconst_f32(0.1650)), vec4f(unconst_f32(0.02942), unconst_f32(0.1091), unconst_f32(0.1092), unconst_f32(0.06518)), vec4f(unconst_f32(0.02549), unconst_f32(0.05557), unconst_f32(0.1898), unconst_f32(-0.2121))))];
  let ptr83: ptr<private, vec3h> = &vp7.whole;
  let ptr84: ptr<private, vec2i> = &vp9.f36;
  let vf73: f32 = vp9.f35[1];
  vp10.f34 -= vec4f(f32(vp8[11].fract));
  vp12 += f16((*ptr84)[1]);
  let ptr85: ptr<private, vec2i> = &vp9.f36;
  vp8[u32(unconst_u32(77))].exp = bitcast<i32>(vp9.f34[3]);
  let ptr86: ptr<private, vec4f> = &vp10.f34;
  var vf74: bool = all(vec4<bool>(vp9.f35.yyyx));
  vp9.f34 += bitcast<vec4f>(vp10.f36.grgr);
  out[u32(unconst_u32(24))] += f16(vp10.f34[1]);
  var vf75: vec4u = unpack4xU8(u32(unconst_u32(203)));
  let vf76: f32 = (*ptr86)[2];
  let ptr87: ptr<private, vec4f> = &vp10.f34;
  vf74 = bool(vp9.f35.r);
  vf74 = bool(vp10.f34[1]);
  vp12 *= f16(vp9.f34[3]);
  let vf77: mat2x2h = transpose(mat2x2h((*ptr83)[u32(unconst_u32(511))], (*ptr83)[u32(unconst_u32(511))], (*ptr83)[u32(unconst_u32(511))], (*ptr83)[u32(unconst_u32(511))]));
  vp9.f34 = inverseSqrt(vec2f(f32(vp8[u32(unconst_u32(361))].fract))).rgrr;
  let vf78: mat2x2h = transpose(mat2x2h(unconst_f16(9538.7), unconst_f16(4339.2), unconst_f16(24933.6), unconst_f16(6307.2)));
  out[u32(unconst_u32(298))] += vf78[0][bitcast<u32>((*ptr86)[u32(vp9.f36[1])])];
  vp11 <<= u32(vp9.f34[bitcast<u32>((*ptr85)[0])]);
  let ptr88: ptr<private, vec4f> = &vp9.f37;
  var vf79: vec4h = clamp(vec4h(unconst_f16(1936.2), unconst_f16(2972.2), unconst_f16(5942.8), unconst_f16(1813.9)), transpose(mat2x2h(unconst_f16(19625.5), unconst_f16(437.5), unconst_f16(2123.5), unconst_f16(21543.0)))[1].yxyx, vec4h(f16(vf75[u32(unconst_u32(107))])));
  return out;
}

struct VertexOutput6 {
  @builtin(position) f34: vec4f,
  @location(15) @interpolate(linear, centroid) f35: vec2f,
  @location(2) f36: vec2i,
  @location(10) f37: vec4f,
}

var<workgroup> vw14: vec4h;

var<private> vp10: VertexOutput6 = VertexOutput6(vec4f(), vec2f(), vec2i(), vec4f());

struct T0 {
  @size(16) f0: array<u32>,
}

@group(0) @binding(251) var<uniform> buffer58: array<array<array<f16, 1>, 2>, 4>;

var<private> vp8 = array(frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()), frexp(f16()));

fn unconst_i32(v: i32) -> i32 { return v; }

fn fn0() {
  let ptr77: ptr<private, i32> = &vp8[11].exp;
  var vf68: vec3h = sqrt(vec3h(unconst_f16(11521.7), unconst_f16(-3912.5), unconst_f16(8250.3)));
  let ptr78 = &vp8[11];
  vp7 = modf(vec3h(vp10.f35.rrr));
  vp7.fract = vec3h(extractBits(vec2i(unconst_i32(19), unconst_i32(118)), pack2x16float(unpack2x16float(u32(vp8[11].fract))), u32(unconst_u32(152))).yyx);
  vp8[u32(unconst_u32(213))] = frexp(vf68.x);
  vp12 += f16((*ptr77));
  let ptr79 = &vp8[u32(vp10.f36[u32(unconst_u32(79))])];
  let vf69: i32 = countLeadingZeros(i32(unconst_i32(19)));
  let vf70: vec2i = extractBits(vp9.f36, u32(unconst_u32(3)), pack2x16snorm(vp10.f35));
  vp7 = modf(vec3h(vp10.f34.arg));
  var vf71: f32 = vp9.f37[0];
  let ptr80: ptr<private, vec3h> = &vp7.whole;
  vp10.f36 ^= bitcast<vec2i>(exp2(vec2f(unconst_f32(0.5465), unconst_f32(0.07484))));
  vp11 -= u32(vp9.f34[3]);
  let ptr81: ptr<private, vec4f> = &vp9.f37;
  let ptr82: ptr<private, vec2i> = &vp10.f36;
}

var<private> vp12: f16 = f16();

alias vec3b = vec3<bool>;

@group(1) @binding(13) var<storage, read_write> buffer59: array<array<array<f16, 5>, 4>>;

fn unconst_u32(v: u32) -> u32 { return v; }

var<private> vp7 = modf(vec3h());

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

var<workgroup> vw11: mat3x3h;

var<workgroup> vw13: vec2f;

var<workgroup> vw12: atomic<i32>;

@group(1) @binding(138) var tex0: texture_2d<i32>;

var<workgroup> vw15: vec4i;

fn unconst_f16(v: f16) -> f16 { return v; }

var<private> vp11: u32 = u32();

@vertex
fn vertex7(@location(4) @interpolate(flat, sample) a0: vec2i, @location(7) @interpolate(flat) a1: vec4i, @location(10) @interpolate(linear) a2: vec2h) -> VertexOutput6 {
  var out: VertexOutput6;
  fn0();
  out.f37 -= vp10.f37;
  fn0();
  let ptr89 = &vp8;
  out.f36 = vec2i(vp7.fract.xy);
  vp10.f34 = vec4f(vp10.f37[u32(unconst_u32(614))]);
  fn0();
  out.f36 = bitcast<vec2i>(vp10.f34.ww);
  let vf80: i32 = vp9.f36[u32(vp10.f36[u32(unconst_u32(121))])];
  out.f35 *= cross(vec3f(unconst_f32(0.1300), unconst_f32(0.3479), unconst_f32(-0.08300)), vec3f(bitcast<f32>(vp11))).xy;
  var vf81: vec2u = textureDimensions(tex0);
  fn0();
  fn0();
  var vf82: vec4h = radians(vec4h(vp9.f37));
  vp8[u32(unconst_u32(222))].exp = i32(insertBits(vec3u(unconst_u32(81), unconst_u32(95), unconst_u32(306)), vec3u(unconst_u32(68), unconst_u32(361), unconst_u32(201)), u32(vp10.f34[u32(unconst_u32(25))]), u32(unconst_u32(19)))[0]);
  fn0();
  let vf83: f16 = a2[u32(unconst_u32(5))];
  vp8[u32(unconst_u32(232))] = frexp(vec4h(vp9.f37).g);
  fn0();
  let ptr90 = &vp8[11];
  let ptr91: ptr<private, u32> = &vp11;
  fn1();
  return out;
}

@compute @workgroup_size(2, 1, 1)
fn compute5() {
  vp7.fract = vec3h(f16(atomicExchange(&vw12, i32(buffer59[arrayLength(&buffer59) - 1][3][4]))));
  fn0();
  fn0();
  workgroupBarrier();
  vp11 = u32(buffer59[arrayLength(&buffer59)][3][4]);
  let vf84: f16 = (*&vw14)[1];
  vw14 = vec4h(buffer59[arrayLength(&buffer59) - 1][3][4]);
  let ptr92: ptr<uniform, array<array<f16, 1>, 2>> = &(*&buffer58)[3];
  fn0();
  buffer59[u32(unconst_u32(418))][u32(buffer59[arrayLength(&buffer59)][3][4])][u32(unconst_u32(91))] = f16(vp11);
  let ptr93: ptr<uniform, array<f16, 1>> = &(*ptr92)[pack2x16float(vp9.f35)];
  buffer59[u32(unconst_u32(240))][pack4xI8Clamp((*&vw15))][u32(unconst_u32(24))] -= f16(vp10.f37[1]);
  let vf85: vec2f = unpack2x16unorm(u32(unconst_u32(147)));
  vw13 = vec2f(f32((*&buffer58)[3][1][0]));
  var vf86: i32 = (*&vw15)[u32(unconst_u32(139))];
}`,
  sourceMap: {},
  hints: {},
});
let buffer60 = device0.createBuffer({
  size: 469,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
try {
computePassEncoder2.setBindGroup(2, bindGroup7);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder40); computePassEncoder40.dispatchWorkgroupsIndirect(buffer2, 4_244); };
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup5, new Uint32Array(361), 1, 0);
} catch {}
try {
renderPassEncoder1.setViewport(0.3752036416309682, 0.09860391971723914, 0.31612124391765545, 0.028322958694073794, 0.5774231567871593, 0.9513139088720728);
} catch {}
try {
device0.queue.writeBuffer(buffer12, 1792, new DataView(new ArrayBuffer(2906)), 189, 392);
} catch {}
let buffer61 = device0.createBuffer({
  size: 19808,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder68 = device0.createCommandEncoder();
let textureView72 = texture73.createView({label: '\u8856\u5031\u0236\u{1f74c}\ua235', dimension: '2d-array'});
try {
computePassEncoder13.setBindGroup(2, bindGroup15);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroups(1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder10); computePassEncoder10.dispatchWorkgroupsIndirect(buffer44, 12_276); };
} catch {}
try {
renderPassEncoder13.setBindGroup(1, bindGroup9, new Uint32Array(4013), 926, 0);
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer29, 'uint32', 312, 943);
} catch {}
try {
renderPassEncoder11.setVertexBuffer(7, buffer23, 176);
} catch {}
let renderPassEncoder22 = commandEncoder68.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: 166.3, g: 596.8, b: 821.6, a: 409.1, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder6.setBindGroup(3, bindGroup17, new Uint32Array(193), 45, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4, buffer19, 328, 430);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture62,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(47).fill(236), /* required buffer size: 47 */
{offset: 47}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let videoFrame9 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt470bg', primaries: 'jedecP22Phosphors', transfer: 'smpte240m'} });
try {
renderPassEncoder20.setBlendConstant({ r: 681.1, g: 861.1, b: 199.8, a: -161.2, });
} catch {}
try {
renderPassEncoder9.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer52, 'uint16', 84, 22);
} catch {}
let arrayBuffer4 = buffer14.getMappedRange(152, 664);
document.body.prepend(img0);
let buffer62 = device0.createBuffer({size: 5867, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder69 = device0.createCommandEncoder({label: '\u7b3e\u0f61\u0c1f\u4695'});
let textureView73 = texture72.createView({label: '\u{1f9cf}\ub388\u{1f677}'});
let renderPassEncoder23 = commandEncoder69.beginRenderPass({
  colorAttachments: [{
  view: textureView46,
  depthSlice: 27,
  clearValue: { r: 900.1, g: 992.4, b: 547.7, a: -990.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder33.setBindGroup(0, bindGroup22);
} catch {}
try {
buffer33.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture68,
  mipLevel: 0,
  origin: {x: 9, y: 1, z: 1},
  aspect: 'all',
}, new Uint8Array(428_439).fill(198), /* required buffer size: 428_439 */
{offset: 38, bytesPerRow: 487, rowsPerImage: 153}, {width: 41, height: 115, depthOrArrayLayers: 6});
} catch {}
let commandEncoder70 = device0.createCommandEncoder({});
let texture78 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 5,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView74 = texture37.createView({arrayLayerCount: 1});
let computePassEncoder50 = commandEncoder70.beginComputePass({});
try {
computePassEncoder50.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer20, 'uint16', 13_548, 467);
} catch {}
try {
renderPassEncoder8.setVertexBuffer(6, buffer35, 1_472);
} catch {}
try {
buffer38.unmap();
} catch {}
let buffer63 = device0.createBuffer({
  size: 1241,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let renderBundleEncoder8 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], stencilReadOnly: true});
try {
{ clearResourceUsages(device0, computePassEncoder40); computePassEncoder40.dispatchWorkgroups(2, 1); };
} catch {}
let bindGroup27 = device0.createBindGroup({layout: bindGroupLayout11, entries: [{binding: 31, resource: textureView65}]});
let buffer64 = device0.createBuffer({
  size: 21945,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let sampler46 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 32.89,
  lodMaxClamp: 59.79,
});
try {
computePassEncoder11.setBindGroup(2, bindGroup18, new Uint32Array(878), 45, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer44, 2_764); };
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup23);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer53, 'uint16', 340, 13_727);
} catch {}
try {
renderBundleEncoder8.setBindGroup(0, bindGroup8, new Uint32Array(837), 14, 0);
} catch {}
try {
renderBundleEncoder8.setIndexBuffer(buffer53, 'uint32', 2_832, 18_846);
} catch {}
try {
buffer15.unmap();
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
computePassEncoder24.setBindGroup(0, bindGroup10);
} catch {}
try {
computePassEncoder18.setBindGroup(2, bindGroup6, new Uint32Array(3524), 1_080, 0);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData10,
  origin: { x: 11, y: 0 },
  flipY: true,
}, {
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder71 = device0.createCommandEncoder();
let computePassEncoder51 = commandEncoder71.beginComputePass({});
let sampler47 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'linear',
  lodMinClamp: 40.54,
  lodMaxClamp: 54.65,
});
try {
renderPassEncoder2.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(3, buffer40);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
buffer61.unmap();
} catch {}
try {
computePassEncoder51.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle2]);
} catch {}
try {
renderBundleEncoder8.setVertexBuffer(6, buffer44, 0, 3_057);
} catch {}
try {
computePassEncoder19.insertDebugMarker('\u08f7');
} catch {}
let commandEncoder72 = device0.createCommandEncoder({});
let computePassEncoder52 = commandEncoder72.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder20); computePassEncoder20.dispatchWorkgroupsIndirect(buffer20, 9_300); };
} catch {}
try {
computePassEncoder52.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer53, 'uint32', 2_772, 3_207);
} catch {}
try {
renderBundleEncoder8.setIndexBuffer(buffer9, 'uint16', 94, 192);
} catch {}
try {
renderBundleEncoder8.setVertexBuffer(3, buffer15, 0, 1_389);
} catch {}
document.body.append(img0);
let commandEncoder73 = device0.createCommandEncoder({});
let texture79 = device0.createTexture({
  size: [4, 1, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView75 = texture8.createView({dimension: '2d-array', mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder53 = commandEncoder73.beginComputePass({});
let renderBundle8 = renderBundleEncoder8.finish({});
try {
computePassEncoder53.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder14.executeBundles([renderBundle3]);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer12, 'uint16', 336, 1_267);
} catch {}
let buffer65 = device0.createBuffer({
  size: 13297,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let texture80 = device0.createTexture({
  size: [384, 1824, 6],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST,
});
try {
computePassEncoder18.setBindGroup(1, bindGroup12);
} catch {}
try {
computePassEncoder53.setBindGroup(2, bindGroup9, new Uint32Array(1025), 73, 0);
} catch {}
try {
renderPassEncoder4.beginOcclusionQuery(130);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer50, 'uint32', 128, 486);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(5, buffer33, 848, 1_911);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 48, height: 228, depthOrArrayLayers: 1}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture75,
  mipLevel: 0,
  origin: {x: 7, y: 53, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer66 = device0.createBuffer({
  size: 19010,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let textureView76 = texture38.createView({aspect: 'all', mipLevelCount: 1});
try {
renderPassEncoder23.setBindGroup(0, bindGroup10);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(5, buffer64, 0);
} catch {}
let arrayBuffer5 = buffer14.getMappedRange(7640, 252);
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 128, height: 128, depthOrArrayLayers: 17}
*/
{
  source: videoFrame9,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 1,
  origin: {x: 29, y: 4, z: 2},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer4.detached) { new Uint8Array(arrayBuffer4).fill(0x55); };
} catch {}
try {
computePassEncoder49.setBindGroup(1, bindGroup1);
} catch {}
try {
renderPassEncoder11.setBindGroup(2, bindGroup2, new Uint32Array(359), 55, 0);
} catch {}
try {
if (!arrayBuffer2.detached) { new Uint8Array(arrayBuffer2).fill(0x55); };
} catch {}
let querySet4 = device0.createQuerySet({type: 'occlusion', count: 1157});
try {
renderPassEncoder18.beginOcclusionQuery(164);
} catch {}
let bindGroup28 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 185, resource: textureView31}, {binding: 67, resource: textureView20}],
});
let buffer67 = device0.createBuffer({
  size: 11991,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let sampler48 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 76.11,
  lodMaxClamp: 77.68,
});
try {
computePassEncoder10.setBindGroup(3, bindGroup1);
} catch {}
try {
renderPassEncoder22.setViewport(0.29226266635022546, 0.06416087989476704, 0.4852721950022495, 0.4038305270398317, 0.8313394839332946, 0.847084770778766);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 96, height: 456, depthOrArrayLayers: 1}
*/
{
  source: videoFrame6,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture78,
  mipLevel: 1,
  origin: {x: 5, y: 109, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture81 = device0.createTexture({
  size: [256, 256, 17],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler49 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 91.24,
  maxAnisotropy: 14,
});
try {
computePassEncoder12.setBindGroup(0, bindGroup11, new Uint32Array(4208), 2, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer45, 736); };
} catch {}
try {
computePassEncoder17.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder11.setViewport(0.3181296806777678, 0.9998590414917152, 0.5828854120487833, 0.00011680870647125022, 0.7786224045991088, 0.9805056121773729);
} catch {}
let bindGroup29 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 251, resource: {buffer: buffer37, offset: 768}}]});
try {
computePassEncoder29.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(2, bindGroup16, []);
} catch {}
try {
renderPassEncoder4.endOcclusionQuery();
} catch {}
try {
renderPassEncoder17.setViewport(7.446704052749166, 0.43613052005671804, 0.45698153106530054, 0.14793687015877532, 0.3317579233973509, 0.9664080334673728);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(4, buffer64);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
document.body.append(img0);
let textureView77 = texture75.createView({dimension: '2d-array', format: 'rgba16float', mipLevelCount: 1});
try {
computePassEncoder32.setBindGroup(1, bindGroup19, new Uint32Array(514), 24, 0);
} catch {}
try {
computePassEncoder40.end();
} catch {}
try {
renderPassEncoder18.endOcclusionQuery();
} catch {}
let arrayBuffer6 = buffer14.getMappedRange(7984, 1564);
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let videoFrame10 = new VideoFrame(videoFrame6, {timestamp: 0});
try {
pipelineLayout11.label = '\uc6ff\u3a05\u0a45\u{1f856}';
} catch {}
let bindGroup30 = device0.createBindGroup({layout: bindGroupLayout12, entries: [{binding: 76, resource: textureView56}]});
let commandEncoder74 = device0.createCommandEncoder({});
let texture82 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  mipLevelCount: 3,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView78 = texture17.createView({label: '\u5b12\u0819\ub2f3\u990e\ub89c', format: 'r16float', mipLevelCount: 1, baseArrayLayer: 0});
let renderPassEncoder24 = commandEncoder74.beginRenderPass({
  colorAttachments: [{view: textureView18, loadOp: 'clear', storeOp: 'store'}],
  occlusionQuerySet: querySet1,
});
try {
renderPassEncoder14.setBindGroup(1, bindGroup28);
} catch {}
try {
renderPassEncoder8.executeBundles([renderBundle0]);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
let commandEncoder75 = device0.createCommandEncoder({label: '\u8d39\u{1fd14}\ucca2\u01ee\u0e87\u0848\uc161'});
let texture83 = device0.createTexture({size: [4, 1, 1], format: 'rgba16float', usage: GPUTextureUsage.TEXTURE_BINDING});
let computePassEncoder54 = commandEncoder54.beginComputePass({});
let renderPassEncoder25 = commandEncoder75.beginRenderPass({
  colorAttachments: [{view: textureView46, depthSlice: 40, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 490989045,
});
let sampler50 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 70.37,
  lodMaxClamp: 73.62,
});
try {
renderPassEncoder7.setViewport(0.9275095565915004, 0.13169314735280524, 0.6766007744523648, 0.038655560046095785, 0.31941704000882976, 0.9482738157042767);
} catch {}
try {
buffer42.unmap();
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
let bindGroup31 = device0.createBindGroup({
  label: '\u{1ff9d}\u0af3\u5fdf\ue161\u0e8b',
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer15, offset: 0}}],
});
let buffer68 = device0.createBuffer({size: 22505, usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE});
let renderBundleEncoder9 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], sampleCount: 1, depthReadOnly: true, stencilReadOnly: true});
try {
computePassEncoder11.setBindGroup(0, bindGroup10);
} catch {}
try {
computePassEncoder10.end();
} catch {}
try {
renderPassEncoder20.setViewport(2.9698695260078356, 0.44096925881983373, 2.519669179722647, 0.3826196336573196, 0.4008056633662337, 0.5856252364951099);
} catch {}
try {
renderPassEncoder9.setIndexBuffer(buffer65, 'uint32', 5_664, 907);
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
try {
commandEncoder9.copyTextureToTexture({
  texture: texture29,
  mipLevel: 0,
  origin: {x: 30, y: 5, z: 0},
  aspect: 'all',
},
{
  texture: texture36,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer48, 672, new Int16Array(32420), 16105, 740);
} catch {}
let computePassEncoder55 = commandEncoder9.beginComputePass({});
let renderBundle9 = renderBundleEncoder9.finish({});
let sampler51 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 73.87,
  lodMaxClamp: 76.87,
  compare: 'always',
});
try {
computePassEncoder27.setBindGroup(1, bindGroup27);
} catch {}
try {
renderPassEncoder16.setBindGroup(1, bindGroup1);
} catch {}
let sampler52 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 1.323,
  lodMaxClamp: 90.42,
});
let externalTexture4 = device0.importExternalTexture({source: videoFrame0});
try {
computePassEncoder20.end();
} catch {}
try {
renderPassEncoder3.setBindGroup(0, bindGroup24, new Uint32Array(1682), 55, 0);
} catch {}
try {
renderPassEncoder19.setVertexBuffer(4, buffer33, 44);
} catch {}
try {
commandEncoder24.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 3656 */
  offset: 3656,
  buffer: buffer45,
}, {
  texture: texture73,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
offscreenCanvas1.height = 752;
let commandEncoder76 = device0.createCommandEncoder({label: '\u{1ff44}\u{1f9d0}\u{1f868}\u09dc\ufc50\ued1c\u1f86\u0d64\uc5e8\ub41b'});
let sampler53 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 69.90,
  lodMaxClamp: 87.96,
});
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroupsIndirect(buffer63, 440); };
} catch {}
try {
computePassEncoder54.setPipeline(pipeline1);
} catch {}
try {
commandEncoder24.resolveQuerySet(querySet0, 18, 8, buffer61, 6912);
} catch {}
let bindGroupLayout15 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 397,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'uint', multisampled: false },
    },
    {
      binding: 64,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
    {
      binding: 19,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
    {
      binding: 89,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 308,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
  ],
});
let buffer69 = device0.createBuffer({
  size: 1244,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let querySet5 = device0.createQuerySet({type: 'occlusion', count: 185});
let textureView79 = texture63.createView({label: '\u047f\ufdc9\ue7fe\ue7f9\ud726', mipLevelCount: 1});
let computePassEncoder56 = commandEncoder76.beginComputePass({});
let renderPassEncoder26 = commandEncoder24.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: 87.04, g: -619.7, b: -382.3, a: -910.6, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let sampler54 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 14.79,
  lodMaxClamp: 75.21,
  compare: 'greater',
});
try {
computePassEncoder55.setBindGroup(0, bindGroup24);
} catch {}
try {
computePassEncoder8.setBindGroup(1, bindGroup28, new Uint32Array(360), 31, 0);
} catch {}
try {
computePassEncoder56.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup25, new Uint32Array(891), 61, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture77,
  mipLevel: 1,
  origin: {x: 9, y: 45, z: 0},
  aspect: 'all',
}, new Uint8Array(124).fill(138), /* required buffer size: 124 */
{offset: 124, bytesPerRow: 28}, {width: 0, height: 11, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\ud16d\u1d9e\u{1fc10}\u3ebf\u{1ff95}\u{1f623}';
} catch {}
let buffer70 = device0.createBuffer({
  size: 23334,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder77 = device0.createCommandEncoder();
let renderPassEncoder27 = commandEncoder77.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -316.1, g: 853.0, b: -943.4, a: 414.1, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder8.setBindGroup(1, bindGroup24);
} catch {}
try {
renderPassEncoder24.setBindGroup(2, bindGroup27, new Uint32Array(76), 1, 0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup28);
} catch {}
let videoFrame11 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'fcc', primaries: 'bt709', transfer: 'pq'} });
let commandEncoder78 = device0.createCommandEncoder({});
let texture84 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 117},
  mipLevelCount: 3,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let texture85 = gpuCanvasContext1.getCurrentTexture();
let textureView80 = texture42.createView({baseArrayLayer: 0});
let renderPassEncoder28 = commandEncoder78.beginRenderPass({
  label: '\u{1f92b}\u7730\u{1feb9}',
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -666.6, g: -591.7, b: -492.7, a: -345.8, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder3.setBindGroup(0, bindGroup7, new Uint32Array(1950), 923, 0);
} catch {}
try {
renderPassEncoder19.setVertexBuffer(6, buffer9, 0, 277);
} catch {}
try {
renderPassEncoder7.insertDebugMarker('\uda49');
} catch {}
let sampler55 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 62.57,
  lodMaxClamp: 73.18,
  maxAnisotropy: 17,
});
try {
computePassEncoder55.setPipeline(pipeline0);
} catch {}
let texture86 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC,
});
let sampler56 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 63.48,
  lodMaxClamp: 89.00,
});
try {
computePassEncoder43.setBindGroup(3, bindGroup13, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer68, 9_936); };
} catch {}
try {
computePassEncoder55.end();
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 24, height: 114, depthOrArrayLayers: 1}
*/
{
  source: imageData8,
  origin: { x: 6, y: 0 },
  flipY: true,
}, {
  texture: texture75,
  mipLevel: 1,
  origin: {x: 9, y: 18, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup32 = device0.createBindGroup({
  layout: bindGroupLayout9,
  entries: [{binding: 22, resource: {buffer: buffer47, offset: 3328, size: 428}}],
});
let texture87 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 149},
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST,
});
let textureView81 = texture28.createView({});
let computePassEncoder57 = commandEncoder9.beginComputePass();
try {
renderPassEncoder25.setBindGroup(2, bindGroup9);
} catch {}
offscreenCanvas1.height = 1868;
let commandEncoder79 = device0.createCommandEncoder();
let renderPassEncoder29 = commandEncoder79.beginRenderPass({
  label: '\u9ce8\u066b',
  colorAttachments: [{view: textureView74, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 122867732,
});
let sampler57 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 2.648,
  lodMaxClamp: 93.46,
  compare: 'greater',
});
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer47, 3_712); };
} catch {}
try {
computePassEncoder57.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder28.setIndexBuffer(buffer12, 'uint32', 1_256, 545);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(6, buffer48, 0);
} catch {}
let textureView82 = texture25.createView({dimension: '2d-array'});
let externalTexture5 = device0.importExternalTexture({source: videoFrame0, colorSpace: 'display-p3'});
try {
computePassEncoder25.setBindGroup(2, bindGroup32);
} catch {}
try {
renderPassEncoder24.setBindGroup(2, bindGroup25);
} catch {}
try {
renderPassEncoder18.executeBundles([renderBundle4, renderBundle6]);
} catch {}
try {
renderPassEncoder9.setVertexBuffer(1, buffer15, 0, 43);
} catch {}
try {
adapter0.label = '\ufa18\u74e9\u0493\u{1f647}\u0755\u{1fa01}\u0121\u0d38';
} catch {}
let commandEncoder80 = device0.createCommandEncoder({});
let computePassEncoder58 = commandEncoder80.beginComputePass({});
let renderBundleEncoder10 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], sampleCount: 1, stencilReadOnly: true});
let sampler58 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 97.24,
  lodMaxClamp: 98.31,
});
try {
computePassEncoder28.setBindGroup(0, bindGroup10, []);
} catch {}
try {
computePassEncoder25.setBindGroup(0, bindGroup21, new Uint32Array(4780), 216, 0);
} catch {}
try {
renderPassEncoder18.setVertexBuffer(6, buffer45, 836);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
document.body.append(img0);
let textureView83 = texture87.createView({});
try {
computePassEncoder0.setBindGroup(3, bindGroup5, new Uint32Array(3650), 505, 0);
} catch {}
try {
computePassEncoder58.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder10.setBindGroup(3, bindGroup22, new Uint32Array(259), 0, 0);
} catch {}
try {
renderBundleEncoder10.insertDebugMarker('\u0b68');
} catch {}
let bindGroup33 = device0.createBindGroup({
  label: '\u48a8\u0218\u1677\ud0c3\udb9e',
  layout: bindGroupLayout0,
  entries: [
    {binding: 78, resource: externalTexture0},
    {binding: 204, resource: {buffer: buffer67, offset: 2048, size: 3908}},
    {binding: 119, resource: {buffer: buffer37, offset: 4608}},
  ],
});
let buffer71 = device0.createBuffer({
  size: 689,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE,
});
let commandEncoder81 = device0.createCommandEncoder();
let textureView84 = texture7.createView({});
let sampler59 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 98.50,
  lodMaxClamp: 99.30,
});
try {
computePassEncoder5.setBindGroup(2, bindGroup23, []);
} catch {}
try {
computePassEncoder8.setBindGroup(2, bindGroup6, new Uint32Array(129), 2, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder24); computePassEncoder24.dispatchWorkgroups(2, 1); };
} catch {}
try {
renderPassEncoder4.setBlendConstant({ r: 676.4, g: -737.0, b: -786.0, a: -146.9, });
} catch {}
try {
commandEncoder81.copyBufferToTexture({
  /* bytesInLastRow: 12 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1560 */
  offset: 1560,
  bytesPerRow: 25600,
  buffer: buffer20,
}, {
  texture: texture37,
  mipLevel: 0,
  origin: {x: 5, y: 41, z: 0},
  aspect: 'all',
}, {width: 3, height: 119, depthOrArrayLayers: 0});
} catch {}
let imageData11 = new ImageData(20, 36);
let bindGroupLayout16 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 77,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba8uint', access: 'read-only', viewDimension: '1d' },
    },
  ],
});
let bindGroup34 = device0.createBindGroup({
  layout: bindGroupLayout15,
  entries: [
    {binding: 308, resource: textureView79},
    {binding: 89, resource: {buffer: buffer68, offset: 512, size: 5676}},
    {binding: 19, resource: {buffer: buffer64, offset: 3584, size: 1104}},
    {binding: 64, resource: {buffer: buffer2, offset: 9984, size: 4499}},
    {binding: 397, resource: textureView47},
  ],
});
let buffer72 = device0.createBuffer({size: 884, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let texture88 = device0.createTexture({
  size: [96],
  dimension: '1d',
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder59 = commandEncoder81.beginComputePass({});
try {
computePassEncoder24.setBindGroup(2, bindGroup12, new Uint32Array(2253), 266, 0);
} catch {}
try {
computePassEncoder24.end();
} catch {}
try {
renderPassEncoder12.setBindGroup(1, bindGroup8, new Uint32Array(1624), 539, 0);
} catch {}
try {
renderBundleEncoder10.setBindGroup(2, bindGroup7);
} catch {}
try {
renderBundleEncoder10.setIndexBuffer(buffer67, 'uint16', 152, 5_865);
} catch {}
try {
renderPassEncoder23.insertDebugMarker('\u{1ff2f}');
} catch {}
let commandEncoder82 = device0.createCommandEncoder();
let texture89 = device0.createTexture({
  size: [192],
  sampleCount: 1,
  dimension: '1d',
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder60 = commandEncoder32.beginComputePass({label: '\u0960\ubdab\udb13\u1218\u4057\u{1fa8f}\u07a8'});
let renderPassEncoder30 = commandEncoder82.beginRenderPass({
  label: '\u8f39\u09de\u0341\u0333',
  colorAttachments: [{view: textureView74, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 40624322,
});
try {
computePassEncoder59.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder21.setBindGroup(0, bindGroup1, new Uint32Array(806), 195, 0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer29, 'uint32', 1_044, 198);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(7, buffer47, 0);
} catch {}
try {
renderBundleEncoder10.setBindGroup(0, bindGroup32);
} catch {}
let commandEncoder83 = device0.createCommandEncoder({});
let textureView85 = texture89.createView({dimension: '1d'});
let texture90 = device0.createTexture({size: {width: 2}, dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.TEXTURE_BINDING});
let renderPassEncoder31 = commandEncoder83.beginRenderPass({
  colorAttachments: [{
  view: textureView74,
  clearValue: { r: 372.8, g: 196.0, b: 89.00, a: -820.1, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet0,
});
try {
computePassEncoder60.setBindGroup(3, bindGroup19);
} catch {}
try {
renderPassEncoder13.setBindGroup(2, bindGroup21, new Uint32Array(144), 11, 0);
} catch {}
try {
renderPassEncoder17.beginOcclusionQuery(436);
} catch {}
try {
renderBundleEncoder10.setBindGroup(0, bindGroup14, new Uint32Array(478), 72, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
let canvas0 = document.createElement('canvas');
let commandEncoder84 = device0.createCommandEncoder({});
let computePassEncoder61 = commandEncoder84.beginComputePass({});
let renderBundle10 = renderBundleEncoder10.finish({});
try {
computePassEncoder27.setBindGroup(1, bindGroup8);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup24, new Uint32Array(2776), 1_007, 0);
} catch {}
try {
renderPassEncoder21.executeBundles([renderBundle8]);
} catch {}
try {
renderPassEncoder22.setIndexBuffer(buffer29, 'uint16', 368, 1_219);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
let promise10 = device0.queue.onSubmittedWorkDone();
let gpuCanvasContext3 = canvas0.getContext('webgpu');
try {
textureView65.label = '\u0c43\u8bb4\u28da\u79a2';
} catch {}
let commandEncoder85 = device0.createCommandEncoder();
let textureView86 = texture42.createView({baseArrayLayer: 0});
let computePassEncoder62 = commandEncoder85.beginComputePass({});
try {
computePassEncoder62.setBindGroup(2, bindGroup1);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer20, 'uint16', 7_348, 18_766);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let imageData12 = new ImageData(12, 40);
let bindGroup35 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 126, resource: textureView27}, {binding: 67, resource: sampler15}],
});
let buffer73 = device0.createBuffer({
  label: '\u{1f9d3}\u5a4c\u3fb7\u0f3a\u0087\u9ce0\u{1fcf0}',
  size: 2724,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder86 = device0.createCommandEncoder({label: '\u070f\u0a10'});
let texture91 = device0.createTexture({
  label: '\ub049\ue01e\u0217\u3c5d',
  size: [48, 228, 27],
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST,
});
let texture92 = gpuCanvasContext1.getCurrentTexture();
let textureView87 = texture14.createView({label: '\u0488\u0029\uad51\u0128\u5ab0', aspect: 'all', mipLevelCount: 1, baseArrayLayer: 0});
let computePassEncoder63 = commandEncoder86.beginComputePass();
let externalTexture6 = device0.importExternalTexture({source: videoFrame2});
let sampler60 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 63.37,
  lodMaxClamp: 93.32,
  maxAnisotropy: 1,
});
try {
computePassEncoder38.setBindGroup(3, bindGroup4, new Uint32Array(805), 149, 0);
} catch {}
try {
computePassEncoder60.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder11.executeBundles([renderBundle8]);
} catch {}
try {
buffer37.unmap();
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.writeBuffer(buffer40, 2076, new BigUint64Array(396), 31, 48);
} catch {}
try {
computePassEncoder48.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder63.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder9.setBindGroup(2, bindGroup21);
} catch {}
try {
computePassEncoder17.setBindGroup(3, bindGroup9, new Uint32Array(632), 85, 0);
} catch {}
try {
renderPassEncoder4.setBindGroup(0, bindGroup0, new Uint32Array(334), 19, 0);
} catch {}
try {
renderPassEncoder9.executeBundles([renderBundle0]);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(4, buffer18, 1_844, 994);
} catch {}
try {
renderPassEncoder10.pushDebugGroup('\u03a9');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 2, height: 1, depthOrArrayLayers: 2}
*/
{
  source: canvas0,
  origin: { x: 2, y: 63 },
  flipY: true,
}, {
  texture: texture27,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup36 = device0.createBindGroup({
  label: '\u07a6\u{1fde4}\u1152\u08d3\u039c\uf0e5\u92ec',
  layout: bindGroupLayout4,
  entries: [{binding: 175, resource: textureView32}],
});
let texture93 = device0.createTexture({
  label: '\u38d0\u0625\u{1fdd6}\uffd5\uaf99\ud50e\uc5cc\u{1f91d}',
  size: [256, 256, 25],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
try {
device0.queue.writeBuffer(buffer2, 5740, new DataView(new ArrayBuffer(2719)), 264, 480);
} catch {}
try {
computePassEncoder48.setBindGroup(2, bindGroup17);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder12); computePassEncoder12.dispatchWorkgroupsIndirect(buffer65, 628); };
} catch {}
try {
computePassEncoder44.end();
} catch {}
try {
computePassEncoder12.end();
} catch {}
try {
computePassEncoder3.setPipeline(pipeline0);
} catch {}
try {
if (!arrayBuffer6.detached) { new Uint8Array(arrayBuffer6).fill(0x55); };
} catch {}
let buffer74 = device0.createBuffer({size: 375, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX});
let textureView88 = texture63.createView({mipLevelCount: 1, baseArrayLayer: 0});
let computePassEncoder64 = commandEncoder13.beginComputePass({});
let commandEncoder87 = device0.createCommandEncoder({});
let computePassEncoder65 = commandEncoder58.beginComputePass({});
let renderPassEncoder32 = commandEncoder87.beginRenderPass({
  colorAttachments: [{
  view: textureView74,
  clearValue: { r: 573.8, g: 708.1, b: 720.3, a: -587.9, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 480040081,
});
try {
computePassEncoder65.setBindGroup(3, bindGroup4, new Uint32Array(123), 3, 0);
} catch {}
let promise11 = device0.queue.onSubmittedWorkDone();
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let commandEncoder88 = device0.createCommandEncoder({label: '\u0e59\u050c\u2366\u838d\u0722\u{1fd53}'});
try {
renderPassEncoder12.setBindGroup(3, bindGroup0);
} catch {}
try {
renderPassEncoder17.endOcclusionQuery();
} catch {}
let textureView89 = texture10.createView({});
try {
computePassEncoder32.setBindGroup(3, bindGroup4);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder28); computePassEncoder28.dispatchWorkgroupsIndirect(buffer68, 3_856); };
} catch {}
try {
renderPassEncoder18.setBindGroup(1, bindGroup11, new Uint32Array(1939), 124, 0);
} catch {}
try {
renderPassEncoder20.setViewport(6.20600159147831, 0.6848327642780914, 0.9543425934724257, 0.07241553240575915, 0.5319315512972311, 0.6363539371807979);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer68, 'uint32', 284, 3_299);
} catch {}
try {
renderPassEncoder27.setVertexBuffer(5, buffer44, 2_720, 1_586);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let commandEncoder89 = device0.createCommandEncoder({});
let texture94 = device0.createTexture({size: [2, 1, 1], format: 'rgb10a2uint', usage: GPUTextureUsage.TEXTURE_BINDING, viewFormats: []});
try {
computePassEncoder39.setBindGroup(2, bindGroup2);
} catch {}
try {
computePassEncoder13.setBindGroup(1, bindGroup2, new Uint32Array(3955), 244, 0);
} catch {}
try {
computePassEncoder28.end();
} catch {}
try {
computePassEncoder64.setPipeline(pipeline1);
} catch {}
let buffer75 = device0.createBuffer({
  size: 13486,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let textureView90 = texture88.createView({label: '\ua7ed\u3372\u0574\ub247\ufaf6\u9314\u{1ff88}\u3ff4'});
let textureView91 = texture10.createView({label: '\u0bfe\u4096\u4fb8\u6fff\u{1fb1a}\u0f9a\u525a\u02c4\u{1f9a5}', dimension: '2d-array'});
let computePassEncoder66 = commandEncoder37.beginComputePass({});
let sampler61 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 86.70,
  compare: 'equal',
});
try {
computePassEncoder62.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.setBindGroup(0, bindGroup32);
} catch {}
try {
renderPassEncoder26.setIndexBuffer(buffer68, 'uint16', 814, 4_648);
} catch {}
let arrayBuffer7 = buffer14.getMappedRange(9552, 132);
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'srgb',
});
} catch {}
let bindGroup37 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView70}, {binding: 177, resource: textureView84}],
});
let renderPassEncoder33 = commandEncoder88.beginRenderPass({
  colorAttachments: [{
  view: textureView74,
  clearValue: { r: -677.8, g: 962.8, b: 742.9, a: 600.8, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet3,
});
try {
computePassEncoder4.setBindGroup(0, bindGroup4, new Uint32Array(2061), 151, 0);
} catch {}
try {
computePassEncoder14.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder10.setBindGroup(3, bindGroup13, new Uint32Array(839), 314, 0);
} catch {}
try {
renderPassEncoder33.executeBundles([renderBundle4, renderBundle6, renderBundle6]);
} catch {}
try {
commandEncoder89.copyTextureToTexture({
  texture: texture57,
  mipLevel: 0,
  origin: {x: 15, y: 22, z: 0},
  aspect: 'all',
},
{
  texture: texture41,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
},
{width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder10.popDebugGroup();
} catch {}
let promise12 = device0.queue.onSubmittedWorkDone();
try {
if (!arrayBuffer4.detached) { new Uint8Array(arrayBuffer4).fill(0x55); };
} catch {}
let bindGroup38 = device0.createBindGroup({layout: bindGroupLayout16, entries: [{binding: 77, resource: textureView85}]});
let commandEncoder90 = device0.createCommandEncoder({});
let textureView92 = texture86.createView({label: '\u4bef\u766c\u1f3f\uf54a\u0710', baseMipLevel: 0, mipLevelCount: 1});
let renderPassEncoder34 = commandEncoder90.beginRenderPass({
  colorAttachments: [{
  view: textureView74,
  clearValue: { r: 597.4, g: -356.7, b: 364.7, a: -566.3, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler62 = device0.createSampler({addressModeV: 'clamp-to-edge', mipmapFilter: 'nearest', lodMinClamp: 83.13, lodMaxClamp: 98.96});
try {
computePassEncoder3.setBindGroup(0, bindGroup18);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder65.setPipeline(pipeline0);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
let buffer76 = device0.createBuffer({
  size: 7519,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let texture95 = device0.createTexture({size: [4], dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.TEXTURE_BINDING});
let textureView93 = texture13.createView({});
let computePassEncoder67 = commandEncoder89.beginComputePass({});
let sampler63 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 94.75,
  lodMaxClamp: 94.88,
  maxAnisotropy: 20,
});
try {
computePassEncoder54.setBindGroup(1, bindGroup32, new Uint32Array(3822), 46, 0);
} catch {}
try {
computePassEncoder60.setPipeline(pipeline0);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
} catch {}
let imageData13 = new ImageData(4, 8);
let bindGroup39 = device0.createBindGroup({
  label: '\ubb4b\ua53c\u0aaa\u2340\u1574\u{1f602}\uc340\ue661\u14a3\u0aca\u{1f7b3}',
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer61, offset: 5120}}],
});
let commandEncoder91 = device0.createCommandEncoder({});
let textureView94 = texture52.createView({dimension: '2d-array'});
let computePassEncoder68 = commandEncoder91.beginComputePass({label: '\ua89d\u0a36\u1da6\u0a9e\u0a0d\u{1fa2a}\u0124'});
let sampler64 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 96.50,
  lodMaxClamp: 97.11,
});
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder67.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder22.setBindGroup(0, bindGroup13);
} catch {}
try {
renderPassEncoder15.setBindGroup(2, bindGroup5, new Uint32Array(1046), 168, 0);
} catch {}
try {
renderPassEncoder20.executeBundles([renderBundle8, renderBundle0, renderBundle2, renderBundle10, renderBundle10, renderBundle0, renderBundle7]);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer24, 'uint16', 276, 239);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 24, height: 114, depthOrArrayLayers: 1}
*/
{
  source: imageData2,
  origin: { x: 15, y: 0 },
  flipY: false,
}, {
  texture: texture78,
  mipLevel: 3,
  origin: {x: 0, y: 3, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 11, depthOrArrayLayers: 0});
} catch {}
let buffer77 = device0.createBuffer({
  size: 7792,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let querySet6 = device0.createQuerySet({type: 'occlusion', count: 1205});
let texture96 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  mipLevelCount: 5,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
try {
computePassEncoder63.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder61.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder24.setBindGroup(1, bindGroup17, new Uint32Array(220), 9, 0);
} catch {}
try {
renderPassEncoder33.executeBundles([renderBundle5, renderBundle9, renderBundle6, renderBundle5]);
} catch {}
try {
renderPassEncoder22.setViewport(0.13050444232555103, 0.016636339654572674, 0.5023928758075318, 0.5853504785355231, 0.36860201671632176, 0.6863245679887069);
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
try {
  await promise12;
} catch {}
document.body.append(canvas0);
try {
computePassEncoder66.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder22.setIndexBuffer(buffer19, 'uint16', 562, 172);
} catch {}
try {
renderPassEncoder21.setVertexBuffer(0, buffer48);
} catch {}
await gc();
let sampler65 = device0.createSampler({
  label: '\udfb9\u768c\u081a\u377b\u0353',
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  lodMinClamp: 75.86,
  lodMaxClamp: 83.88,
});
try {
computePassEncoder17.setBindGroup(0, bindGroup9);
} catch {}
try {
computePassEncoder66.setBindGroup(0, bindGroup25, new Uint32Array(2643), 349, 0);
} catch {}
try {
computePassEncoder68.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder13.setBindGroup(1, bindGroup23);
} catch {}
try {
device0.queue.submit([]);
} catch {}
let imageData14 = new ImageData(132, 40);
let shaderModule6 = device0.createShaderModule({
  code: `
enable f16;

requires readonly_and_readwrite_storage_textures;

diagnostic(info, xyz);

var<private> vp14: vec2i = vec2i();

override override27 = 0.1092;

fn fn0(a0: ptr<storage, array<u32>, read_write>) -> VertexOutput7 {
  var out: VertexOutput7;
  out.f42 = f32(fma(vec4h(f16(pack2x16snorm(vec2f(unconst_f32(0.1307), unconst_f32(0.06452))))), trunc(vec3h(unconst_f16(2406.0), unconst_f16(5756.3), unconst_f16(7881.8))).grbr, vec4h(unconst_f16(2830.1), unconst_f16(11359.3), unconst_f16(-40655.0), unconst_f16(1029.5)))[2]);
  let ptr94: ptr<storage, array<u32>, read_write> = &(*a0);
  out.f39 = vec4u(trunc(vec3h(f16((*ptr94)[arrayLength(&(*ptr94)) - 1]))).yxyz);
  (*a0)[u32(unconst_u32(247))] &= u32(vp13[26][0]);
  let vf87: u32 = arrayLength(&(*ptr94));
  out.f39 = bitcast<vec4u>(vp14.xxyx);
  vp13[u32(unconst_u32(258))][bitcast<vec2u>(unpack2x16float(u32(unconst_u32(259)))).r] = f16(pack2x16snorm(vec2f(unpack4xI8(u32(unconst_u32(80))).ag)));
  out.f44 += vec4f(f32(vp13[26][0]));
  let ptr95: ptr<private, array<f16, 1>> = &vp13[u32(unconst_u32(178))];
  let ptr96: ptr<private, array<array<f16, 1>, 27>> = &vp13;
  let vf88: i32 = sign(i32(unconst_i32(225)));
  out.f42 -= bitcast<f32>(override28);
  let ptr97: ptr<storage, u32, read_write> = &(*ptr94)[u32(unconst_u32(6))];
  out.f43 = vec2u(u32(vp13[u32(unconst_u32(47))][0]));
  let ptr98: ptr<storage, u32, read_write> = &(*ptr94)[u32(unconst_u32(8))];
  out.f44 *= unpack4x8snorm((*ptr97));
  let ptr99: ptr<private, array<array<f16, 1>, 27>> = &(*ptr96);
  let vf89: i32 = vp14[0];
  vp13[u32(unconst_u32(99))][u32((*ptr99)[26][u32(unconst_u32(190))])] = (*ptr95)[u32(unconst_u32(21))];
  var vf90: vec4f = ceil(vec4f(unconst_f32(0.3136), unconst_f32(-0.00138), unconst_f32(0.01533), unconst_f32(0.09050)));
  out.f38 *= bitcast<i32>((*ptr94)[arrayLength(&(*ptr94))]);
  out.f42 -= f32((*ptr99)[26][0]);
  let ptr100: ptr<storage, array<u32>, read_write> = &(*ptr94);
  return out;
  _ = override28;
}

var<private> vp13: array<array<f16, 1>, 27> = array<array<f16, 1>, 27>(array(f16()), array(f16()), array(f16()), array<f16, 1>(), array(f16()), array(f16()), array<f16, 1>(f16()), array(f16()), array<f16, 1>(f16()), array(f16()), array(f16()), array<f16, 1>(f16()), array(f16()), array(f16()), array(f16()), array(f16()), array(f16()), array<f16, 1>(), array<f16, 1>(f16()), array<f16, 1>(), array(f16()), array<f16, 1>(f16()), array(f16()), array(f16()), array<f16, 1>(f16()), array(f16()), array(f16()));

struct S4 {
  @location(1) @interpolate(flat) f0: i32,
}

struct S3 {
  @builtin(vertex_index) f0: u32,
  @location(6) @interpolate(flat, center) f1: u32,
  @location(9) f2: f32,
  @location(14) @interpolate(linear, center) f3: vec2h,
}

struct VertexOutput7 {
  @location(7) @interpolate(flat) f38: i32,
  @location(2) f39: vec4u,
  @location(3) @interpolate(flat) f40: vec2f,
  @location(9) @interpolate(perspective, centroid) f41: vec2h,
  @location(15) f42: f32,
  @location(10) f43: vec2u,
  @builtin(position) f44: vec4f,
  @location(0) @interpolate(flat, sample) f45: vec2f,
  @location(11) f46: u32,
}

fn unconst_i32(v: i32) -> i32 { return v; }

@id(22383) override override28: i32 = 24;

@id(43696) override override25: f32;

@group(0) @binding(78) var et4: texture_external;

@group(0) @binding(119) var<storage, read_write> buffer78: array<array<f16, 1>, 25>;

fn unconst_f16(v: f16) -> f16 { return v; }

override override29: f16;

@id(3177) override override26: u32 = 287;

fn unconst_u32(v: u32) -> u32 { return v; }

struct T0 {
  @size(20) f0: array<u32>,
}

@id(45330) override override24: f16 = 7497.4;

alias vec3b = vec3<bool>;

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

@vertex
fn vertex8(@location(0) @interpolate(flat) a0: vec2u, @location(8) @interpolate(flat) a1: i32, @location(7) a2: u32, @location(15) @interpolate(perspective) a3: vec4f, a4: S3, @location(12) a5: vec2i, @location(11) a6: vec2u, @location(2) @interpolate(perspective, center) a7: f32, a8: S4) -> VertexOutput7 {
  var out: VertexOutput7;
  vp14 = vec2i(unpack4xU8(u32(unconst_u32(118))).ar);
  var vf91: u32 = pack4xI8Clamp(vec4i(i32(tan(f16(unconst_f16(-4111.9))))));
  out.f41 -= bitcast<vec2h>(a4.f1);
  var vf92: u32 = a4.f1;
  let vf93: f32 = a3[a0[1]];
  out.f40 = vec2f(f32(vp14[1]));
  var vf94: vec2h = a4.f3;
  out.f46 = a6[0];
  var vf95: f32 = acosh(f32(unconst_f32(0.09187)));
  out.f45 = vec2f(f32(a5[0]));
  out.f45 = unpack2x16float(a4.f0);
  out.f40 = vec2f(f32(a5[0]));
  out.f43 = vec2u(vf94);
  return out;
}

@fragment
fn fragment6() -> @location(200) @interpolate(flat, sample) vec4f {
  var out: vec4f;
  let vf96: f32 = sign(f32(unconst_f32(0.00877)));
  let ptr101: ptr<storage, array<f16, 1>, read_write> = &buffer78[24];
  buffer78[vec3u(floor(vec3f(unconst_f32(0.07812), unconst_f32(0.05395), unconst_f32(0.3535))))[2]][u32(unconst_u32(288))] += vp13[u32(unconst_u32(70))][0];
  out = mix(vec2f(unconst_f32(0.2693), unconst_f32(0.5668)), vec2f(unconst_f32(0.2182), unconst_f32(0.00302)), f32(unconst_f32(0.3426))).yxyx;
  buffer78[u32(vp13[u32(buffer78[24][0])][0])][u32(unconst_u32(11))] = buffer78[24][0];
  let ptr102: ptr<private, array<f16, 1>> = &vp13[26];
  vp14 |= vec2i(i32((*&buffer78)[24][u32(unconst_u32(17))]));
  out = abs(vec3f(f32(override26))).zyyz;
  out = vec4f(f32(buffer78[u32(unconst_u32(155))][0]));
  let ptr103: ptr<storage, array<f16, 1>, read_write> = &buffer78[u32(unconst_u32(83))];
  let ptr104: ptr<storage, f16, read_write> = &(*ptr101)[0];
  let vf97: u32 = override26;
  return out;
  _ = override26;
}

@compute @workgroup_size(2, 1, 1)
fn compute6() {
  let ptr105: ptr<private, vec2i> = &vp14;
  var vf98: f16 = override24;
  var vf99: u32 = pack4xI8Clamp(vec4i(unconst_i32(-150), unconst_i32(12), unconst_i32(-11), unconst_i32(446)));
  let ptr106: ptr<private, array<f16, 1>> = &vp13[bitcast<u32>((*ptr105)[u32(unconst_u32(143))])];
  let ptr107: ptr<storage, f16, read_write> = &(*&buffer78)[24][0];
  let ptr108: ptr<function, f16> = &vf98;
  vf98 = (*ptr107);
  var vf100: vec3f = smoothstep(vec3f((*ptr105).grr), vec3f(unconst_f32(0.05585), unconst_f32(0.03935), unconst_f32(0.1170)), vec3f(unconst_f32(0.3088), unconst_f32(0.1351), unconst_f32(0.1504)));
  let ptr109: ptr<private, array<f16, 1>> = &vp13[26];
  vp14 &= vec2i(i32(vp13[u32((*ptr109)[0])][0]));
  vp13[u32(unconst_u32(39))][u32(unconst_u32(208))] *= vp13[26][0];
  let ptr110: ptr<storage, f16, read_write> = &buffer78[24][0];
  let ptr111: ptr<storage, f16, read_write> = &(*&buffer78)[24][0];
  vp14 *= vec2i(i32(vf98));
  _ = override24;
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup40 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 67, resource: sampler62}, {binding: 126, resource: textureView29}],
});
let buffer79 = device0.createBuffer({size: 15040, usage: GPUBufferUsage.INDEX});
let texture97 = device0.createTexture({size: [8, 1, 31], format: 'rgba16float', usage: GPUTextureUsage.COPY_DST});
let sampler66 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  lodMinClamp: 22.72,
  lodMaxClamp: 30.14,
});
try {
computePassEncoder43.setBindGroup(3, bindGroup16);
} catch {}
try {
renderPassEncoder34.setBindGroup(3, bindGroup34);
} catch {}
try {
renderPassEncoder30.setIndexBuffer(buffer65, 'uint16', 2_578, 3_741);
} catch {}
try {
device0.queue.writeBuffer(buffer76, 2776, new Int16Array(11018), 2083, 40);
} catch {}
document.body.append(canvas0);
let bindGroup41 = device0.createBindGroup({
  layout: bindGroupLayout9,
  entries: [{binding: 22, resource: {buffer: buffer68, offset: 1024, size: 1988}}],
});
let commandEncoder92 = device0.createCommandEncoder({});
let textureView95 = texture81.createView({baseArrayLayer: 3, arrayLayerCount: 2});
let renderPassEncoder35 = commandEncoder92.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -713.0, g: 225.1, b: -483.9, a: 269.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let sampler67 = device0.createSampler({addressModeV: 'clamp-to-edge', minFilter: 'nearest', lodMinClamp: 88.94, lodMaxClamp: 89.99});
try {
computePassEncoder23.setBindGroup(0, bindGroup14);
} catch {}
try {
computePassEncoder31.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder10.executeBundles([renderBundle2]);
} catch {}
let buffer80 = device0.createBuffer({
  label: '\u{1fa82}\ubcde\u{1fe60}\u{1ff8b}',
  size: 3154,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});
try {
computePassEncoder67.setBindGroup(0, bindGroup17, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer77, 1_168); };
} catch {}
try {
renderPassEncoder33.setBindGroup(1, bindGroup41, new Uint32Array(1576), 287, 0);
} catch {}
try {
renderPassEncoder8.setStencilReference(2052);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 96, height: 456, depthOrArrayLayers: 1}
*/
{
  source: videoFrame4,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture48,
  mipLevel: 0,
  origin: {x: 1, y: 60, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
let textureView96 = texture76.createView({baseArrayLayer: 1, arrayLayerCount: 1});
let texture98 = device0.createTexture({size: [4, 1, 16], format: 'rgb10a2uint', usage: GPUTextureUsage.COPY_SRC, viewFormats: []});
let textureView97 = texture37.createView({});
try {
computePassEncoder58.setBindGroup(3, bindGroup24, new Uint32Array(587), 101, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1, 1); };
} catch {}
try {
renderPassEncoder30.setBindGroup(2, bindGroup10);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle1, renderBundle10, renderBundle10]);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(2, buffer76, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let texture99 = device0.createTexture({
  label: '\u{1fd3c}\u9bcf\u8ed0\u0efc\u667d\u0e4a',
  size: {width: 192, height: 912, depthOrArrayLayers: 15},
  mipLevelCount: 1,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder41.setBindGroup(2, bindGroup6);
} catch {}
try {
renderPassEncoder21.setBindGroup(2, bindGroup41);
} catch {}
let videoFrame12 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'rgb', primaries: 'jedecP22Phosphors', transfer: 'smpte170m'} });
let bindGroup42 = device0.createBindGroup({
  label: '\u7011\u8d59\uec0e\u0bc0\ud4ee\u{1fbbc}\ua356\u871e\u{1fbb9}\u04ab\u{1fe6c}',
  layout: bindGroupLayout14,
  entries: [{binding: 41, resource: {buffer: buffer26, offset: 6144, size: 2229}}],
});
let commandEncoder93 = device0.createCommandEncoder({label: '\ua11b\u06fa\u{1fe53}\uec5b\u04e8\ubcc0\u008d\u974e'});
let texture100 = device0.createTexture({
  label: '\u6285\ue304\u0bba\u8801\u5d64\u0217\u0a3c\u0375\u1656',
  size: {width: 1},
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let sampler68 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 31.89,
  lodMaxClamp: 67.04,
});
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroups(1); };
} catch {}
let buffer81 = device0.createBuffer({
  size: 7790,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let computePassEncoder69 = commandEncoder93.beginComputePass({});
try {
computePassEncoder69.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder24.setBindGroup(3, bindGroup32);
} catch {}
try {
renderPassEncoder26.setBindGroup(0, bindGroup16, new Uint32Array(805), 215, 0);
} catch {}
try {
renderPassEncoder33.setIndexBuffer(buffer79, 'uint16', 1_510, 9_062);
} catch {}
try {
renderPassEncoder9.setVertexBuffer(6, buffer74, 0, 87);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture65,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(156).fill(162), /* required buffer size: 156 */
{offset: 156, bytesPerRow: 16}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup43 = device0.createBindGroup({layout: bindGroupLayout4, entries: [{binding: 175, resource: textureView9}]});
let commandEncoder94 = device0.createCommandEncoder({});
let computePassEncoder70 = commandEncoder94.beginComputePass({});
try {
computePassEncoder70.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder17.beginOcclusionQuery(146);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(2, buffer81);
} catch {}
try {
gpuCanvasContext3.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_SRC});
} catch {}
try {
adapter0.label = '\u0e53\u115b';
} catch {}
let bindGroupLayout17 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 441,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
    {
      binding: 211,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'rg32float', access: 'write-only', viewDimension: '2d-array' },
    },
    {binding: 231, visibility: GPUShaderStage.FRAGMENT, externalTexture: {}},
    {
      binding: 25,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32sint', access: 'read-write', viewDimension: '2d-array' },
    },
    {
      binding: 82,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      sampler: { type: 'non-filtering' },
    },
  ],
});
let texture101 = device0.createTexture({
  size: [192, 912, 1],
  mipLevelCount: 1,
  format: 'rg32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture102 = device0.createTexture({
  size: [4, 1, 75],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
try {
computePassEncoder66.setBindGroup(3, bindGroup27, new Uint32Array(1784), 1_041, 0);
} catch {}
try {
renderPassEncoder17.endOcclusionQuery();
} catch {}
try {
renderPassEncoder26.setIndexBuffer(buffer9, 'uint16', 206, 92);
} catch {}
try {
device0.queue.writeBuffer(buffer39, 4796, new Int16Array(2651), 504, 440);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData7,
  origin: { x: 2, y: 8 },
  flipY: true,
}, {
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let bindGroup44 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 2, resource: textureView61}]});
let texture103 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  format: 'rg32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder28.executeBundles([renderBundle5, renderBundle9, renderBundle3]);
} catch {}
try {
renderPassEncoder5.setStencilReference(1853);
} catch {}
try {
renderPassEncoder9.setIndexBuffer(buffer69, 'uint16', 514, 12);
} catch {}
try {
buffer81.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer56, 332, new BigUint64Array(10618), 830, 24);
} catch {}
let videoFrame13 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'unspecified', primaries: 'smpte432', transfer: 'gamma28curve'} });
let bindGroup45 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 2, resource: textureView61}]});
let texture104 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler69 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 6.225,
  lodMaxClamp: 20.99,
  compare: 'less-equal',
});
try {
computePassEncoder18.setBindGroup(2, bindGroup41);
} catch {}
try {
renderPassEncoder6.setBindGroup(3, bindGroup44);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer9, 'uint16', 194, 1_692);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture50,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(113).fill(154), /* required buffer size: 113 */
{offset: 113}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer82 = device0.createBuffer({
  size: 6525,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM,
});
let texture105 = device0.createTexture({
  size: [1, 1, 1],
  mipLevelCount: 1,
  format: 'r32sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder27.setBindGroup(3, bindGroup26);
} catch {}
try {
computePassEncoder21.end();
} catch {}
try {
renderPassEncoder15.setBindGroup(0, bindGroup45);
} catch {}
try {
commandEncoder25.resolveQuerySet(querySet3, 10, 8, buffer13, 0);
} catch {}
let commandEncoder95 = device0.createCommandEncoder();
let textureView98 = texture105.createView({dimension: '2d-array'});
let texture106 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 311},
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let texture107 = gpuCanvasContext0.getCurrentTexture();
let textureView99 = texture82.createView({dimension: '2d-array', mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder71 = commandEncoder95.beginComputePass({});
let renderPassEncoder36 = commandEncoder25.beginRenderPass({
  colorAttachments: [{
  view: textureView94,
  clearValue: { r: -996.5, g: 24.99, b: 821.6, a: 453.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 510959232,
});
try {
{ clearResourceUsages(device0, computePassEncoder30); computePassEncoder30.dispatchWorkgroupsIndirect(buffer19, 228); };
} catch {}
try {
computePassEncoder71.setPipeline(pipeline0);
} catch {}
let buffer83 = device0.createBuffer({
  label: '\u8051\u76a9\u0b49\ude3d\u08e8',
  size: 28353,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let textureView100 = texture103.createView({dimension: '2d-array', arrayLayerCount: 1});
let textureView101 = texture91.createView({});
let sampler70 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 93.36,
});
try {
computePassEncoder18.setBindGroup(2, bindGroup32);
} catch {}
try {
computePassEncoder42.setBindGroup(1, bindGroup8, new Uint32Array(203), 103, 0);
} catch {}
try {
computePassEncoder30.end();
} catch {}
try {
computePassEncoder51.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer40, 'uint32', 888, 700);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(3, buffer48);
} catch {}
try {
commandEncoder43.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 1088 */
  offset: 1088,
  bytesPerRow: 256,
  buffer: buffer40,
}, {
  texture: texture50,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(canvas0);
let commandEncoder96 = device0.createCommandEncoder({});
let texture108 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC,
  viewFormats: [],
});
let textureView102 = texture4.createView({});
let computePassEncoder72 = commandEncoder43.beginComputePass({label: '\uf815\uf683\u0b21\u0e09\u{1f894}\u71a8\u{1fecd}\u0001\u1927\uc138\u6f10'});
let sampler71 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 20.18,
  lodMaxClamp: 59.46,
  maxAnisotropy: 7,
});
try {
{ clearResourceUsages(device0, computePassEncoder11); computePassEncoder11.dispatchWorkgroupsIndirect(buffer81, 588); };
} catch {}
try {
renderPassEncoder15.setBindGroup(1, bindGroup20);
} catch {}
let arrayBuffer8 = buffer14.getMappedRange(9688, 72);
try {
  await promise10;
} catch {}
let texture109 = device0.createTexture({
  size: [48, 228, 1],
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder73 = commandEncoder96.beginComputePass({});
try {
renderPassEncoder9.executeBundles([renderBundle7, renderBundle10, renderBundle7]);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer50, 'uint16', 296, 938);
} catch {}
try {
renderPassEncoder20.setVertexBuffer(4, buffer34, 0, 268);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'display-p3',
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
if (!arrayBuffer8.detached) { new Uint8Array(arrayBuffer8).fill(0x55); };
} catch {}
let bindGroupLayout18 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 188,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      sampler: { type: 'filtering' },
    },
  ],
});
let commandEncoder97 = device0.createCommandEncoder({});
let textureView103 = texture103.createView({dimension: '2d-array'});
let sampler72 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 35.43,
  lodMaxClamp: 80.87,
  maxAnisotropy: 5,
});
try {
computePassEncoder60.setBindGroup(0, bindGroup1);
} catch {}
try {
computePassEncoder66.setBindGroup(3, bindGroup1, new Uint32Array(2287), 287, 0);
} catch {}
try {
computePassEncoder73.setPipeline(pipeline0);
} catch {}
try {
commandEncoder97.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1184 */
  offset: 1184,
  bytesPerRow: 4352,
  buffer: buffer35,
}, {
  texture: texture78,
  mipLevel: 4,
  origin: {x: 2, y: 9, z: 0},
  aspect: 'all',
}, {width: 0, height: 2, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture19,
  mipLevel: 1,
  origin: {x: 28, y: 24, z: 9},
  aspect: 'all',
}, new Uint8Array(8_799).fill(181), /* required buffer size: 8_799 */
{offset: 151, bytesPerRow: 188, rowsPerImage: 23}, {width: 12, height: 0, depthOrArrayLayers: 3});
} catch {}
let textureView104 = texture69.createView({dimension: '2d-array', aspect: 'all', baseMipLevel: 0, arrayLayerCount: 1});
let computePassEncoder74 = commandEncoder97.beginComputePass({});
let sampler73 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 25.38,
  lodMaxClamp: 90.93,
  maxAnisotropy: 1,
});
try {
computePassEncoder22.setBindGroup(2, bindGroup21, new Uint32Array(662), 143, 0);
} catch {}
try {
computePassEncoder72.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder34.setBindGroup(1, bindGroup10);
} catch {}
try {
renderPassEncoder10.executeBundles([renderBundle8]);
} catch {}
try {
renderPassEncoder32.setViewport(74.13965033939752, 31.933556181682867, 11.992345579432369, 30.940852308997812, 0.3861502798985237, 0.8420369184014038);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture52,
  mipLevel: 0,
  origin: {x: 0, y: 18, z: 0},
  aspect: 'all',
}, new Uint8Array(759).fill(112), /* required buffer size: 759 */
{offset: 759, bytesPerRow: 160}, {width: 29, height: 2, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout14 = device0.createPipelineLayout({label: '\u0f15\u45b2\u0db2\u{1fc23}', bindGroupLayouts: []});
try {
computePassEncoder37.setBindGroup(1, bindGroup35);
} catch {}
try {
computePassEncoder11.end();
} catch {}
try {
computePassEncoder74.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup12, new Uint32Array(211), 6, 0);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer70, 'uint16', 942, 4_989);
} catch {}
try {
renderPassEncoder13.setVertexBuffer(6, buffer64, 116, 10_758);
} catch {}
try {
if (!arrayBuffer6.detached) { new Uint8Array(arrayBuffer6).fill(0x55); };
} catch {}
let textureView105 = texture11.createView({dimension: '2d-array', format: 'r16float', baseMipLevel: 1, mipLevelCount: 1});
let sampler74 = device0.createSampler({
  label: '\u{1fe1d}\u0f73\u0479\u619e\u{1fe49}\u514f\u09c1\u{1fbab}\u{1fa73}',
  addressModeU: 'repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 0.9342,
});
try {
renderPassEncoder19.setBindGroup(0, bindGroup34);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer50, 'uint32', 420, 1_503);
} catch {}
let buffer84 = device0.createBuffer({
  label: '\u500f\u6db4\u0813\u9c3e\u14b5\u4d29\u071b\u4e55\u798b',
  size: 12056,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let texture110 = device0.createTexture({
  size: [96, 456, 1],
  mipLevelCount: 1,
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder48.setBindGroup(1, bindGroup15);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroupsIndirect(buffer44, 816); };
} catch {}
try {
renderPassEncoder33.executeBundles([renderBundle3, renderBundle5, renderBundle4]);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer81, 'uint16', 524, 1_043);
} catch {}
try {
renderPassEncoder33.setVertexBuffer(1, buffer12);
} catch {}
try {
  await buffer72.mapAsync(GPUMapMode.WRITE, 168, 28);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture75,
  mipLevel: 1,
  origin: {x: 9, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(492).fill(105), /* required buffer size: 492 */
{offset: 492, bytesPerRow: 80}, {width: 6, height: 8, depthOrArrayLayers: 0});
} catch {}
let videoFrame14 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'smpte240m', primaries: 'smpteRp431', transfer: 'linear'} });
let computePassEncoder75 = commandEncoder12.beginComputePass({label: '\ua7e7\u6ad0\u{1f6d3}\u8fca\u390a\u06a5\u0b7b\ubd17\u3bdb'});
let renderBundleEncoder11 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], depthReadOnly: true, stencilReadOnly: true});
try {
computePassEncoder37.setBindGroup(0, bindGroup21, new Uint32Array(1736), 55, 0);
} catch {}
try {
computePassEncoder75.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder24.setBindGroup(1, bindGroup28);
} catch {}
try {
renderPassEncoder6.setViewport(1.226067708383108, 0.4211318532356647, 0.4438759807900373, 0.13102763833874378, 0.6152471220680726, 0.9638806710224784);
} catch {}
try {
renderBundleEncoder11.setBindGroup(1, bindGroup17, new Uint32Array(3934), 1_199, 0);
} catch {}
try {
renderBundleEncoder11.setVertexBuffer(1, buffer19, 584, 483);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData4,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 0,
  origin: {x: 10, y: 1, z: 5},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 1, depthOrArrayLayers: 0});
} catch {}
let bindGroup46 = device0.createBindGroup({
  label: '\u{1fd39}\ue4d5\u05d4\u049b\u72e2',
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView25}, {binding: 177, resource: textureView86}],
});
let texture111 = device0.createTexture({
  size: [256, 256, 17],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView106 = texture57.createView({label: '\u8407\ubf2e\ufdd8\uc372\u0439\ue734', dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder27.setBindGroup(3, bindGroup30);
} catch {}
try {
computePassEncoder18.setBindGroup(0, bindGroup1, new Uint32Array(729), 36, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroupsIndirect(buffer36, 8); };
} catch {}
try {
renderBundleEncoder11.setBindGroup(0, bindGroup6);
} catch {}
try {
renderBundleEncoder11.setIndexBuffer(buffer24, 'uint16', 156, 462);
} catch {}
let promise13 = shaderModule3.getCompilationInfo();
let commandEncoder98 = device0.createCommandEncoder({});
let computePassEncoder76 = commandEncoder98.beginComputePass({label: '\u{1fbc4}\u0dc1\uc177\ua322\u048c'});
try {
renderPassEncoder27.executeBundles([renderBundle5]);
} catch {}
try {
renderBundleEncoder11.setIndexBuffer(buffer24, 'uint16', 154, 129);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 22, y: 14, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
try {
globalThis.someLabel = externalTexture6.label;
} catch {}
let commandEncoder99 = device0.createCommandEncoder({});
let computePassEncoder77 = commandEncoder99.beginComputePass({});
let renderBundle11 = renderBundleEncoder11.finish({label: '\u07fe\u{1ff19}\u{1fe89}\u{1fe15}\u0e36\ub374\uf28a\u08de\u{1f94c}\u0960\u0833'});
let sampler75 = device0.createSampler({
  label: '\u92aa\u06c5\u{1fd6e}\u85fc\u23dc\u6f66\uf720\u7262\u7753',
  addressModeU: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 5.317,
  lodMaxClamp: 78.66,
  maxAnisotropy: 13,
});
let externalTexture7 = device0.importExternalTexture({
  label: '\u{1f86d}\u069b\u8799\u0468\u1323\u0433\u00b1\u8874\u2b8e\u{1fe28}\u46d3',
  source: videoFrame9,
});
try {
computePassEncoder34.setBindGroup(3, bindGroup24, []);
} catch {}
try {
computePassEncoder76.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.insertDebugMarker('\u06dd');
} catch {}
document.body.append(canvas0);
let buffer85 = device0.createBuffer({size: 2963, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX});
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder17.setVertexBuffer(3, buffer43);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
buffer20.unmap();
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let img1 = await imageWithData(29, 15, '#10101010', '#20202020');
let bindGroup47 = device0.createBindGroup({layout: bindGroupLayout7, entries: [{binding: 218, resource: textureView87}]});
let commandEncoder100 = device0.createCommandEncoder({label: '\u88cb\u{1fef3}'});
let computePassEncoder78 = commandEncoder100.beginComputePass({label: '\u9784\u0991\u3653\u8617\u{1fa21}\u{1fb1e}\u0f69'});
try {
computePassEncoder5.setBindGroup(1, bindGroup41, new Uint32Array(208), 0, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroupsIndirect(buffer36, 4); };
} catch {}
try {
computePassEncoder78.setPipeline(pipeline1);
} catch {}
let bindGroup48 = device0.createBindGroup({layout: bindGroupLayout4, entries: [{binding: 175, resource: textureView9}]});
let textureView107 = texture104.createView({dimension: '2d-array', aspect: 'all', mipLevelCount: 1});
let sampler76 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 0.9318,
  lodMaxClamp: 31.50,
});
try {
renderPassEncoder7.setVertexBuffer(3, buffer76);
} catch {}
try {
computePassEncoder67.setBindGroup(2, bindGroup20);
} catch {}
try {
computePassEncoder77.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup27, new Uint32Array(1886), 475, 0);
} catch {}
try {
renderPassEncoder11.setViewport(0.534682453974956, 0.591195766202969, 0.4121636003140838, 0.13758317900590344, 0.7715418712040022, 0.9312808957640959);
} catch {}
let shaderModule7 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

enable f16;

enable f16;

requires unrestricted_pointer_parameters;

enable f16;

fn unconst_bool(v: bool) -> bool { return v; }

@group(0) @binding(119) var<storage, read_write> buffer86: array<array<array<array<array<f16, 5>, 1>, 1>, 1>, 5>;

@group(0) @binding(78) var et5: texture_external;

fn unconst_i32(v: i32) -> i32 { return v; }

@group(0) @binding(204) var<storage, read> buffer87: array<array<f32, 5>>;

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

struct T0 {
  @align(1) f0: array<array<vec2i, 1>, 1>,
}

fn unconst_f16(v: f16) -> f16 { return v; }

@compute @workgroup_size(2, 1, 1)
fn compute7() {
  buffer86[u32(unconst_u32(13))][pack4x8unorm(log2(vec4f(buffer87[arrayLength(&buffer87)][4])))][u32(unconst_u32(117))][u32(buffer87[arrayLength(&buffer87)][4])][u32(buffer86[4][0][u32(unconst_u32(200))][0][4])] = f16(buffer87[arrayLength(&buffer87)][4]);
  let ptr112: ptr<storage, array<array<array<f16, 5>, 1>, 1>, read_write> = &(*&buffer86)[4][0];
  let ptr113: ptr<storage, array<f16, 5>, read_write> = &(*&buffer86)[4][0][0][u32(unconst_u32(47))];
  buffer86[u32(unconst_u32(248))][u32((*ptr112)[0][0][u32(buffer86[4][0][0][0][4])])][u32(unconst_u32(118))][u32((*&buffer87)[arrayLength(&(*&buffer87))][4])][u32(unconst_u32(403))] = (*&buffer86)[4][0][0][0][4];
  let ptr114: ptr<storage, f16, read_write> = &(*ptr113)[4];
  let ptr115: ptr<storage, array<array<array<f16, 5>, 1>, 1>, read_write> = &buffer86[4][u32(unconst_u32(475))];
  buffer86[u32(buffer86[4][u32(unconst_u32(15))][0][0][4])][u32(determinant(mat2x2h((*ptr115)[0][0][4], (*ptr115)[0][0][4], (*ptr115)[0][0][4], (*ptr115)[0][0][4])))][u32(unconst_u32(130))][u32(unconst_u32(199))][u32(unconst_u32(2))] += f16((*&buffer87)[arrayLength(&(*&buffer87))][4]);
  buffer86[countTrailingZeros(vec3u(unconst_u32(85), unconst_u32(95), unconst_u32(145))).x][0][u32(unconst_u32(73))][u32(unconst_u32(202))][u32(unconst_u32(255))] = buffer86[4][0][0][0][4];
  let ptr116: ptr<storage, array<array<array<f16, 5>, 1>, 1>, read_write> = &buffer86[4][0];
  buffer86[pack4x8unorm(max(vec4f(unconst_f32(0.1134), unconst_f32(0.1306), unconst_f32(0.2173), unconst_f32(0.1098)), vec4f(unconst_f32(0.1901), unconst_f32(0.04061), unconst_f32(0.04589), unconst_f32(0.3579))))][u32(unconst_u32(20))][u32((*&buffer86)[4][u32((*ptr112)[0][u32((*ptr112)[0][0][4])][4])][0][0][4])][u32(unconst_u32(136))][u32(buffer86[4][0][0][0][4])] = (*ptr116)[0][0][4];
  buffer86[u32((*&buffer87)[arrayLength(&(*&buffer87)) - 1][4])][pack4x8snorm(asinh(vec4f(unconst_f32(0.03910), unconst_f32(0.03915), unconst_f32(0.1362), unconst_f32(0.4795))))][u32(buffer86[4][0][0][0][4])][u32((*ptr116)[0][0][u32(unconst_u32(23))])][u32(unconst_u32(250))] = f16(arrayLength(&buffer87));
  let ptr117: ptr<storage, array<array<f16, 5>, 1>, read_write> = &(*&buffer86)[4][0][0];
  buffer86[u32(unconst_u32(98))][0][0][u32(buffer87[arrayLength(&buffer87) - 1][4])][u32(unconst_u32(95))] = buffer86[4][0][0][0][4];
  let ptr118: ptr<storage, array<f32, 5>, read> = &(*&buffer87)[i32(unconst_i32(37))];
  let ptr119: ptr<storage, array<array<array<f16, 5>, 1>, 1>, read_write> = &buffer86[4][u32((*ptr112)[0][0][4])];
  buffer86[u32(unconst_u32(38))][u32((*ptr116)[0][0][4])][0][u32((*ptr115)[0][0][4])][u32(unconst_u32(416))] *= (*&buffer86)[4][0][0][0][4];
  let ptr120: ptr<storage, array<array<f32, 5>>, read> = &buffer87;
  let ptr121: ptr<storage, array<array<f16, 5>, 1>, read_write> = &(*&buffer86)[4][0][0];
  let ptr122: ptr<storage, array<f32, 5>, read> = &(*&buffer87)[arrayLength(&(*&buffer87))];
  buffer86[u32((*ptr116)[0][0][u32((*ptr119)[0][0][u32((*&buffer87)[i32(unconst_i32(-151))][4])])])][u32(unconst_u32(47))][u32(unconst_u32(39))][u32(buffer86[4][0][0][0][4])][u32(unconst_u32(371))] = f16((*&buffer87)[arrayLength(&(*&buffer87))][4]);
  let ptr123: ptr<storage, f16, read_write> = &(*ptr119)[0][0][u32(unconst_u32(147))];
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup49 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 13, resource: {buffer: buffer0, offset: 5632, size: 996}},
    {binding: 138, resource: textureView38},
  ],
});
let buffer88 = device0.createBuffer({size: 18308, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture112 = device0.createTexture({
  size: [4, 1, 3],
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView108 = texture99.createView({});
try {
computePassEncoder36.setBindGroup(0, bindGroup10, new Uint32Array(342), 17, 0);
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer0, 'uint32', 560, 3_874);
} catch {}
let buffer89 = device0.createBuffer({size: 11526, usage: GPUBufferUsage.INDEX | GPUBufferUsage.VERTEX});
let commandEncoder101 = device0.createCommandEncoder({});
let renderPassEncoder37 = commandEncoder101.beginRenderPass({
  colorAttachments: [{
  view: textureView104,
  clearValue: { r: 461.7, g: 427.7, b: -305.9, a: -275.4, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let externalTexture8 = device0.importExternalTexture({source: videoFrame3, colorSpace: 'display-p3'});
try {
computePassEncoder2.setBindGroup(3, bindGroup7);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
document.body.append(img0);
try {
renderPassEncoder30.setBindGroup(3, bindGroup0);
} catch {}
try {
renderPassEncoder26.setIndexBuffer(buffer48, 'uint32', 3_600, 450);
} catch {}
try {
renderPassEncoder9.setVertexBuffer(4, buffer42, 520);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 48, height: 228, depthOrArrayLayers: 1}
*/
{
  source: imageData3,
  origin: { x: 8, y: 1 },
  flipY: false,
}, {
  texture: texture78,
  mipLevel: 2,
  origin: {x: 0, y: 16, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let textureView109 = texture94.createView({dimension: '2d-array', arrayLayerCount: 1});
try {
computePassEncoder65.setBindGroup(0, bindGroup21);
} catch {}
try {
computePassEncoder77.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder30.setBindGroup(1, bindGroup9);
} catch {}
try {
  await promise13;
} catch {}
let texture113 = device0.createTexture({
  size: [256, 256, 17],
  mipLevelCount: 2,
  format: 'depth24plus',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture114 = device0.createTexture({size: {width: 48}, dimension: '1d', format: 'rgba16float', usage: GPUTextureUsage.STORAGE_BINDING});
try {
computePassEncoder41.setBindGroup(2, bindGroup3);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder22.setBindGroup(3, bindGroup49, new Uint32Array(105), 0, 0);
} catch {}
let offscreenCanvas3 = new OffscreenCanvas(304, 16);
let videoFrame15 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'smpte240m', primaries: 'jedecP22Phosphors', transfer: 'logSqrt'} });
let buffer90 = device0.createBuffer({size: 7161, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder102 = device0.createCommandEncoder();
let texture115 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder79 = commandEncoder102.beginComputePass({});
try {
renderPassEncoder9.setBindGroup(1, bindGroup45, new Uint32Array(1395), 373, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture80,
  mipLevel: 1,
  origin: {x: 19, y: 11, z: 0},
  aspect: 'all',
}, new Uint8Array(5_641).fill(92), /* required buffer size: 5_641 */
{offset: 1, bytesPerRow: 28}, {width: 3, height: 202, depthOrArrayLayers: 1});
} catch {}
try {
computePassEncoder79.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer15, 'uint16', 772, 1_625);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture41,
  mipLevel: 0,
  origin: {x: 52, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(124).fill(168), /* required buffer size: 124 */
{offset: 124}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let gpuCanvasContext4 = offscreenCanvas3.getContext('webgpu');
try {
if (!arrayBuffer4.detached) { new Uint8Array(arrayBuffer4).fill(0x55); };
} catch {}
try {
  await promise11;
} catch {}
let offscreenCanvas4 = new OffscreenCanvas(256, 141);
let commandEncoder103 = device0.createCommandEncoder({});
let bindGroup50 = device0.createBindGroup({layout: bindGroupLayout4, entries: [{binding: 175, resource: textureView32}]});
let commandEncoder104 = device0.createCommandEncoder({label: '\u{1fb6e}\u{1fa85}\u9c36\u1508\uf73a\u0317\u0d8a\ua003\u5548'});
let texture116 = device0.createTexture({
  size: {width: 4},
  mipLevelCount: 1,
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1, 3, 1); };
} catch {}
try {
renderPassEncoder3.setVertexBuffer(4, buffer45, 1_620);
} catch {}
try {
commandEncoder103.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 576 */
  offset: 576,
  bytesPerRow: 2816,
  buffer: buffer84,
}, {
  texture: texture75,
  mipLevel: 1,
  origin: {x: 1, y: 9, z: 0},
  aspect: 'all',
}, {width: 0, height: 20, depthOrArrayLayers: 0});
} catch {}
let buffer91 = device0.createBuffer({size: 7855, usage: GPUBufferUsage.INDIRECT});
let texture117 = device0.createTexture({
  size: [1, 1, 15],
  mipLevelCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder80 = commandEncoder103.beginComputePass({});
let renderPassEncoder38 = commandEncoder104.beginRenderPass({colorAttachments: [{view: textureView94, loadOp: 'clear', storeOp: 'store'}]});
try {
computePassEncoder48.setBindGroup(3, bindGroup19, new Uint32Array(1293), 4, 0);
} catch {}
try {
computePassEncoder80.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(3, bindGroup45);
} catch {}
try {
renderPassEncoder9.setBlendConstant({ r: 262.0, g: -760.3, b: 637.6, a: -206.9, });
} catch {}
try {
renderPassEncoder19.setIndexBuffer(buffer20, 'uint16', 8_844, 2_464);
} catch {}
try {
renderPassEncoder14.setVertexBuffer(6, buffer47, 16_512, 10_678);
} catch {}
try {
device0.queue.writeBuffer(buffer31, 112, new DataView(new ArrayBuffer(3763)), 293, 204);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 1, depthOrArrayLayers: 62}
*/
{
  source: offscreenCanvas2,
  origin: { x: 20, y: 3 },
  flipY: false,
}, {
  texture: texture28,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 5},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
try {
computePassEncoder70.setBindGroup(1, bindGroup50);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder32.executeBundles([renderBundle9, renderBundle3]);
} catch {}
try {
renderPassEncoder22.setStencilReference(710);
} catch {}
try {
device0.queue.writeBuffer(buffer26, 2180, new Int16Array(5881), 26, 2200);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture32,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 43},
  aspect: 'all',
}, new Uint8Array(73_113).fill(18), /* required buffer size: 73_113 */
{offset: 54, bytesPerRow: 7, rowsPerImage: 49}, {width: 0, height: 0, depthOrArrayLayers: 214});
} catch {}
let gpuCanvasContext5 = offscreenCanvas4.getContext('webgpu');
let buffer92 = device0.createBuffer({size: 13942, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.VERTEX});
let texture118 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1289},
  dimension: '3d',
  format: 'rg8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroups(3, 1); };
} catch {}
try {
renderPassEncoder30.setBindGroup(1, bindGroup5, new Uint32Array(4929), 1_406, 0);
} catch {}
let pipeline2 = device0.createRenderPipeline({
  layout: pipelineLayout10,
  multisample: {},
  fragment: {
  module: shaderModule2,
  constants: {9_309: 0, 17_568: 0, 13_010: 0},
  targets: [{format: 'rgba16float', writeMask: GPUColorWrite.RED}],
},
  vertex: {
    module: shaderModule4,
    buffers: [
      {
        arrayStride: 68,
        stepMode: 'instance',
        attributes: [{format: 'sint8x2', offset: 14, shaderLocation: 0}],
      },
    ],
  },
  primitive: {frontFace: 'cw', cullMode: 'back'},
});
let bindGroup51 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 177, resource: textureView80}, {binding: 381, resource: textureView35}],
});
let buffer93 = device0.createBuffer({size: 3372, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX});
let querySet7 = device0.createQuerySet({type: 'occlusion', count: 1321});
let sampler77 = device0.createSampler({addressModeW: 'mirror-repeat', lodMinClamp: 96.30, lodMaxClamp: 99.44, compare: 'less'});
try {
renderPassEncoder9.setIndexBuffer(buffer79, 'uint32', 1_604, 2_333);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline2);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 128, height: 128, depthOrArrayLayers: 17}
*/
{
  source: imageData5,
  origin: { x: 1, y: 2 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 1,
  origin: {x: 3, y: 10, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 5, height: 9, depthOrArrayLayers: 0});
} catch {}
let commandEncoder105 = device0.createCommandEncoder({});
let texture119 = device0.createTexture({
  label: '\u{1ffee}\u28fc\u0635\u0036\ua986\u{1f932}',
  size: [48, 228, 1],
  mipLevelCount: 6,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder39 = commandEncoder105.beginRenderPass({
  colorAttachments: [{
  view: textureView77,
  clearValue: { r: -828.0, g: -754.0, b: 266.4, a: 646.7, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let sampler78 = device0.createSampler({
  label: '\u4a12\ua125\u07b3',
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 70.74,
  lodMaxClamp: 81.57,
  maxAnisotropy: 20,
});
try {
computePassEncoder14.setBindGroup(0, bindGroup41, new Uint32Array(4043), 773, 0);
} catch {}
try {
renderPassEncoder4.setBindGroup(3, bindGroup24, new Uint32Array(748), 118, 0);
} catch {}
try {
renderPassEncoder15.executeBundles([renderBundle7, renderBundle7]);
} catch {}
try {
renderPassEncoder30.setBlendConstant({ r: 937.1, g: 60.74, b: 133.7, a: -599.5, });
} catch {}
try {
renderPassEncoder28.setVertexBuffer(5, buffer15, 464);
} catch {}
let imageData15 = new ImageData(24, 144);
let videoFrame16 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'rgb', primaries: 'bt470m', transfer: 'gamma22curve'} });
let bindGroup52 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 185, resource: textureView48}, {binding: 67, resource: textureView20}],
});
let buffer94 = device0.createBuffer({
  label: '\u0d9d\u01bc\u{1ff04}',
  size: 7594,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroupsIndirect(buffer91, 2_596); };
} catch {}
try {
renderPassEncoder35.setBindGroup(1, bindGroup15, new Uint32Array(33), 6, 0);
} catch {}
try {
renderPassEncoder33.executeBundles([renderBundle3, renderBundle6, renderBundle5]);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(0, buffer92, 0, 2_512);
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let textureView110 = texture50.createView({aspect: 'all'});
try {
computePassEncoder31.setBindGroup(1, bindGroup0, new Uint32Array(412), 81, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroups(1); };
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: videoFrame10,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture45,
  mipLevel: 0,
  origin: {x: 44, y: 15, z: 7},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture120 = device0.createTexture({
  size: [384, 1824, 1],
  mipLevelCount: 2,
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let externalTexture9 = device0.importExternalTexture({label: '\u2463\u3292\u03f4\u079a', source: videoFrame0});
try {
renderPassEncoder39.setStencilReference(724);
} catch {}
try {
gpuCanvasContext4.unconfigure();
} catch {}
try {
computePassEncoder78.setBindGroup(3, bindGroup31, new Uint32Array(993), 42, 0);
} catch {}
try {
renderPassEncoder38.setBindGroup(0, bindGroup48);
} catch {}
try {
renderPassEncoder4.setBindGroup(1, bindGroup32, new Uint32Array(961), 43, 0);
} catch {}
try {
renderPassEncoder19.setIndexBuffer(buffer20, 'uint16', 1_818, 2_066);
} catch {}
try {
renderPassEncoder24.setVertexBuffer(4_294_967_295, undefined);
} catch {}
let bindGroup53 = device0.createBindGroup({
  layout: bindGroupLayout15,
  entries: [
    {binding: 397, resource: textureView97},
    {binding: 308, resource: textureView88},
    {binding: 64, resource: {buffer: buffer43, offset: 6400}},
    {binding: 19, resource: {buffer: buffer24, offset: 0, size: 448}},
    {binding: 89, resource: {buffer: buffer25, offset: 256}},
  ],
});
let buffer95 = device0.createBuffer({size: 15, usage: GPUBufferUsage.STORAGE});
let textureView111 = texture16.createView({arrayLayerCount: 1});
try {
renderPassEncoder26.setBindGroup(0, bindGroup8, new Uint32Array(2073), 85, 0);
} catch {}
try {
renderPassEncoder26.setIndexBuffer(buffer68, 'uint32', 5_608, 8_468);
} catch {}
let commandEncoder106 = device0.createCommandEncoder({});
let querySet8 = device0.createQuerySet({type: 'occlusion', count: 2707});
let computePassEncoder81 = commandEncoder106.beginComputePass({label: '\u09b9\u0b3d\u353d\u3ff3\ue003\u65bf\u8559\u{1ff18}\u{1f798}'});
try {
computePassEncoder36.end();
} catch {}
try {
computePassEncoder81.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder17.setBindGroup(0, bindGroup41, new Uint32Array(1654), 159, 0);
} catch {}
try {
renderPassEncoder39.setPipeline(pipeline2);
} catch {}
try {
commandEncoder49.copyBufferToTexture({
  /* bytesInLastRow: 48 widthInBlocks: 48 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1316 */
  offset: 1316,
  bytesPerRow: 2560,
  buffer: buffer9,
}, {
  texture: texture63,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'stencil-only',
}, {width: 48, height: 228, depthOrArrayLayers: 0});
} catch {}
let buffer96 = device0.createBuffer({
  label: '\u165d\u{1fa67}\u{1f931}\u1d95\ubf26\u7091\u02f0\u0e88\u711a',
  size: 17362,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE,
});
let commandEncoder107 = device0.createCommandEncoder();
let textureView112 = texture27.createView({arrayLayerCount: 1});
let computePassEncoder82 = commandEncoder49.beginComputePass({});
let renderPassEncoder40 = commandEncoder107.beginRenderPass({
  colorAttachments: [{
  view: textureView57,
  depthSlice: 670,
  clearValue: { r: -77.77, g: 736.9, b: 138.8, a: -133.7, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
let sampler79 = device0.createSampler({addressModeU: 'repeat', magFilter: 'nearest', lodMaxClamp: 98.10});
try {
computePassEncoder69.setBindGroup(0, bindGroup37);
} catch {}
try {
renderPassEncoder33.setBindGroup(3, bindGroup23);
} catch {}
try {
externalTexture4.label = '\u97e5\u3a29\u8c6b\u0d98';
} catch {}
let bindGroup54 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 177, resource: textureView45}, {binding: 381, resource: textureView111}],
});
let commandEncoder108 = device0.createCommandEncoder({label: '\u2bd7\u0314\u7ad0\ud040\u0561\u800a\u2587\u26f8'});
let computePassEncoder83 = commandEncoder108.beginComputePass({label: '\u61ea\u4cc5\u0477\u7e36\u{1fb5e}\u{1fa3a}'});
try {
computePassEncoder8.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder16.setBindGroup(3, bindGroup18);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup8, new Uint32Array(318), 43, 0);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle7, renderBundle2, renderBundle0]);
} catch {}
try {
renderPassEncoder27.setIndexBuffer(buffer15, 'uint32', 1_440, 727);
} catch {}
await gc();
let commandEncoder109 = device0.createCommandEncoder({});
let sampler80 = device0.createSampler({
  label: '\u{1f742}\ue562\u{1fe4e}\u3a05\ua234\u42f8\u138d\uf7e4',
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 98.87,
  compare: 'greater',
});
try {
computePassEncoder37.setBindGroup(1, bindGroup21);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder82.setPipeline(pipeline1);
} catch {}
try {
commandEncoder109.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 240 */
  offset: 240,
  bytesPerRow: 4608,
  rowsPerImage: 491,
  buffer: buffer24,
}, {
  texture: texture46,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder110 = device0.createCommandEncoder({});
let texture121 = device0.createTexture({
  size: [256],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder84 = commandEncoder110.beginComputePass({});
let sampler81 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 61.27,
  lodMaxClamp: 63.81,
  maxAnisotropy: 1,
});
try {
computePassEncoder18.setBindGroup(1, bindGroup32);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroupsIndirect(buffer68, 2_668); };
} catch {}
try {
renderPassEncoder32.setBindGroup(3, bindGroup7, new Uint32Array(878), 81, 0);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(7, buffer19, 224);
} catch {}
let buffer97 = device0.createBuffer({size: 9792, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
let textureView113 = texture120.createView({mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder85 = commandEncoder109.beginComputePass();
let sampler82 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 25.29,
  lodMaxClamp: 25.43,
  maxAnisotropy: 7,
});
try {
computePassEncoder41.setBindGroup(2, bindGroup32, []);
} catch {}
try {
renderPassEncoder36.setIndexBuffer(buffer37, 'uint16', 3_108, 1_878);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture97,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(1_810).fill(71), /* required buffer size: 1_810 */
{offset: 500, bytesPerRow: 131, rowsPerImage: 5}, {width: 1, height: 0, depthOrArrayLayers: 3});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData12,
  origin: { x: 1, y: 28 },
  flipY: true,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData16 = new ImageData(8, 4);
let buffer98 = device0.createBuffer({size: 11338, usage: GPUBufferUsage.UNIFORM});
let texture122 = device0.createTexture({
  size: [192],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder80.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder85.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder33.beginOcclusionQuery(17);
} catch {}
try {
renderPassEncoder33.endOcclusionQuery();
} catch {}
try {
renderPassEncoder6.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder29.setVertexBuffer(6, buffer23, 0);
} catch {}
let arrayBuffer9 = buffer14.getMappedRange(16, 8);
try {
device0.queue.writeBuffer(buffer73, 740, new Float32Array(7617), 2314, 84);
} catch {}
let videoFrame17 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'yCgCo', primaries: 'film', transfer: 'bt2020_10bit'} });
try {
globalThis.someLabel = buffer46.label;
} catch {}
let commandEncoder111 = device0.createCommandEncoder({});
let texture123 = device0.createTexture({
  label: '\u99f5\u9e41\ua579\ub720\u4aed\u0b67\u293f\u09d0',
  size: [192, 912, 1],
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder86 = commandEncoder111.beginComputePass();
try {
computePassEncoder29.setBindGroup(2, bindGroup42);
} catch {}
try {
renderPassEncoder29.setBindGroup(3, bindGroup38);
} catch {}
try {
device0.queue.writeBuffer(buffer19, 444, new Int16Array(13640), 155, 1332);
} catch {}
let promise14 = device0.queue.onSubmittedWorkDone();
try {
if (!arrayBuffer3.detached) { new Uint8Array(arrayBuffer3).fill(0x55); };
} catch {}
try {
commandEncoder91.label = '\u{1f8a4}\ubfe1\u0c40\u0b19\u81b1\u{1f93e}\uebb6\u{1f622}\u0a06\ud3cd\u03e0';
} catch {}
let commandEncoder112 = device0.createCommandEncoder();
let texture124 = device0.createTexture({
  size: [2, 1, 14],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder41 = commandEncoder112.beginRenderPass({
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 181.5, g: 78.33, b: -162.4, a: 942.7, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet5,
  maxDrawCount: 451811260,
});
try {
computePassEncoder86.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder22.setBindGroup(0, bindGroup20);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer9, 'uint16', 728, 39);
} catch {}
try {
renderPassEncoder39.setVertexBuffer(4, buffer64, 0, 2_005);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.submit([]);
} catch {}
let imageData17 = new ImageData(92, 32);
try {
computePassEncoder84.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder40.setScissorRect(4, 0, 0, 0);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer9, 'uint32', 976, 113);
} catch {}
try {
renderPassEncoder37.setVertexBuffer(4, buffer2, 12_244);
} catch {}
let buffer99 = device0.createBuffer({size: 2902, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
try {
computePassEncoder83.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder21.setBindGroup(1, bindGroup51, new Uint32Array(3501), 937, 0);
} catch {}
try {
renderPassEncoder2.setBlendConstant({ r: 72.24, g: -934.5, b: -626.5, a: -812.9, });
} catch {}
let imageData18 = new ImageData(64, 16);
try {
externalTexture3.label = '\uf1e9\ud0b7\ub3eb\u{1fdee}\u038e\ud50f';
} catch {}
let textureView114 = texture116.createView({label: '\u0b9e\u5836\u0453\u09d4\u{1f62a}\u0c96\u0210\u6c29\u0f4c\u02f3', format: 'rgb10a2uint'});
try {
computePassEncoder3.setBindGroup(3, bindGroup24, new Uint32Array(1829), 164, 0);
} catch {}
try {
renderPassEncoder31.executeBundles([renderBundle6, renderBundle3]);
} catch {}
try {
buffer9.unmap();
} catch {}
let commandEncoder113 = device0.createCommandEncoder({});
let querySet9 = device0.createQuerySet({type: 'occlusion', count: 80});
let texture125 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 901},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder87 = commandEncoder113.beginComputePass();
try {
computePassEncoder48.setBindGroup(0, bindGroup10);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder48); computePassEncoder48.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder3.setBindGroup(0, bindGroup22, new Uint32Array(702), 244, 0);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline2);
} catch {}
let texture126 = device0.createTexture({
  size: [1, 1, 25],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView115 = texture46.createView({});
let sampler83 = device0.createSampler({
  label: '\uec75\u0c01\u{1f6f4}\u{1f65a}\u8534\u7c34\u{1ffbf}\u6cc3\ucf3b\u032b\u0c0e',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 32.31,
  lodMaxClamp: 38.04,
  maxAnisotropy: 14,
});
try {
computePassEncoder35.setBindGroup(1, bindGroup41);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroupsIndirect(buffer26, 5_696); };
} catch {}
try {
computePassEncoder87.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder34.setBindGroup(0, bindGroup0, new Uint32Array(1045), 13, 0);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer65, 'uint16', 468, 1_270);
} catch {}
try {
buffer47.unmap();
} catch {}
try {
gpuCanvasContext3.unconfigure();
} catch {}
let canvas1 = document.createElement('canvas');
let commandEncoder114 = device0.createCommandEncoder({});
let texture127 = device0.createTexture({
  label: '\u00eb\u{1f816}',
  size: {width: 4, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder42 = commandEncoder114.beginRenderPass({
  colorAttachments: [{
  view: textureView112,
  clearValue: { r: -706.5, g: -889.9, b: -488.3, a: 30.39, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet0,
  maxDrawCount: 469735122,
});
try {
renderPassEncoder25.setBindGroup(0, bindGroup20);
} catch {}
let promise15 = device0.queue.onSubmittedWorkDone();
let gpuCanvasContext6 = canvas1.getContext('webgpu');
let textureView116 = texture126.createView({arrayLayerCount: 17});
try {
{ clearResourceUsages(device0, computePassEncoder23); computePassEncoder23.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder14.setBindGroup(3, bindGroup47);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame14,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 1, depthOrArrayLayers: 0});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let bindGroupLayout19 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 721,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', minBindingSize: 0, hasDynamicOffset: false },
    },
  ],
});
let buffer100 = device0.createBuffer({label: '\u9b7b\u09bf\u6353', size: 5454, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let sampler84 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 70.89,
  lodMaxClamp: 98.62,
  maxAnisotropy: 8,
});
try {
computePassEncoder50.setBindGroup(1, bindGroup31, []);
} catch {}
try {
computePassEncoder18.setBindGroup(1, bindGroup30, new Uint32Array(1136), 160, 0);
} catch {}
try {
renderPassEncoder10.executeBundles([renderBundle10]);
} catch {}
try {
renderPassEncoder9.setPipeline(pipeline2);
} catch {}
let imageData19 = new ImageData(36, 12);
let commandEncoder115 = device0.createCommandEncoder({});
let texture128 = device0.createTexture({
  size: [1670, 40, 1],
  format: 'astc-10x8-unorm-srgb',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let renderPassEncoder43 = commandEncoder115.beginRenderPass({
  colorAttachments: [{
  view: textureView64,
  clearValue: { r: -488.3, g: 143.0, b: 840.3, a: -683.9, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet5,
});
let externalTexture10 = device0.importExternalTexture({source: videoFrame13});
try {
computePassEncoder57.setBindGroup(0, bindGroup17, new Uint32Array(8095), 342, 0);
} catch {}
try {
renderPassEncoder7.setBindGroup(2, bindGroup10);
} catch {}
try {
renderPassEncoder19.setVertexBuffer(4, buffer89);
} catch {}
let commandEncoder116 = device0.createCommandEncoder({});
let texture129 = gpuCanvasContext2.getCurrentTexture();
let computePassEncoder88 = commandEncoder116.beginComputePass({});
try {
computePassEncoder88.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.beginOcclusionQuery(156);
} catch {}
try {
renderPassEncoder18.endOcclusionQuery();
} catch {}
try {
renderPassEncoder30.setVertexBuffer(4, buffer12, 1_248);
} catch {}
try {
buffer81.unmap();
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture121,
  mipLevel: 0,
  origin: {x: 43, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(536).fill(174), /* required buffer size: 536 */
{offset: 536, rowsPerImage: 4}, {width: 21, height: 0, depthOrArrayLayers: 0});
} catch {}
let promise16 = device0.queue.onSubmittedWorkDone();
let buffer101 = device0.createBuffer({
  label: '\u8f9c\ub76c\u3d9a\u8350\u0813\u7baa',
  size: 43742,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
let commandEncoder117 = device0.createCommandEncoder();
let texture130 = device0.createTexture({
  size: [256, 256, 17],
  mipLevelCount: 3,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder89 = commandEncoder117.beginComputePass({});
try {
computePassEncoder82.setBindGroup(2, bindGroup50, new Uint32Array(1837), 409, 0);
} catch {}
try {
renderPassEncoder21.setBindGroup(1, bindGroup26, new Uint32Array(2328), 551, 0);
} catch {}
try {
renderPassEncoder34.executeBundles([renderBundle9, renderBundle3]);
} catch {}
try {
renderPassEncoder40.setStencilReference(239);
} catch {}
try {
renderPassEncoder11.setVertexBuffer(3, buffer12);
} catch {}
let commandEncoder118 = device0.createCommandEncoder({});
let computePassEncoder90 = commandEncoder118.beginComputePass({});
try {
computePassEncoder23.end();
} catch {}
try {
computePassEncoder89.setPipeline(pipeline1);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 12, height: 57, depthOrArrayLayers: 1}
*/
{
  source: imageData13,
  origin: { x: 0, y: 1 },
  flipY: false,
}, {
  texture: texture78,
  mipLevel: 4,
  origin: {x: 1, y: 13, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandBuffer0 = commandEncoder31.finish();
let texture131 = gpuCanvasContext3.getCurrentTexture();
let sampler85 = device0.createSampler({
  label: '\u0884\u09fa\u17eb\u0644\u815f\u7b01\u381a\ued2d\u02c3\u0708',
  addressModeU: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 83.40,
  lodMaxClamp: 90.30,
});
try {
computePassEncoder27.setBindGroup(0, bindGroup38, new Uint32Array(3479), 68, 0);
} catch {}
try {
computePassEncoder90.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer68, 'uint32', 5_352, 5_835);
} catch {}
let arrayBuffer10 = buffer32.getMappedRange(0, 0);
try {
computePassEncoder39.insertDebugMarker('\uac27');
} catch {}
try {
gpuCanvasContext4.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'premultiplied',
});
} catch {}
let bindGroup55 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 185, resource: textureView31}, {binding: 67, resource: textureView20}],
});
try {
computePassEncoder82.setBindGroup(3, bindGroup54);
} catch {}
try {
computePassEncoder63.setBindGroup(1, bindGroup54, new Uint32Array(497), 21, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4_294_967_294, undefined, 0, 976_727_928);
} catch {}
let pipeline3 = await device0.createRenderPipelineAsync({
  layout: pipelineLayout0,
  fragment: {
  module: shaderModule1,
  entryPoint: 'fragment1',
  constants: {override6: 0, 1_297: 0},
  targets: [{format: 'rgba16float', writeMask: GPUColorWrite.ALL | GPUColorWrite.GREEN | GPUColorWrite.RED}],
},
  vertex: {
    module: shaderModule3,
    constants: {},
    buffers: [
      {
        arrayStride: 44,
        stepMode: 'instance',
        attributes: [{format: 'unorm10-10-10-2', offset: 0, shaderLocation: 5}],
      },
    ],
  },
  primitive: {topology: 'line-strip', stripIndexFormat: 'uint32', frontFace: 'cw', cullMode: 'back'},
});
await gc();
try {
{ clearResourceUsages(device0, computePassEncoder48); computePassEncoder48.dispatchWorkgroupsIndirect(buffer93, 776); };
} catch {}
try {
computePassEncoder75.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder10.setBindGroup(2, bindGroup18);
} catch {}
try {
renderPassEncoder20.setBindGroup(3, bindGroup55, new Uint32Array(3359), 1_372, 0);
} catch {}
let imageBitmap1 = await createImageBitmap(canvas0);
let bindGroupLayout20 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 189,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '1d', sampleType: 'unfilterable-float', multisampled: false },
    },
    {
      binding: 150,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba32uint', access: 'read-only', viewDimension: '2d-array' },
    },
    {binding: 41, visibility: GPUShaderStage.VERTEX, externalTexture: {}},
  ],
});
let commandEncoder119 = device0.createCommandEncoder({});
let textureView117 = texture49.createView({arrayLayerCount: 3});
let computePassEncoder91 = commandEncoder119.beginComputePass();
try {
renderPassEncoder22.setBindGroup(3, bindGroup5, new Uint32Array(1728), 183, 0);
} catch {}
try {
renderPassEncoder29.executeBundles([renderBundle9, renderBundle5, renderBundle4]);
} catch {}
try {
renderPassEncoder30.setScissorRect(27, 24, 22, 12);
} catch {}
try {
renderPassEncoder32.setIndexBuffer(buffer61, 'uint16', 3_098, 1_100);
} catch {}
try {
device0.queue.writeBuffer(buffer56, 156, new BigUint64Array(16170), 330, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture41,
  mipLevel: 0,
  origin: {x: 74, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(4).fill(1), /* required buffer size: 4 */
{offset: 4}, {width: 37, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup56 = device0.createBindGroup({
  layout: bindGroupLayout20,
  entries: [
    {binding: 189, resource: textureView102},
    {binding: 150, resource: textureView117},
    {binding: 41, resource: externalTexture1},
  ],
});
let commandEncoder120 = device0.createCommandEncoder({});
let texture132 = device0.createTexture({
  size: [4],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder44 = commandEncoder120.beginRenderPass({
  colorAttachments: [{
  view: textureView96,
  clearValue: { r: 166.0, g: 658.6, b: 243.0, a: 703.7, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
renderPassEncoder14.setBindGroup(3, bindGroup23, new Uint32Array(2957), 210, 0);
} catch {}
try {
renderPassEncoder16.setVertexBuffer(6, buffer35, 0, 1_666);
} catch {}
try {
computePassEncoder91.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder8.setPipeline(pipeline3);
} catch {}
try {
device0.queue.writeBuffer(buffer50, 416, new Int16Array(2244), 53, 64);
} catch {}
let imageData20 = new ImageData(4, 28);
let textureView118 = texture56.createView({label: '\u107b\u0a8f'});
let sampler86 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 59.21,
  lodMaxClamp: 71.43,
});
try {
renderPassEncoder31.setIndexBuffer(buffer0, 'uint16', 2_192, 6_234);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData0,
  origin: { x: 10, y: 7 },
  flipY: false,
}, {
  texture: texture81,
  mipLevel: 0,
  origin: {x: 17, y: 49, z: 3},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 4, height: 3, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
try {
renderPassEncoder22.label = '\u{1f8f4}\u{1fef9}\u0364\u871b';
} catch {}
let commandEncoder121 = device0.createCommandEncoder({});
let texture133 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 250},
  mipLevelCount: 2,
  sampleCount: 1,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let renderPassEncoder45 = commandEncoder121.beginRenderPass({
  label: '\uba5b\u0c0b\u1892\u4ec1\u{1fd80}\u5c6d\u445c\u3bdb\u{1fc79}',
  colorAttachments: [{
  view: textureView54,
  clearValue: { r: -769.3, g: 521.1, b: -558.9, a: 930.6, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 6241016,
});
let sampler87 = device0.createSampler({
  label: '\uf554\u{1fc28}\udb73\u4fe3\ufdb7',
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 11.77,
  lodMaxClamp: 83.15,
});
try {
computePassEncoder52.setBindGroup(3, bindGroup28, new Uint32Array(1732), 272, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder48); computePassEncoder48.dispatchWorkgroupsIndirect(buffer26, 7_500); };
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup28, new Uint32Array(3173), 985, 0);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer53, 'uint16', 2_588, 7_431);
} catch {}
try {
buffer93.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer40, 512, new Int16Array(5966), 48, 744);
} catch {}
let buffer102 = device0.createBuffer({
  size: 19291,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let sampler88 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'linear',
  lodMinClamp: 19.33,
  lodMaxClamp: 60.78,
});
try {
computePassEncoder4.setBindGroup(3, bindGroup52, new Uint32Array(8558), 575, 0);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'premultiplied',
});
} catch {}
let commandEncoder122 = device0.createCommandEncoder();
let texture134 = device0.createTexture({
  label: '\u915a\u{1f805}\u3356\u00fc',
  size: {width: 4, height: 1, depthOrArrayLayers: 6},
  mipLevelCount: 1,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let renderPassEncoder46 = commandEncoder122.beginRenderPass({
  colorAttachments: [{view: textureView106, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 190577636,
});
let sampler89 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 86.28,
  lodMaxClamp: 97.07,
  compare: 'less-equal',
});
try {
computePassEncoder75.setBindGroup(1, bindGroup15);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder24.setVertexBuffer(2, buffer23, 0, 562);
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let commandEncoder123 = device0.createCommandEncoder({});
let textureView119 = texture78.createView({dimension: '2d', mipLevelCount: 1});
let computePassEncoder92 = commandEncoder123.beginComputePass({});
try {
computePassEncoder92.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder19.setBindGroup(2, bindGroup46, new Uint32Array(2678), 129, 0);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline3);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
try {
device0.queue.submit([commandBuffer0]);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let commandEncoder124 = device0.createCommandEncoder({});
let computePassEncoder93 = commandEncoder124.beginComputePass({});
try {
computePassEncoder90.setBindGroup(1, bindGroup2);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder48); computePassEncoder48.dispatchWorkgroupsIndirect(buffer34, 2_152); };
} catch {}
try {
computePassEncoder93.setPipeline(pipeline1);
} catch {}
await gc();
let texture135 = gpuCanvasContext4.getCurrentTexture();
let renderBundleEncoder12 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], depthReadOnly: true, stencilReadOnly: true});
try {
computePassEncoder68.setBindGroup(1, bindGroup37);
} catch {}
try {
renderPassEncoder43.setBindGroup(3, bindGroup0, new Uint32Array(363), 32, 0);
} catch {}
try {
renderPassEncoder30.setIndexBuffer(buffer9, 'uint16', 142, 141);
} catch {}
try {
renderPassEncoder43.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder12.setBindGroup(2, bindGroup22, new Uint32Array(216), 19, 0);
} catch {}
try {
renderBundleEncoder12.setIndexBuffer(buffer24, 'uint16', 422, 35);
} catch {}
try {
buffer37.unmap();
} catch {}
let buffer103 = device0.createBuffer({
  label: '\u0360\u{1f8a4}\ua5dd\ubbdd\u400e\u677d\u3b98\u794c\u4130\u0b29\u0b1c',
  size: 7855,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let sampler90 = device0.createSampler({
  addressModeV: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 61.18,
  lodMaxClamp: 85.21,
});
try {
{ clearResourceUsages(device0, computePassEncoder48); computePassEncoder48.dispatchWorkgroupsIndirect(buffer36, 116); };
} catch {}
try {
renderBundleEncoder12.setVertexBuffer(5, buffer21);
} catch {}
try {
computePassEncoder43.pushDebugGroup('\u8a47');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
await gc();
let bindGroup57 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [{binding: 41, resource: {buffer: buffer69, offset: 0, size: 253}}],
});
let commandEncoder125 = device0.createCommandEncoder({label: '\u988f\u1e21'});
let texture136 = device0.createTexture({
  size: [256, 256, 17],
  format: 'rgba32uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture137 = device0.createTexture({
  size: [192, 912, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder94 = commandEncoder125.beginComputePass();
try {
computePassEncoder71.setBindGroup(2, bindGroup32);
} catch {}
try {
renderPassEncoder43.executeBundles([renderBundle11, renderBundle1]);
} catch {}
try {
renderBundleEncoder12.setIndexBuffer(buffer53, 'uint16', 2_902, 566);
} catch {}
try {
renderBundleEncoder12.setVertexBuffer(1, buffer9, 0);
} catch {}
let arrayBuffer11 = buffer72.getMappedRange(168, 4);
try {
device0.queue.writeTexture({
  texture: texture11,
  mipLevel: 1,
  origin: {x: 35, y: 205, z: 0},
  aspect: 'all',
}, new Uint8Array(54).fill(214), /* required buffer size: 54 */
{offset: 54, bytesPerRow: 45, rowsPerImage: 169}, {width: 22, height: 153, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 128, height: 128, depthOrArrayLayers: 17}
*/
{
  source: imageData2,
  origin: { x: 8, y: 23 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 1,
  origin: {x: 20, y: 6, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 9, height: 2, depthOrArrayLayers: 0});
} catch {}
let commandEncoder126 = device0.createCommandEncoder({});
let computePassEncoder95 = commandEncoder126.beginComputePass({});
let renderBundle12 = renderBundleEncoder12.finish({});
try {
computePassEncoder79.setBindGroup(1, bindGroup17);
} catch {}
try {
computePassEncoder48.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder19.setBindGroup(3, bindGroup18, new Uint32Array(1850), 1_253, 0);
} catch {}
try {
renderPassEncoder23.executeBundles([renderBundle12]);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer60, 'uint32', 164, 207);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture132,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(1).fill(247), /* required buffer size: 1 */
{offset: 1, bytesPerRow: 54}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder127 = device0.createCommandEncoder({});
let computePassEncoder96 = commandEncoder127.beginComputePass({});
let sampler91 = device0.createSampler({
  label: '\u27fb\u{1fac7}\u06b8\u024e\ub722\u{1ff3e}\u0f40\ub58c\ue0d9\u{1f75a}',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 65.96,
  lodMaxClamp: 78.71,
  compare: 'not-equal',
});
try {
computePassEncoder96.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder15.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder40.setVertexBuffer(4_294_967_294, undefined);
} catch {}
let textureView120 = texture50.createView({});
try {
renderPassEncoder39.setBindGroup(0, bindGroup27);
} catch {}
try {
renderPassEncoder46.executeBundles([renderBundle3]);
} catch {}
let arrayBuffer12 = buffer14.getMappedRange(0, 0);
let commandEncoder128 = device0.createCommandEncoder({});
let texture138 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder97 = commandEncoder128.beginComputePass({});
try {
computePassEncoder95.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder27.setBindGroup(2, bindGroup1);
} catch {}
try {
renderPassEncoder25.setBindGroup(3, bindGroup41, new Uint32Array(857), 126, 0);
} catch {}
try {
buffer42.unmap();
} catch {}
let commandEncoder129 = device0.createCommandEncoder({});
let textureView121 = texture136.createView({
  label: '\ue304\u{1f7a9}\u7498\u{1faa8}\u{1fbc8}\u{1ff64}\u4fdb\u042f\ue95c\ue9db',
  baseArrayLayer: 1,
  arrayLayerCount: 3,
});
let renderPassEncoder47 = commandEncoder129.beginRenderPass({
  colorAttachments: [{
  view: textureView106,
  clearValue: { r: -268.5, g: 942.3, b: -183.9, a: 492.5, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder19.setBindGroup(2, bindGroup42);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline2);
} catch {}
let promise17 = device0.queue.onSubmittedWorkDone();
try {
  await promise16;
} catch {}
try {
computePassEncoder42.setBindGroup(2, bindGroup51);
} catch {}
try {
renderPassEncoder7.setBindGroup(0, bindGroup41, new Uint32Array(1372), 562, 0);
} catch {}
try {
renderPassEncoder31.setIndexBuffer(buffer15, 'uint32', 760, 97);
} catch {}
try {
adapter0.label = '\u719b\ufb25\u{1fd4d}\ucfa2\u{1fbf9}\ub492\u092f';
} catch {}
let querySet10 = device0.createQuerySet({type: 'occlusion', count: 454});
let texture139 = device0.createTexture({
  size: [96],
  dimension: '1d',
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder35.setBindGroup(1, bindGroup46);
} catch {}
try {
computePassEncoder48.end();
} catch {}
try {
renderPassEncoder5.setBlendConstant({ r: -171.1, g: -334.8, b: -967.4, a: 426.0, });
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer20, 'uint32', 10_536, 5_872);
} catch {}
try {
buffer36.unmap();
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.submit([]);
} catch {}
let promise18 = device0.queue.onSubmittedWorkDone();
try {
if (!arrayBuffer7.detached) { new Uint8Array(arrayBuffer7).fill(0x55); };
} catch {}
let buffer104 = device0.createBuffer({
  size: 10965,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE,
});
try {
computePassEncoder96.setBindGroup(0, bindGroup25);
} catch {}
try {
computePassEncoder71.end();
} catch {}
try {
renderPassEncoder4.setBindGroup(1, bindGroup12, new Uint32Array(6145), 386, 0);
} catch {}
let img2 = await imageWithData(37, 58, '#10101010', '#20202020');
let commandEncoder130 = device0.createCommandEncoder();
let texture140 = device0.createTexture({size: [8, 1, 1], mipLevelCount: 1, format: 'rgba16float', usage: GPUTextureUsage.STORAGE_BINDING});
let textureView122 = texture133.createView({mipLevelCount: 1});
let computePassEncoder98 = commandEncoder62.beginComputePass();
let renderPassEncoder48 = commandEncoder130.beginRenderPass({
  colorAttachments: [{
  view: textureView96,
  clearValue: { r: 506.5, g: 727.6, b: 529.6, a: -606.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 246217117,
});
let sampler92 = device0.createSampler({
  label: '\u{1fbda}\u57e3\u064a\u2e61\u{1f7a3}\u564c\u0633\u0ddc',
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'nearest',
  mipmapFilter: 'linear',
  lodMinClamp: 99.61,
  lodMaxClamp: 99.75,
});
try {
computePassEncoder98.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder29.setBindGroup(0, bindGroup12);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer103, 'uint32', 1_616, 51);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture134,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 2},
  aspect: 'all',
}, new Uint8Array(126).fill(187), /* required buffer size: 126 */
{offset: 126}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup58 = device0.createBindGroup({
  label: '\u6cda\u3048\u{1fdf4}\ua759\u0ef2\ue507\u{1fa9b}\u866f\u{1ff7b}\u5748',
  layout: bindGroupLayout13,
  entries: [{binding: 135, resource: textureView72}, {binding: 457, resource: textureView73}],
});
let buffer105 = device0.createBuffer({size: 24359, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX});
let texture141 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 3,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let renderPassEncoder49 = commandEncoder95.beginRenderPass({
  colorAttachments: [{
  view: textureView64,
  clearValue: { r: 891.2, g: 567.4, b: -586.7, a: 681.2, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let sampler93 = device0.createSampler({
  label: '\uc107\ud973\u{1f97c}\u888a\u50bf\u0658',
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 52.48,
  lodMaxClamp: 90.43,
  maxAnisotropy: 2,
});
try {
computePassEncoder8.setBindGroup(0, bindGroup48);
} catch {}
try {
computePassEncoder97.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup56);
} catch {}
try {
renderPassEncoder40.setIndexBuffer(buffer76, 'uint16', 1_768, 711);
} catch {}
let imageData21 = new ImageData(52, 16);
let bindGroup59 = device0.createBindGroup({
  layout: bindGroupLayout8,
  entries: [{binding: 506, resource: textureView41}, {binding: 182, resource: textureView38}],
});
try {
computePassEncoder68.setBindGroup(1, bindGroup3, []);
} catch {}
try {
renderPassEncoder40.setBindGroup(3, bindGroup38);
} catch {}
let offscreenCanvas5 = new OffscreenCanvas(688, 327);
let textureView123 = texture96.createView({
  label: '\u0048\u02cf\u{1fcf9}\u692a\u{1f9bd}\u8201\u21f5\u069f\uaabb',
  dimension: '2d',
  baseMipLevel: 2,
  mipLevelCount: 1,
});
let sampler94 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMaxClamp: 60.25,
  compare: 'less-equal',
});
try {
computePassEncoder94.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder37.setBindGroup(3, bindGroup9);
} catch {}
try {
renderPassEncoder12.executeBundles([renderBundle0, renderBundle8]);
} catch {}
try {
buffer79.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer99, 124, new BigUint64Array(12968), 7377, 8);
} catch {}
let imageData22 = new ImageData(28, 16);
let commandEncoder131 = device0.createCommandEncoder({});
let texture142 = device0.createTexture({
  size: [48, 228, 21],
  sampleCount: 1,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder99 = commandEncoder131.beginComputePass({label: '\u6cde\u40c8\u0e32\u{1fff4}\u{1f7b6}'});
try {
computePassEncoder99.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder16.setBindGroup(2, bindGroup52, new Uint32Array(1909), 400, 0);
} catch {}
try {
renderPassEncoder26.setBlendConstant({ r: -993.8, g: -924.1, b: 534.0, a: 251.8, });
} catch {}
try {
renderPassEncoder41.setVertexBuffer(7, buffer83, 0, 6_296);
} catch {}
let commandEncoder132 = device0.createCommandEncoder({});
let sampler95 = device0.createSampler({
  addressModeU: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 81.97,
  maxAnisotropy: 11,
});
try {
computePassEncoder91.setBindGroup(3, bindGroup58);
} catch {}
try {
renderPassEncoder30.end();
} catch {}
try {
renderPassEncoder44.setVertexBuffer(3, buffer23, 0, 370);
} catch {}
let commandEncoder133 = device0.createCommandEncoder({});
let computePassEncoder100 = commandEncoder82.beginComputePass({});
let renderPassEncoder50 = commandEncoder132.beginRenderPass({
  colorAttachments: [{
  view: textureView30,
  clearValue: { r: -243.7, g: -111.8, b: -544.6, a: -463.7, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder41.setBindGroup(3, bindGroup57);
} catch {}
try {
computePassEncoder8.setBindGroup(1, bindGroup4, new Uint32Array(2731), 188, 0);
} catch {}
try {
computePassEncoder100.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder31.setBlendConstant({ r: 43.10, g: -466.7, b: 494.5, a: -914.7, });
} catch {}
try {
  await buffer31.mapAsync(GPUMapMode.READ, 256, 608);
} catch {}
try {
gpuCanvasContext4.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 96, height: 456, depthOrArrayLayers: 1}
*/
{
  source: imageData9,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture48,
  mipLevel: 0,
  origin: {x: 0, y: 49, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 2, depthOrArrayLayers: 0});
} catch {}
let shaderModule8 = device0.createShaderModule({
  label: '\ua09a\uabd0\u{1ff8d}\u{1ffec}',
  code: `
enable f16;

requires pointer_composite_access;

@group(0) @binding(204) var<storage, read> buffer107: array<array<array<array<array<array<array<array<array<array<f16, 1>, 1>, 1>, 5>, 1>, 1>, 1>, 1>, 2>>;

@group(0) @binding(78) var et6: texture_external;

alias vec3b = vec3<bool>;

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

override override33: i32;

struct T1 {
  @size(20) f0: array<u32>,
}

@group(0) @binding(119) var<storage, read_write> buffer106: array<array<array<array<array<f16, 1>, 1>, 5>, 5>, 1>;

var<private> vp15: array<f16, 25> = array<f16, 25>();

fn unconst_u32(v: u32) -> u32 { return v; }

@id(45305) override override34: u32;

fn unconst_f16(v: f16) -> f16 { return v; }

fn fn0() -> mat3x3h {
  var out: mat3x3h;
  var vf101: vec2f = vp16[u32(cross(vec3f(f32(buffer107[arrayLength(&buffer107)][1][0][0][u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])][0][4][0][0][0])), vec3f(unconst_f32(0.1350), unconst_f32(0.1881), unconst_f32(0.01591)))[2])];
  vp16 = mat4x2f(bitcast<f32>(override35), f32(override35), f32(override35), bitcast<f32>(override35), bitcast<f32>(override35), f32(override35), f32(override35), bitcast<f32>(override35));
  vp16 += mat4x2f(f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]), f32(buffer107[i32(unconst_i32(5))][1][0][0][0][0][4][0][0][0]));
  let ptr124: ptr<storage, array<array<f16, 1>, 1>, read> = &(*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0];
  let ptr125: ptr<storage, array<array<array<f16, 1>, 1>, 5>, read_write> = &(*&buffer106)[0][4];
  let ptr126: ptr<storage, f16, read_write> = &(*&buffer106)[0][4][4][0][0];
  let ptr127: ptr<storage, array<array<f16, 1>, 1>, read> = &buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][u32(unconst_u32(529))];
  let ptr128: ptr<storage, array<f16, 1>, read> = &(*ptr127)[0];
  let ptr129: ptr<storage, array<f16, 1>, read> = &(*ptr127)[0];
  let ptr130: ptr<storage, array<array<f16, 1>, 1>, read> = &(*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0];
  return out;
  _ = override35;
}

@id(22116) override override30: f32;

override override31: f32;

@id(52878) override override35: u32;

override override32: f16;

struct T0 {
  @align(2) @size(52) f0: array<u32>,
}

var<private> vp16: mat4x2f = mat4x2f();

@vertex
fn vertex9(@location(10) @interpolate(perspective, center) a0: vec4f, @location(8) @interpolate(perspective, sample) a1: vec4f, @location(0) a2: vec2u, @location(15) a3: vec2i, @location(13) @interpolate(perspective) a4: vec2f, @location(1) @interpolate(flat) a5: vec2i, @location(14) a6: vec2u, @location(5) a7: vec4u, @location(9) a8: i32, @location(7) @interpolate(linear, centroid) a9: f16, @location(4) a10: f32) -> @builtin(position) vec4f {
  var out: vec4f;
  var vf102: vec4u = a7;
  vf102 = unpack4xU8(pack2x16unorm(vec2f(unconst_f32(-0.01901), unconst_f32(0.3286))));
  out = vec4f(f32(vp15[u32(unconst_u32(29))]));
  let vf103: vec2i = a5;
  let vf104: i32 = a5[1];
  let vf105: f32 = a10;
  vf102 = vec4u(u32(vp15[24]));
  let ptr131: ptr<storage, array<array<array<array<f16, 1>, 1>, 1>, 5>, read> = &(*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0];
  vf102 >>= vec4u(a1);
  let vf106: u32 = a7[u32(unconst_u32(153))];
  let ptr132: ptr<storage, array<array<array<f16, 1>, 1>, 1>, read> = &(*ptr131)[4];
  out -= vec4f(a2.yyxy);
  vp16 = mat4x2f(step(bitcast<vec3f>(unpack4xI8(u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])).zyz), bitcast<vec3f>(vf102.xwx)).yx, step(bitcast<vec3f>(unpack4xI8(u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])).zyz), bitcast<vec3f>(vf102.xwx)).zx, step(bitcast<vec3f>(unpack4xI8(u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])).zyz), bitcast<vec3f>(vf102.xwx)).xy, step(bitcast<vec3f>(unpack4xI8(u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])).zyz), bitcast<vec3f>(vf102.xwx)).br);
  return out;
}

@fragment
fn fragment7() -> @location(200) @interpolate(linear, sample) vec4u {
  var out: vec4u;
  vp16 += mat4x2f(bitcast<vec2f>(inverseSqrt(vec4h(unconst_f16(10447.0), unconst_f16(40573.0), unconst_f16(-4713.7), unconst_f16(6029.5)))), bitcast<vec2f>(inverseSqrt(vec4h(unconst_f16(10447.0), unconst_f16(40573.0), unconst_f16(-4713.7), unconst_f16(6029.5)))), bitcast<vec2f>(inverseSqrt(vec4h(unconst_f16(10447.0), unconst_f16(40573.0), unconst_f16(-4713.7), unconst_f16(6029.5)))), bitcast<vec2f>(inverseSqrt(vec4h(unconst_f16(10447.0), unconst_f16(40573.0), unconst_f16(-4713.7), unconst_f16(6029.5)))));
  vp15[u32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][0][0][0])] *= buffer107[arrayLength(&buffer107)][1][0][0][u32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][0][0][0])][0][4][0][0][0];
  let ptr133: ptr<storage, array<array<array<array<array<array<array<f16, 1>, 1>, 1>, 5>, 1>, 1>, 1>, read> = &(*&buffer107)[arrayLength(&(*&buffer107))][1][0];
  var vf107 = fn0();
  fn0();
  var vf108 = fn0();
  let ptr134: ptr<storage, array<array<array<f16, 1>, 1>, 1>, read> = &(*ptr133)[0][0][0][u32(unconst_u32(132))];
  fn0();
  var vf109 = fn0();
  vf108 += mat3x3h(pow(vec2h(atan(vec4f(f32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][0][u32(unconst_u32(33))][0]))).zx), vec2h(unconst_f16(4149.5), unconst_f16(18731.6))).grg, pow(vec2h(atan(vec4f(f32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][0][u32(unconst_u32(33))][0]))).zx), vec2h(unconst_f16(4149.5), unconst_f16(18731.6))).grg, pow(vec2h(atan(vec4f(f32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][4][0][u32(unconst_u32(33))][0]))).zx), vec2h(unconst_f16(4149.5), unconst_f16(18731.6))).yxy);
  vf108 += mat3x3h(buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0], buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(43))][0][0][0]);
  vp15[u32(unconst_u32(24))] *= vec4h(unpack4x8snorm(u32((*&buffer106)[0][4][u32((*ptr133)[0][0][0][4][0][0][0])][0][0]))).w;
  fn0();
  vp15[u32(unconst_u32(53))] *= (*&buffer106)[0][4][4][0][0];
  let ptr135: ptr<storage, f16, read_write> = &buffer106[0][4][4][0][u32(unconst_u32(72))];
  buffer106[u32(unconst_u32(24))][u32((*&buffer107)[arrayLength(&(*&buffer107))][1][0][0][0][0][4][0][0][0])][4][u32(unconst_u32(75))][u32(unconst_u32(38))] += (*&buffer107)[arrayLength(&(*&buffer107))][1][u32(vf108[1][0])][0][0][0][4][0][0][0];
  let vf110: vec3h = vf107[u32(unconst_u32(161))];
  vf108 += mat3x3h(buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0], buffer106[0][4][4][0][0]);
  buffer106[override35][u32(unconst_u32(215))][bitcast<u32>(countOneBits(vec4i(i32(buffer107[arrayLength(&buffer107)][1][0][0][0][0][u32(unconst_u32(67))][0][0][0])))[1])][0][u32((*ptr134)[u32(unconst_u32(618))][0][0])] = f16(vp16[2][0]);
  fn0();
  return out;
  _ = override35;
}`,
  sourceMap: {},
  hints: {},
});
let renderPassEncoder51 = commandEncoder133.beginRenderPass({
  label: '\ua2e2\u04f6\u168f\u{1ff69}\uea5f',
  colorAttachments: [{
  view: textureView12,
  clearValue: { r: 295.5, g: -375.8, b: -81.21, a: 278.3, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet1,
});
try {
renderPassEncoder3.setBindGroup(3, bindGroup10, new Uint32Array(2700), 796, 0);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer52, 'uint16', 260, 20);
} catch {}
let bindGroup60 = device0.createBindGroup({
  layout: bindGroupLayout15,
  entries: [
    {binding: 19, resource: {buffer: buffer12, offset: 1024, size: 470}},
    {binding: 308, resource: textureView79},
    {binding: 397, resource: textureView74},
    {binding: 89, resource: {buffer: buffer42, offset: 0, size: 148}},
    {binding: 64, resource: {buffer: buffer17, offset: 5632, size: 320}},
  ],
});
let sampler96 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  lodMaxClamp: 54.09,
});
try {
renderPassEncoder1.setVertexBuffer(3, buffer40, 0, 669);
} catch {}
let imageData23 = new ImageData(116, 104);
let buffer108 = device0.createBuffer({
  label: '\u09e1\u{1f99d}\ud591\u646a\u0c89\u41ce\u127c',
  size: 1651,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});
try {
renderPassEncoder4.setBindGroup(1, bindGroup38, new Uint32Array(2223), 244, 0);
} catch {}
try {
renderPassEncoder15.executeBundles([renderBundle1, renderBundle12]);
} catch {}
try {
renderPassEncoder9.setIndexBuffer(buffer103, 'uint16', 656, 1_961);
} catch {}
try {
renderPassEncoder47.setVertexBuffer(0, buffer81);
} catch {}
let commandEncoder134 = device0.createCommandEncoder();
let textureView124 = texture94.createView({arrayLayerCount: 1});
let sampler97 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 74.68,
  lodMaxClamp: 80.53,
  compare: 'never',
  maxAnisotropy: 16,
});
try {
renderPassEncoder11.setBindGroup(2, bindGroup43, new Uint32Array(164), 35, 0);
} catch {}
try {
commandEncoder134.copyBufferToTexture({
  /* bytesInLastRow: 220 widthInBlocks: 55 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 2344 */
  offset: 2344,
  bytesPerRow: 45312,
  buffer: buffer23,
}, {
  texture: texture80,
  mipLevel: 0,
  origin: {x: 32, y: 1013, z: 1},
  aspect: 'all',
}, {width: 55, height: 298, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
document.body.append(canvas1);
let buffer109 = device0.createBuffer({size: 9904, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX, mappedAtCreation: false});
let commandEncoder135 = device0.createCommandEncoder({});
let textureView125 = texture56.createView({baseMipLevel: 0});
let computePassEncoder101 = commandEncoder135.beginComputePass({});
let renderPassEncoder52 = commandEncoder134.beginRenderPass({
  colorAttachments: [{
  view: textureView36,
  clearValue: { r: -996.5, g: -911.1, b: 937.1, a: 919.3, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder25.setBindGroup(3, bindGroup58);
} catch {}
try {
computePassEncoder101.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder42.setBindGroup(2, bindGroup55);
} catch {}
try {
renderPassEncoder50.setPipeline(pipeline3);
} catch {}
let gpuCanvasContext7 = offscreenCanvas5.getContext('webgpu');
try {
gpuCanvasContext1.unconfigure();
} catch {}
let commandEncoder136 = device0.createCommandEncoder({});
let computePassEncoder102 = commandEncoder136.beginComputePass();
let externalTexture11 = device0.importExternalTexture({source: videoFrame12});
try {
computePassEncoder50.setBindGroup(0, bindGroup32, new Uint32Array(3982), 5, 0);
} catch {}
try {
computePassEncoder102.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer69, 'uint32', 12, 123);
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder24.setVertexBuffer(7, buffer75);
} catch {}
try {
computePassEncoder16.setBindGroup(0, bindGroup16, new Uint32Array(1064), 829, 0);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer77, 'uint32', 1_104, 540);
} catch {}
try {
renderPassEncoder45.setPipeline(pipeline3);
} catch {}
let buffer110 = device0.createBuffer({
  size: 1906,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture143 = device0.createTexture({
  label: '\u6a2a\u6c20\u0973\u872c\u0466\u{1febb}\u9391\u0c33\u0a0b',
  size: {width: 8},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST,
});
let sampler98 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 25.79,
  compare: 'always',
});
try {
renderPassEncoder7.setBindGroup(0, bindGroup50, new Uint32Array(35), 10, 0);
} catch {}
let commandEncoder137 = device0.createCommandEncoder({});
let renderPassEncoder53 = commandEncoder137.beginRenderPass({
  colorAttachments: [{
  view: textureView97,
  clearValue: { r: -633.7, g: -710.4, b: -239.9, a: 549.4, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
renderPassEncoder25.setIndexBuffer(buffer77, 'uint32', 648, 1_276);
} catch {}
try {
renderPassEncoder48.setVertexBuffer(2, buffer67, 0, 5_120);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
let bindGroup61 = device0.createBindGroup({
  label: '\u28da\u{1f80f}\uc832\u0bc5\ua613\u0e85\ubb70\u0a92\u{1fdde}\u641a',
  layout: bindGroupLayout16,
  entries: [{binding: 77, resource: textureView90}],
});
let texture144 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder22.setStencilReference(96);
} catch {}
try {
renderPassEncoder40.setIndexBuffer(buffer77, 'uint16', 426, 1_315);
} catch {}
try {
device0.queue.writeBuffer(buffer49, 228, new BigUint64Array(9471), 948, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
await gc();
try {
device0.label = '\u0e0d\u0b96';
} catch {}
let querySet11 = device0.createQuerySet({type: 'occlusion', count: 1099});
try {
device0.queue.writeTexture({
  texture: texture72,
  mipLevel: 0,
  origin: {x: 177, y: 14, z: 5},
  aspect: 'all',
}, new Uint8Array(101).fill(141), /* required buffer size: 101 */
{offset: 101, bytesPerRow: 135}, {width: 22, height: 38, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
document.body.prepend(canvas0);
let bindGroup62 = device0.createBindGroup({
  layout: bindGroupLayout13,
  entries: [{binding: 457, resource: textureView73}, {binding: 135, resource: textureView72}],
});
let texture145 = device0.createTexture({size: [2], sampleCount: 1, dimension: '1d', format: 'rgba16float', usage: GPUTextureUsage.COPY_SRC});
try {
computePassEncoder89.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder51.setPipeline(pipeline3);
} catch {}
try {
  await promise15;
} catch {}
let commandEncoder138 = device0.createCommandEncoder({label: '\u28d9\u{1f68b}\u6d87\u53bf\uf6a2\u8956\u61c6\ud3a4\u{1fdd0}'});
let renderPassEncoder54 = commandEncoder138.beginRenderPass({
  colorAttachments: [{view: textureView94, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 84000443,
});
try {
computePassEncoder7.setBindGroup(0, bindGroup2, new Uint32Array(806), 61, 0);
} catch {}
try {
renderPassEncoder8.setPipeline(pipeline3);
} catch {}
try {
computePassEncoder43.popDebugGroup();
} catch {}
try {
device0.queue.writeBuffer(buffer40, 656, new DataView(new ArrayBuffer(14528)), 1302, 132);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: videoFrame3,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture45,
  mipLevel: 0,
  origin: {x: 8, y: 17, z: 6},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer111 = device0.createBuffer({
  size: 20877,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
try {
computePassEncoder47.setBindGroup(2, bindGroup20, new Uint32Array(1363), 287, 0);
} catch {}
try {
renderPassEncoder34.setBindGroup(0, bindGroup36, new Uint32Array(120), 25, 0);
} catch {}
try {
renderPassEncoder20.setVertexBuffer(1, buffer102, 764);
} catch {}
try {
  await promise18;
} catch {}
await gc();
let buffer112 = device0.createBuffer({
  size: 16170,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let textureView126 = texture23.createView({dimension: '2d', baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: 1});
try {
computePassEncoder93.setBindGroup(1, bindGroup19, new Uint32Array(16), 0, 0);
} catch {}
try {
renderPassEncoder14.setBindGroup(1, bindGroup59);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture81,
  mipLevel: 0,
  origin: {x: 16, y: 28, z: 9},
  aspect: 'all',
}, new Uint8Array(45).fill(53), /* required buffer size: 45 */
{offset: 45, bytesPerRow: 178}, {width: 5, height: 21, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
if (!arrayBuffer8.detached) { new Uint8Array(arrayBuffer8).fill(0x55); };
} catch {}
let bindGroup63 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [{binding: 41, resource: {buffer: buffer26, offset: 24064, size: 102}}],
});
let texture146 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler99 = device0.createSampler({
  label: '\u{1f8ae}\ufb6a\u6fff\u8f13\u0d00\u1c9e',
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 5.937,
  lodMaxClamp: 17.41,
});
document.body.prepend(img1);
let commandEncoder139 = device0.createCommandEncoder({label: '\ue2b9\u0f31\ud6c5\u0375\u0f8e\uc891\ufd7d\u0b90\u67ab'});
let texture147 = device0.createTexture({
  label: '\u9206\udfe0\u0af5\u0fcc\u168d\u6799\u0637\u0526\u2853\uea66\u5d22',
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView127 = texture15.createView({label: '\u{1f951}\u9d47\u7273\u{1fd22}'});
let computePassEncoder103 = commandEncoder139.beginComputePass({});
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData6,
  origin: { x: 7, y: 15 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 47, y: 2, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 2, height: 3, depthOrArrayLayers: 0});
} catch {}
let commandEncoder140 = device0.createCommandEncoder({});
let texture148 = gpuCanvasContext0.getCurrentTexture();
let textureView128 = texture101.createView({mipLevelCount: 1, baseArrayLayer: 0});
try {
computePassEncoder18.setBindGroup(0, bindGroup11);
} catch {}
try {
computePassEncoder103.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(5, buffer66, 0, 24);
} catch {}
try {
buffer69.unmap();
} catch {}
let textureView129 = texture101.createView({});
let texture149 = device0.createTexture({
  label: '\u11d5\uefc7\u732e\u0a0f\uefc5\u0734',
  size: [192, 912, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let textureView130 = texture122.createView({});
let renderPassEncoder55 = commandEncoder140.beginRenderPass({colorAttachments: [{view: textureView97, loadOp: 'load', storeOp: 'store'}]});
let sampler100 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 50.83,
  lodMaxClamp: 65.11,
});
try {
computePassEncoder0.setBindGroup(2, bindGroup38, new Uint32Array(147), 25, 0);
} catch {}
try {
renderPassEncoder38.setBindGroup(3, bindGroup6, new Uint32Array(87), 5, 0);
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer65, 'uint32', 2_492, 1_216);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture117,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(9_611).fill(107), /* required buffer size: 9_611 */
{offset: 11, bytesPerRow: 60, rowsPerImage: 40}, {width: 0, height: 0, depthOrArrayLayers: 5});
} catch {}
let offscreenCanvas6 = new OffscreenCanvas(727, 274);
let bindGroup64 = device0.createBindGroup({
  layout: bindGroupLayout19,
  entries: [{binding: 721, resource: {buffer: buffer61, offset: 512, size: 3300}}],
});
let commandEncoder141 = device0.createCommandEncoder({});
let textureView131 = texture97.createView({baseMipLevel: 0, baseArrayLayer: 8, arrayLayerCount: 3});
let renderPassEncoder56 = commandEncoder141.beginRenderPass({
  colorAttachments: [{
  view: textureView122,
  depthSlice: 245,
  clearValue: { r: 191.3, g: -495.4, b: 464.0, a: 906.1, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet10,
});
try {
renderPassEncoder1.setBindGroup(0, bindGroup41);
} catch {}
try {
renderPassEncoder26.setBindGroup(1, bindGroup22, new Uint32Array(559), 63, 0);
} catch {}
try {
renderPassEncoder7.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder51.setVertexBuffer(0, buffer102);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 2, height: 1, depthOrArrayLayers: 2}
*/
{
  source: videoFrame16,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture27,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\ufb9b\u39f7\u5359\u{1f9b4}\u0a22\ua563\u{1fc25}\uc22a\u04fe\uc6ce';
} catch {}
let bindGroup65 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 126, resource: textureView27}, {binding: 67, resource: sampler87}],
});
let commandEncoder142 = device0.createCommandEncoder();
let texture150 = device0.createTexture({
  size: {width: 1},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
  viewFormats: [],
});
try {
computePassEncoder91.setBindGroup(0, bindGroup58);
} catch {}
try {
computePassEncoder13.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup57, new Uint32Array(4352), 139, 0);
} catch {}
try {
commandEncoder142.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 796 */
  offset: 796,
  bytesPerRow: 9984,
  buffer: buffer16,
}, {
  texture: texture36,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder2.pushDebugGroup('\u8e6f');
} catch {}
document.body.append(canvas0);
let buffer113 = device0.createBuffer({
  size: 12282,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let renderPassEncoder57 = commandEncoder142.beginRenderPass({
  colorAttachments: [{
  view: textureView97,
  clearValue: { r: -223.8, g: 528.2, b: 277.8, a: -675.1, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet6,
});
let sampler101 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 77.22,
});
try {
computePassEncoder67.setBindGroup(0, bindGroup62, new Uint32Array(853), 51, 0);
} catch {}
try {
renderPassEncoder28.setBindGroup(3, bindGroup36, new Uint32Array(617), 53, 0);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer112, 'uint32', 460, 505);
} catch {}
try {
renderPassEncoder10.setPipeline(pipeline2);
} catch {}
let buffer114 = device0.createBuffer({
  size: 7710,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let textureView132 = texture32.createView({aspect: 'all', mipLevelCount: 1});
let sampler102 = device0.createSampler({
  label: '\u2176\u{1fe98}\u9a69\u005d\u1f15\uf4e3\u9be7\u75ed\uba91',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  lodMinClamp: 37.82,
  lodMaxClamp: 88.63,
});
try {
computePassEncoder92.setBindGroup(3, bindGroup16);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder18); computePassEncoder18.dispatchWorkgroupsIndirect(buffer34, 452); };
} catch {}
try {
computePassEncoder18.end();
} catch {}
try {
renderPassEncoder51.beginOcclusionQuery(520);
} catch {}
try {
renderPassEncoder54.setStencilReference(97);
} catch {}
try {
renderPassEncoder54.setIndexBuffer(buffer103, 'uint16', 2_870, 489);
} catch {}
try {
renderPassEncoder21.setVertexBuffer(7, buffer34, 1_788);
} catch {}
try {
gpuCanvasContext6.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture134,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(117).fill(53), /* required buffer size: 117 */
{offset: 117}, {width: 1, height: 0, depthOrArrayLayers: 1});
} catch {}
let shaderModule9 = device0.createShaderModule({
  code: `
diagnostic(info, xyz);

requires readonly_and_readwrite_storage_textures;

enable f16;

alias vec3b = vec3<bool>;

@group(0) @binding(119) var<storage, read_write> buffer115: array<array<array<array<array<f16, 1>, 1>, 5>, 5>>;

fn unconst_i32(v: i32) -> i32 { return v; }

struct S5 {
  @location(12) f0: i32,
  @location(4) @interpolate(flat, sample) f1: vec2i,
}

override override36: bool;

struct T0 {
  @align(2) @size(52) f0: array<u32>,
}

struct FragmentOutput5 {
  @builtin(sample_mask) f0: u32,
  @location(0) f1: vec4f,
}

var<workgroup> vw16: array<array<vec4h, 12>, 1>;

struct VertexOutput8 {
  @location(10) @interpolate(flat, sample) f47: f16,
  @builtin(position) f48: vec4f,
  @location(4) @interpolate(flat) f49: i32,
}

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(78) var et7: texture_external;

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

struct T1 {
  @align(2) @size(20) f0: array<u32>,
}

@vertex
fn vertex10(a0: S5, @location(0) a1: vec2h, @location(7) @interpolate(perspective, center) a2: vec4f, @location(13) @interpolate(flat, sample) a3: vec4u, @location(15) @interpolate(flat) a4: vec2i) -> VertexOutput8 {
  var out: VertexOutput8;
  let vf111: f16 = log2(f16(unconst_f16(717.8)));
  var vf112: vec2h = normalize(bitcast<vec2h>(a0.f1[1]));
  out = VertexOutput8(a1[u32(unconst_u32(91))], vec4f(f32(a1[u32(unconst_u32(91))])), i32(a1[u32(unconst_u32(91))]));
  var vf113: vec3i = firstTrailingBit(vec3i(unconst_i32(478), unconst_i32(49), unconst_i32(-76)));
  out.f49 = bitcast<i32>(a1);
  var vf114: i32 = a0.f1[1];
  var vf115: vec4f = a2;
  var vf116: vec2h = a1;
  out.f47 -= vf116[0];
  vf115 -= vec4f(f32(tan(max(vec4h(unconst_f16(12261.1), unconst_f16(3103.4), unconst_f16(60000.0), unconst_f16(-26238.7)), vec4h(unconst_f16(32688.4), unconst_f16(2683.4), unconst_f16(6912.2), unconst_f16(287.6)))[2])));
  var vf117: vec2i = a0.f1;
  var vf118: vec2h = asin(vec2h(unconst_f16(3356.6), unconst_f16(8721.0)));
  return out;
}

@fragment
fn fragment8() -> FragmentOutput5 {
  var out: FragmentOutput5;
  let ptr136: ptr<storage, array<array<f16, 1>, 1>, read_write> = &(*&buffer115)[arrayLength(&(*&buffer115))][4][4];
  let vf119: f16 = dot(sign(vec2h((*&buffer115)[arrayLength(&(*&buffer115))][4][4][0][0])).xyxy, vec4h(unconst_f16(35323.6), unconst_f16(190.5), unconst_f16(20003.8), unconst_f16(5704.0)));
  let ptr137: ptr<storage, array<array<f16, 1>, 1>, read_write> = &buffer115[arrayLength(&buffer115)][4][4];
  let ptr138: ptr<storage, array<array<array<array<f16, 1>, 1>, 5>, 5>, read_write> = &(*&buffer115)[arrayLength(&(*&buffer115)) - 1];
  out.f1 *= vec4f(f32((*ptr138)[4][4][0][0]));
  return out;
}

@compute @workgroup_size(2, 2, 1)
fn compute8() {
  buffer115[u32((*&buffer115)[u32(override36)][4][4][0][0])][u32(buffer115[arrayLength(&buffer115)][4][4][0][0])][u32(vw16[0][11][0])][u32(unconst_u32(148))][firstTrailingBit(vec3u(u32(buffer115[arrayLength(&buffer115)][4][4][0][0])))[0]] = buffer115[arrayLength(&buffer115)][4][4][0][0];
  vw16[u32(unconst_u32(74))][u32((*&vw16)[0][u32(unconst_u32(46))][0])] = vec4h((*&buffer115)[i32(unconst_i32(159))][4][4][0][0]);
  let vf120: bool = override36;
  let vf121: f16 = vw16[0][11][0];
  vw16[u32(unconst_u32(64))][u32(buffer115[arrayLength(&buffer115)][4][4][0][0])] -= vw16[u32(unconst_u32(68))][11];
  var vf122: f16 = vw16[0][11][0];
  vw16[u32(buffer115[arrayLength(&buffer115)][4][4][0][0])][u32(unconst_u32(151))] *= vec4h(vf121);
  buffer115[u32(unconst_u32(327))][bitcast<u32>(atan(vec2f(f32(vw16[0][11][0]))).y)][u32(unconst_u32(49))][u32(unconst_u32(144))][firstTrailingBit(vec3u(workgroupUniformLoad(&vw16)[0][11].xyz))[1]] *= (*&vw16)[0][11].w;
  buffer115[u32(vw16[0][11][0])][pack4xU8Clamp(vec4u(vw16[0][11]))][u32(vw16[0][11][0])][u32(unconst_u32(222))][u32(unconst_u32(102))] = buffer115[arrayLength(&buffer115)][4][4][0][0];
  let ptr139: ptr<workgroup, vec4h> = &vw16[0][11];
  let ptr140: ptr<workgroup, array<vec4h, 12>> = &(*&vw16)[0];
  vf122 += buffer115[arrayLength(&buffer115)][4][4][0][0];
  var vf123: u32 = arrayLength(&buffer115);
  vf123 -= u32((*&vw16)[0][11].a);
  vf122 = (*&vw16)[0][11].g;
  vf123 *= u32(buffer115[arrayLength(&buffer115)][4][4][0][0]);
  var vf124: f16 = (*ptr139)[bitcast<u32>(degrees(vec2h(unconst_f16(8938.6), unconst_f16(4795.0))))];
  var vf125: f16 = atan2(f16(unconst_f16(5633.1)), f16(unconst_f16(4309.7)));
  let vf126: f16 = (*ptr139)[2];
  vf122 = buffer115[arrayLength(&buffer115)][4][u32(atan2(f16(unconst_f16(3595.1)), f16(unconst_f16(2017.9))))][0][0];
  vf124 -= (*&buffer115)[arrayLength(&(*&buffer115))][4][4][0][0];
  vf124 = (*&buffer115)[arrayLength(&(*&buffer115))][4][4][0][u32((*&vw16)[0][11].y)];
  let ptr141: ptr<workgroup, array<vec4h, 12>> = &vw16[0];
  _ = override36;
}`,
  sourceMap: {},
});
let commandEncoder143 = device0.createCommandEncoder({});
let computePassEncoder104 = commandEncoder20.beginComputePass();
let renderPassEncoder58 = commandEncoder143.beginRenderPass({
  colorAttachments: [{
  view: textureView113,
  clearValue: { r: -732.7, g: 502.0, b: 268.4, a: -666.3, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet9,
});
let renderBundleEncoder13 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float']});
let renderBundle13 = renderBundleEncoder13.finish({});
let sampler103 = device0.createSampler({
  label: '\u9b21\u0ded\u751c\u0778\uc1e4\u03cd\u{1f766}\u0a27\u3c89\u2201\u10aa',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  maxAnisotropy: 2,
});
try {
computePassEncoder32.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder104.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder51.endOcclusionQuery();
} catch {}
try {
renderPassEncoder58.setIndexBuffer(buffer60, 'uint16', 168, 49);
} catch {}
try {
renderPassEncoder16.setVertexBuffer(6, buffer109, 416, 760);
} catch {}
try {
  await promise17;
} catch {}
let bindGroup66 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 126, resource: textureView29}, {binding: 67, resource: sampler70}],
});
let buffer116 = device0.createBuffer({
  label: '\u0295\u{1fe73}\u{1fab8}\uff23\uaa9b\u1659\u0af3\u7463\u04c7',
  size: 12532,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
let commandEncoder144 = device0.createCommandEncoder({});
let computePassEncoder105 = commandEncoder144.beginComputePass();
let sampler104 = device0.createSampler({
  label: '\u8c09\u3301\u074e\u{1f98d}\ud7ab\u2d2c\u{1fc6c}',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 40.76,
  lodMaxClamp: 76.15,
  maxAnisotropy: 8,
});
try {
computePassEncoder69.setBindGroup(0, bindGroup26, new Uint32Array(731), 76, 0);
} catch {}
try {
computePassEncoder105.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder26.setBindGroup(2, bindGroup25, new Uint32Array(3927), 236, 0);
} catch {}
try {
renderPassEncoder48.setVertexBuffer(5, buffer43, 0);
} catch {}
try {
computePassEncoder25.insertDebugMarker('\u{1fd41}');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer117 = device0.createBuffer({
  size: 4977,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let sampler105 = device0.createSampler({
  label: '\u0a65\u0770\ufdcc\ue09e\ub0a3\u8699\u06c9\u0fd2',
  magFilter: 'nearest',
  minFilter: 'linear',
  lodMaxClamp: 33.96,
});
try {
renderPassEncoder51.end();
} catch {}
try {
commandEncoder133.copyTextureToTexture({
  texture: texture110,
  mipLevel: 0,
  origin: {x: 11, y: 129, z: 0},
  aspect: 'all',
},
{
  texture: texture42,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
},
{width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder133.resolveQuerySet(querySet2, 50, 235, buffer2, 512);
} catch {}
let textureView133 = texture119.createView({dimension: '2d-array', mipLevelCount: 2});
try {
computePassEncoder37.setBindGroup(0, bindGroup37);
} catch {}
try {
computePassEncoder96.setBindGroup(3, bindGroup36, new Uint32Array(65), 30, 0);
} catch {}
try {
renderPassEncoder48.setBindGroup(0, bindGroup15, new Uint32Array(596), 153, 0);
} catch {}
try {
commandEncoder133.copyBufferToBuffer(buffer72, 8, buffer116, 408, 20);
} catch {}
try {
commandEncoder133.copyBufferToTexture({
  /* bytesInLastRow: 48 widthInBlocks: 48 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 7480 */
  offset: 7480,
  bytesPerRow: 54784,
  rowsPerImage: 268,
  buffer: buffer40,
}, {
  texture: texture63,
  mipLevel: 1,
  origin: {x: 0, y: 1, z: 0},
  aspect: 'stencil-only',
}, {width: 48, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer75, 1412, new Int16Array(9499), 3802, 120);
} catch {}
let canvas2 = document.createElement('canvas');
let commandEncoder145 = device0.createCommandEncoder();
let texture151 = device0.createTexture({size: [192, 912, 1], format: 'rgb10a2uint', usage: GPUTextureUsage.RENDER_ATTACHMENT});
try {
renderPassEncoder9.setBindGroup(1, bindGroup63, new Uint32Array(1189), 440, 0);
} catch {}
try {
renderPassEncoder24.setStencilReference(117);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer40, 'uint16', 1_874, 3_398);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture72,
  mipLevel: 0,
  origin: {x: 30, y: 13, z: 7},
  aspect: 'all',
}, new Uint8Array(168_390).fill(37), /* required buffer size: 168_390 */
{offset: 40, bytesPerRow: 202, rowsPerImage: 14}, {width: 21, height: 8, depthOrArrayLayers: 60});
} catch {}
let bindGroup67 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 185, resource: textureView5}, {binding: 67, resource: textureView7}],
});
let buffer118 = device0.createBuffer({size: 210, usage: GPUBufferUsage.MAP_WRITE, mappedAtCreation: false});
let texture152 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
let computePassEncoder106 = commandEncoder145.beginComputePass({});
let renderPassEncoder59 = commandEncoder133.beginRenderPass({
  label: '\u105b\uac8f',
  colorAttachments: [{
  view: textureView97,
  clearValue: { r: -359.1, g: 90.70, b: 923.8, a: -558.0, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let renderBundleEncoder14 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], stencilReadOnly: true});
let sampler106 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
});
try {
computePassEncoder93.setBindGroup(0, bindGroup51, new Uint32Array(3339), 156, 0);
} catch {}
try {
computePassEncoder56.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder106.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder14.setBindGroup(2, bindGroup20, new Uint32Array(1992), 138, 0);
} catch {}
let commandEncoder146 = device0.createCommandEncoder({});
let texture153 = device0.createTexture({
  size: [384, 1824, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let computePassEncoder107 = commandEncoder146.beginComputePass({label: '\u815e\u039f\udc95\u{1fe21}\u{1fc04}\u4c04\u0347\u0098\u14d4\u{1ffa3}\ucdd7'});
let renderBundle14 = renderBundleEncoder14.finish();
try {
computePassEncoder107.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder50.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder59.setVertexBuffer(4, buffer12);
} catch {}
let buffer119 = device0.createBuffer({size: 5168, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder147 = device0.createCommandEncoder({});
let texture154 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 155},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder108 = commandEncoder147.beginComputePass({});
try {
computePassEncoder75.setBindGroup(2, bindGroup22);
} catch {}
try {
computePassEncoder7.setBindGroup(2, bindGroup51, new Uint32Array(1133), 150, 0);
} catch {}
try {
renderPassEncoder56.setVertexBuffer(3, buffer23, 2_520, 237);
} catch {}
let commandEncoder148 = device0.createCommandEncoder();
let textureView134 = texture78.createView({dimension: '2d', baseMipLevel: 0, mipLevelCount: 1});
try {
computePassEncoder96.setBindGroup(1, bindGroup52, new Uint32Array(568), 106, 0);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline3);
} catch {}
try {
commandEncoder148.copyBufferToBuffer(buffer21, 1088, buffer2, 336, 12);
} catch {}
try {
commandEncoder148.copyTextureToTexture({
  texture: texture34,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture34,
  mipLevel: 1,
  origin: {x: 1, y: 19, z: 0},
  aspect: 'all',
},
{width: 15, height: 63, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder148.resolveQuerySet(querySet1, 69, 1, buffer35, 512);
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
await gc();
let buffer120 = device0.createBuffer({size: 10403, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM});
let commandEncoder149 = device0.createCommandEncoder();
let textureView135 = texture73.createView({aspect: 'all'});
let computePassEncoder109 = commandEncoder148.beginComputePass({});
let sampler107 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 55.74,
  lodMaxClamp: 71.62,
  maxAnisotropy: 6,
});
try {
computePassEncoder5.setBindGroup(1, bindGroup57);
} catch {}
try {
computePassEncoder109.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder43.beginOcclusionQuery(2);
} catch {}
try {
renderPassEncoder42.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder50.setVertexBuffer(1, buffer75, 0, 727);
} catch {}
try {
  await promise14;
} catch {}
let bindGroup68 = device0.createBindGroup({
  label: '\u96ac\u{1faf0}\u{1fe9d}\u{1fb45}\u963f\uf73c\ua4b5\uf173\u28bf\u0d6c\u3f03',
  layout: bindGroupLayout0,
  entries: [
    {binding: 119, resource: {buffer: buffer68, offset: 5120, size: 2596}},
    {binding: 204, resource: {buffer: buffer117, offset: 512, size: 724}},
    {binding: 78, resource: externalTexture6},
  ],
});
let commandEncoder150 = device0.createCommandEncoder({});
let renderPassEncoder60 = commandEncoder150.beginRenderPass({
  label: '\u25e7\u{1f9a0}\u4d31',
  colorAttachments: [{
  view: textureView81,
  depthSlice: 37,
  clearValue: { r: 111.6, g: -483.3, b: 563.8, a: 761.1, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet9,
});
try {
computePassEncoder19.setBindGroup(3, bindGroup43, new Uint32Array(1722), 426, 0);
} catch {}
try {
renderPassEncoder23.setBindGroup(2, bindGroup30, new Uint32Array(723), 226, 0);
} catch {}
try {
renderPassEncoder41.setVertexBuffer(6, buffer33);
} catch {}
let arrayBuffer13 = buffer14.getMappedRange(816, 4);
let commandEncoder151 = device0.createCommandEncoder({});
try {
computePassEncoder87.setBindGroup(3, bindGroup46);
} catch {}
try {
renderPassEncoder35.setBindGroup(1, bindGroup12);
} catch {}
try {
renderPassEncoder24.setBindGroup(1, bindGroup3, new Uint32Array(1434), 119, 0);
} catch {}
try {
renderPassEncoder7.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder59.setVertexBuffer(0, buffer93, 244, 62);
} catch {}
try {
buffer120.unmap();
} catch {}
let texture155 = device0.createTexture({
  size: [192, 912, 1],
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let textureView136 = texture31.createView({label: '\u813a\ue0c9\u{1fc02}\u{1fc95}\ua91d\u{1f8b2}\u0228\u16b1\u01f7', arrayLayerCount: 1});
let computePassEncoder110 = commandEncoder149.beginComputePass();
let renderPassEncoder61 = commandEncoder151.beginRenderPass({
  colorAttachments: [{
  view: textureView46,
  depthSlice: 19,
  clearValue: { r: 231.9, g: 320.2, b: -920.7, a: 895.3, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
let sampler108 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 39.58,
  lodMaxClamp: 42.34,
  maxAnisotropy: 1,
});
try {
renderPassEncoder8.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder57.setStencilReference(283);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture91,
  mipLevel: 0,
  origin: {x: 4, y: 9, z: 3},
  aspect: 'all',
}, new Uint8Array(7_891).fill(142), /* required buffer size: 7_891 */
{offset: 7, bytesPerRow: 18, rowsPerImage: 131}, {width: 0, height: 46, depthOrArrayLayers: 4});
} catch {}
try {
sampler7.label = '\u0cac\ub682\u{1ffcc}\u4a30\ua552\u0748';
} catch {}
let bindGroup69 = device0.createBindGroup({
  layout: bindGroupLayout19,
  entries: [{binding: 721, resource: {buffer: buffer53, offset: 0, size: 1444}}],
});
let querySet12 = device0.createQuerySet({type: 'occlusion', count: 567});
try {
computePassEncoder2.setBindGroup(2, bindGroup65, []);
} catch {}
try {
computePassEncoder59.setBindGroup(0, bindGroup57, new Uint32Array(1564), 180, 0);
} catch {}
try {
computePassEncoder110.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder61.setBindGroup(2, bindGroup45);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer113, 'uint16', 226, 29);
} catch {}
let commandEncoder152 = device0.createCommandEncoder({});
let textureView137 = texture121.createView({});
let computePassEncoder111 = commandEncoder152.beginComputePass({});
try {
computePassEncoder108.setPipeline(pipeline0);
} catch {}
try {
buffer109.unmap();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 4, height: 1, depthOrArrayLayers: 491}
*/
{
  source: videoFrame13,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture32,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 14},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer121 = device0.createBuffer({size: 19916, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
try {
computePassEncoder57.setBindGroup(2, bindGroup43);
} catch {}
try {
computePassEncoder35.setBindGroup(3, bindGroup1, new Uint32Array(7512), 1_675, 0);
} catch {}
try {
renderPassEncoder57.executeBundles([renderBundle9]);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer81, 'uint32', 1_516, 544);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
if (!arrayBuffer9.detached) { new Uint8Array(arrayBuffer9).fill(0x55); };
} catch {}
let commandEncoder153 = device0.createCommandEncoder({});
let texture156 = device0.createTexture({
  size: [48, 228, 256],
  mipLevelCount: 4,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler109 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 46.48,
});
try {
computePassEncoder46.setBindGroup(1, bindGroup49, new Uint32Array(707), 82, 0);
} catch {}
try {
renderPassEncoder9.setBindGroup(3, bindGroup40);
} catch {}
try {
commandEncoder153.copyBufferToTexture({
  /* bytesInLastRow: 280 widthInBlocks: 35 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 136 */
  offset: 136,
  bytesPerRow: 23040,
  buffer: buffer105,
}, {
  texture: texture78,
  mipLevel: 1,
  origin: {x: 11, y: 11, z: 0},
  aspect: 'all',
}, {width: 35, height: 40, depthOrArrayLayers: 0});
} catch {}
let bindGroup70 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 138, resource: textureView28},
    {binding: 13, resource: {buffer: buffer70, offset: 768, size: 6692}},
  ],
});
let commandEncoder154 = device0.createCommandEncoder();
let texture157 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  mipLevelCount: 5,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView138 = texture11.createView({dimension: '2d-array', mipLevelCount: 3});
let renderPassEncoder62 = commandEncoder153.beginRenderPass({
  colorAttachments: [{
  view: textureView94,
  clearValue: { r: -13.60, g: 730.8, b: 870.5, a: 599.2, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 393150752,
});
try {
computePassEncoder70.setBindGroup(2, bindGroup62, new Uint32Array(2998), 316, 0);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST,
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
let offscreenCanvas7 = new OffscreenCanvas(141, 174);
let texture158 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 80},
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder19.setBindGroup(1, bindGroup51, new Uint32Array(2759), 663, 0);
} catch {}
try {
renderPassEncoder14.beginOcclusionQuery(53);
} catch {}
try {
renderPassEncoder49.executeBundles([renderBundle11]);
} catch {}
try {
renderPassEncoder1.setPipeline(pipeline2);
} catch {}
let commandEncoder155 = device0.createCommandEncoder();
let querySet13 = device0.createQuerySet({type: 'occlusion', count: 9});
let textureView139 = texture79.createView({dimension: '2d-array', aspect: 'all', baseArrayLayer: 0});
let computePassEncoder112 = commandEncoder155.beginComputePass({});
let renderPassEncoder63 = commandEncoder154.beginRenderPass({
  label: '\uc531\u0171',
  colorAttachments: [{view: textureView99, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet12,
});
try {
renderPassEncoder36.setBindGroup(1, bindGroup64);
} catch {}
try {
renderPassEncoder24.executeBundles([renderBundle0, renderBundle12, renderBundle11]);
} catch {}
try {
renderPassEncoder2.setScissorRect(0, 0, 0, 0);
} catch {}
try {
renderPassEncoder45.setIndexBuffer(buffer104, 'uint16', 1_456, 3_980);
} catch {}
try {
renderPassEncoder36.setVertexBuffer(1, buffer113, 728, 446);
} catch {}
let textureView140 = texture73.createView({aspect: 'all', baseArrayLayer: 0});
let textureView141 = texture46.createView({mipLevelCount: 1, baseArrayLayer: 0});
try {
renderPassEncoder46.setBindGroup(3, bindGroup9, new Uint32Array(668), 59, 0);
} catch {}
let promise19 = device0.queue.onSubmittedWorkDone();
let videoFrame18 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRA',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-ncl', primaries: 'jedecP22Phosphors', transfer: 'log'} });
let bindGroup71 = device0.createBindGroup({
  label: '\u0b48\u{1f641}\u3bf8\u4fd8\u{1f93b}\u879d\u99b0\u{1fad0}\u0ec6\udd76\u0325',
  layout: bindGroupLayout11,
  entries: [{binding: 31, resource: textureView63}],
});
let sampler110 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  minFilter: 'nearest',
  lodMinClamp: 52.29,
  lodMaxClamp: 76.60,
});
let externalTexture12 = device0.importExternalTexture({source: videoFrame18});
try {
computePassEncoder80.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder111.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle7]);
} catch {}
try {
renderPassEncoder20.setViewport(3.566300433704722, 0.957109414802942, 1.4938895862510522, 0.006308152658550169, 0.8665969122848077, 0.948230701080056);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(1, buffer45, 0);
} catch {}
let commandEncoder156 = device0.createCommandEncoder({});
try {
computePassEncoder112.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder14.endOcclusionQuery();
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer15, 'uint16', 764, 373);
} catch {}
try {
commandEncoder156.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1540 */
  offset: 1540,
  bytesPerRow: 9216,
  buffer: buffer84,
}, {
  texture: texture12,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder156.copyTextureToBuffer({
  texture: texture106,
  mipLevel: 0,
  origin: {x: 1, y: 35, z: 12},
  aspect: 'all',
}, {
  /* bytesInLastRow: 472 widthInBlocks: 59 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 208 */
  offset: 208,
  bytesPerRow: 38656,
  buffer: buffer82,
}, {width: 59, height: 223, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder156.copyTextureToTexture({
  texture: texture112,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout15 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture159 = device0.createTexture({
  size: [192, 912, 1],
  mipLevelCount: 5,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder106.setBindGroup(1, bindGroup3, new Uint32Array(1694), 257, 0);
} catch {}
document.body.append(img0);
let computePassEncoder113 = commandEncoder156.beginComputePass({label: '\u{1ffad}\ua9e0\u748b\u0e86'});
try {
computePassEncoder113.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder59.setBindGroup(3, bindGroup50, new Uint32Array(288), 64, 0);
} catch {}
try {
renderPassEncoder43.endOcclusionQuery();
} catch {}
try {
device0.queue.writeBuffer(buffer43, 5496, new BigUint64Array(28706), 1559, 604);
} catch {}
let bindGroup72 = device0.createBindGroup({
  label: '\u09da\u{1f6c2}\u60c4\u8899\u8a9c\u{1ff74}\u{1fd4e}\u093a\u3c90\u{1fbdc}',
  layout: bindGroupLayout11,
  entries: [{binding: 31, resource: textureView65}],
});
let buffer122 = device0.createBuffer({
  label: '\u{1fa1b}\u0e1d\ue7ad\ue7e0',
  size: 14285,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
});
let textureView142 = texture136.createView({dimension: '2d', aspect: 'all'});
let texture160 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 6},
  sampleCount: 1,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST,
});
try {
computePassEncoder107.setBindGroup(3, bindGroup13);
} catch {}
try {
renderPassEncoder37.executeBundles([renderBundle6]);
} catch {}
try {
renderPassEncoder45.setVertexBuffer(2, buffer2);
} catch {}
let buffer123 = device0.createBuffer({
  size: 6966,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
try {
computePassEncoder65.setBindGroup(0, bindGroup5, new Uint32Array(2548), 299, 0);
} catch {}
try {
renderPassEncoder18.setBindGroup(1, bindGroup41);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle0]);
} catch {}
try {
  await promise19;
} catch {}
let videoFrame19 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'smpte240m', primaries: 'unspecified', transfer: 'iec61966-2-1'} });
let commandEncoder157 = device0.createCommandEncoder({});
let renderPassEncoder64 = commandEncoder157.beginRenderPass({
  colorAttachments: [{
  view: textureView96,
  clearValue: { r: 718.5, g: 521.0, b: 282.9, a: 788.7, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder100.setBindGroup(0, bindGroup56, new Uint32Array(1367), 93, 0);
} catch {}
try {
renderPassEncoder64.setBindGroup(1, bindGroup25);
} catch {}
try {
renderPassEncoder28.setIndexBuffer(buffer116, 'uint16', 1_226, 1_641);
} catch {}
try {
buffer30.unmap();
} catch {}
let gpuCanvasContext8 = offscreenCanvas6.getContext('webgpu');
let img3 = await imageWithData(11, 13, '#10101010', '#20202020');
let buffer124 = device0.createBuffer({size: 3853, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder158 = device0.createCommandEncoder({label: '\u00ad\u620f\uc84b\u{1f789}\u{1fd0c}\uc9a8\uede0\u0f23'});
let texture161 = device0.createTexture({
  size: {width: 96, height: 456, depthOrArrayLayers: 1},
  dimension: '2d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC,
});
let renderPassEncoder65 = commandEncoder158.beginRenderPass({
  colorAttachments: [{
  view: textureView104,
  clearValue: { r: 827.7, g: -849.8, b: -175.1, a: -211.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet13,
  maxDrawCount: 46625139,
});
let sampler111 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 57.53,
  lodMaxClamp: 69.21,
  maxAnisotropy: 14,
});
try {
renderPassEncoder59.setBindGroup(1, bindGroup20);
} catch {}
try {
renderPassEncoder24.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(4, buffer93, 1_536, 182);
} catch {}
try {
buffer51.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer88, 2308, new BigUint64Array(5904), 166, 344);
} catch {}
let renderBundleEncoder15 = device0.createRenderBundleEncoder({
  label: '\u9371\u1119\u96ff\u2282\u{1ff22}\u{1f6ba}\u{1fb09}\ube05\u{1fae8}',
  colorFormats: ['rgb10a2uint'],
  stencilReadOnly: false,
});
let renderBundle15 = renderBundleEncoder15.finish({});
try {
computePassEncoder75.setBindGroup(1, bindGroup69, new Uint32Array(1025), 264, 0);
} catch {}
try {
renderPassEncoder38.setScissorRect(0, 6, 0, 148);
} catch {}
try {
device0.queue.writeBuffer(buffer69, 160, new Float32Array(5127), 3837, 4);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 128, height: 128, depthOrArrayLayers: 17}
*/
{
  source: imageData14,
  origin: { x: 0, y: 3 },
  flipY: true,
}, {
  texture: texture23,
  mipLevel: 1,
  origin: {x: 29, y: 28, z: 8},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 19, height: 1, depthOrArrayLayers: 0});
} catch {}
let gpuCanvasContext9 = offscreenCanvas7.getContext('webgpu');
let imageBitmap2 = await createImageBitmap(offscreenCanvas3);
let bindGroupLayout21 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 504,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
  ],
});
let texture162 = device0.createTexture({
  size: [256, 256, 56],
  mipLevelCount: 1,
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder15.setBindGroup(0, bindGroup55);
} catch {}
try {
renderPassEncoder2.setPipeline(pipeline2);
} catch {}
try {
buffer31.unmap();
} catch {}
let bindGroup73 = device0.createBindGroup({layout: bindGroupLayout7, entries: [{binding: 218, resource: textureView66}]});
let buffer125 = device0.createBuffer({size: 3924, usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE});
let texture163 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
  viewFormats: [],
});
let sampler112 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 84.80,
});
try {
computePassEncoder19.setBindGroup(1, bindGroup36);
} catch {}
try {
renderPassEncoder56.setBindGroup(0, bindGroup32);
} catch {}
try {
renderPassEncoder8.setBindGroup(2, bindGroup37, new Uint32Array(367), 44, 0);
} catch {}
let texture164 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  sampleCount: 4,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder113.setBindGroup(3, bindGroup56);
} catch {}
try {
computePassEncoder81.setBindGroup(0, bindGroup66, new Uint32Array(2849), 434, 0);
} catch {}
try {
renderPassEncoder42.beginOcclusionQuery(53);
} catch {}
try {
renderPassEncoder42.endOcclusionQuery();
} catch {}
try {
renderPassEncoder7.setVertexBuffer(3, buffer76, 0, 412);
} catch {}
let commandEncoder159 = device0.createCommandEncoder({});
let texture165 = device0.createTexture({
  label: '\u0fa3\u06db\uf432\u{1ff3c}\u{1fc99}',
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView143 = texture111.createView({dimension: '2d', baseArrayLayer: 3});
let sampler113 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 99.54,
});
try {
renderPassEncoder17.setIndexBuffer(buffer77, 'uint32', 228, 4_971);
} catch {}
let arrayBuffer14 = buffer72.getMappedRange(176, 0);
try {
device0.queue.writeBuffer(buffer99, 484, new DataView(new ArrayBuffer(5853)), 411, 1212);
} catch {}
let videoFrame20 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt709', primaries: 'smpteSt4281', transfer: 'smpteSt4281'} });
let textureView144 = texture68.createView({dimension: 'cube-array', arrayLayerCount: 6});
let computePassEncoder114 = commandEncoder159.beginComputePass();
try {
computePassEncoder114.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder19.executeBundles([renderBundle11]);
} catch {}
try {
buffer81.unmap();
} catch {}
try {
renderPassEncoder2.popDebugGroup();
} catch {}
await gc();
let buffer126 = device0.createBuffer({size: 4200, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX});
let texture166 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 130},
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let texture167 = gpuCanvasContext2.getCurrentTexture();
let sampler114 = device0.createSampler({
  label: '\u{1f69c}\uc480\u8b01\ua62b\uc5e9\u72d9\u431a\u0567\u{1f818}\u0f4a\u9834',
  addressModeU: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 48.36,
  lodMaxClamp: 85.33,
});
try {
computePassEncoder79.setBindGroup(1, bindGroup54, []);
} catch {}
try {
renderPassEncoder61.setBindGroup(1, bindGroup13);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup61, new Uint32Array(505), 50, 0);
} catch {}
let bindGroup74 = device0.createBindGroup({layout: bindGroupLayout18, entries: [{binding: 188, resource: sampler0}]});
let commandEncoder160 = device0.createCommandEncoder({});
let texture168 = device0.createTexture({
  label: '\ua637\ue21e\u{1f89e}\u341e\u0134',
  size: {width: 1},
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView145 = texture45.createView({dimension: 'cube-array', baseArrayLayer: 1, arrayLayerCount: 6});
let computePassEncoder115 = commandEncoder160.beginComputePass();
let renderBundleEncoder16 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], stencilReadOnly: true});
let renderBundle16 = renderBundleEncoder16.finish({});
try {
computePassEncoder52.setBindGroup(1, bindGroup73, new Uint32Array(3865), 145, 0);
} catch {}
try {
computePassEncoder17.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder115.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder38.setBindGroup(3, bindGroup47);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
externalTexture6.label = '\u054a\u{1f949}\uab66\u1be5\u{1fe90}\u{1fb04}\uc8b4\u0164\u12c3\u9f1a';
} catch {}
let buffer127 = device0.createBuffer({
  size: 13141,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let commandEncoder161 = device0.createCommandEncoder({});
let texture169 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  dimension: '2d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let renderPassEncoder66 = commandEncoder161.beginRenderPass({
  colorAttachments: [{
  view: textureView96,
  clearValue: { r: 169.5, g: -753.2, b: -510.9, a: -792.3, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler115 = device0.createSampler({
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 35.87,
  lodMaxClamp: 69.73,
  compare: 'equal',
});
try {
renderPassEncoder19.setIndexBuffer(buffer125, 'uint32', 96, 914);
} catch {}
try {
renderPassEncoder60.setPipeline(pipeline3);
} catch {}
let bindGroup75 = device0.createBindGroup({layout: bindGroupLayout16, entries: [{binding: 77, resource: textureView90}]});
let commandEncoder162 = device0.createCommandEncoder({});
let texture170 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler116 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 18.79,
  lodMaxClamp: 21.48,
  compare: 'greater-equal',
});
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
await gc();
let commandEncoder163 = device0.createCommandEncoder({});
let renderPassEncoder67 = commandEncoder162.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -346.1, g: -663.8, b: 78.04, a: 981.1, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundleEncoder17 = device0.createRenderBundleEncoder({label: '\u22d1\u1496\u0197\u283a\ue16c\ua8e1\u0475\uef1c\uf451\ufdf6', colorFormats: ['rgba16float']});
try {
renderPassEncoder24.executeBundles([renderBundle12]);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder33.setVertexBuffer(0, buffer77, 0, 874);
} catch {}
try {
renderBundleEncoder17.setIndexBuffer(buffer96, 'uint32', 940, 1_885);
} catch {}
try {
commandEncoder163.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 668 */
  offset: 668,
  bytesPerRow: 2816,
  rowsPerImage: 134,
  buffer: buffer29,
}, {
  texture: texture70,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer128 = device0.createBuffer({
  label: '\u6afa\ueb74',
  size: 144,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture171 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 461},
  mipLevelCount: 4,
  sampleCount: 1,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView146 = texture162.createView({});
let renderPassEncoder68 = commandEncoder163.beginRenderPass({colorAttachments: [{view: textureView96, loadOp: 'load', storeOp: 'discard'}]});
let sampler117 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'linear',
  lodMinClamp: 44.02,
  lodMaxClamp: 44.13,
  compare: 'less',
});
try {
computePassEncoder14.setBindGroup(2, bindGroup57, new Uint32Array(642), 81, 0);
} catch {}
try {
computePassEncoder79.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder54.setVertexBuffer(0, buffer12, 0, 2_544);
} catch {}
let videoFrame21 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'NV12',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt709', primaries: 'smpteRp431', transfer: 'smpteSt4281'} });
let commandEncoder164 = device0.createCommandEncoder({});
let computePassEncoder116 = commandEncoder164.beginComputePass({});
let sampler118 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 82.76,
  lodMaxClamp: 91.08,
  maxAnisotropy: 19,
});
try {
renderPassEncoder48.executeBundles([renderBundle6]);
} catch {}
try {
renderPassEncoder24.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder17.setIndexBuffer(buffer114, 'uint16', 910, 107);
} catch {}
try {
renderBundleEncoder17.setPipeline(pipeline2);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
try {
buffer127.unmap();
} catch {}
let gpuCanvasContext10 = canvas2.getContext('webgpu');
let offscreenCanvas8 = new OffscreenCanvas(487, 3);
let commandEncoder165 = device0.createCommandEncoder({});
let texture172 = device0.createTexture({size: [256, 256, 17], format: 'eac-rg11snorm', usage: GPUTextureUsage.COPY_DST, viewFormats: []});
let computePassEncoder117 = commandEncoder165.beginComputePass({});
try {
computePassEncoder61.setBindGroup(1, bindGroup42);
} catch {}
try {
computePassEncoder46.setBindGroup(2, bindGroup7, new Uint32Array(2387), 629, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture25,
  mipLevel: 0,
  origin: {x: 39, y: 4, z: 0},
  aspect: 'all',
}, new Uint8Array(25).fill(222), /* required buffer size: 25 */
{offset: 25, bytesPerRow: 302}, {width: 31, height: 283, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageBitmap0,
  origin: { x: 5, y: 8 },
  flipY: true,
}, {
  texture: texture45,
  mipLevel: 0,
  origin: {x: 29, y: 54, z: 1},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 37, height: 6, depthOrArrayLayers: 0});
} catch {}
let gpuCanvasContext11 = offscreenCanvas8.getContext('webgpu');
let commandEncoder166 = device0.createCommandEncoder();
let computePassEncoder118 = commandEncoder166.beginComputePass({});
try {
computePassEncoder29.setBindGroup(3, bindGroup61);
} catch {}
try {
renderPassEncoder21.setBindGroup(0, bindGroup51);
} catch {}
try {
renderPassEncoder43.setPipeline(pipeline2);
} catch {}
try {
device0.queue.writeBuffer(buffer77, 1356, new Float32Array(15002), 3979, 380);
} catch {}
let promise20 = device0.queue.onSubmittedWorkDone();
let texture173 = device0.createTexture({
  size: [2],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder86.setBindGroup(1, bindGroup8);
} catch {}
try {
buffer19.unmap();
} catch {}
let imageData24 = new ImageData(60, 36);
let bindGroup76 = device0.createBindGroup({layout: bindGroupLayout18, entries: [{binding: 188, resource: sampler45}]});
let buffer129 = device0.createBuffer({
  size: 16107,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE,
});
let commandEncoder167 = device0.createCommandEncoder({});
let texture174 = device0.createTexture({
  size: [96, 456, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder119 = commandEncoder167.beginComputePass({});
let renderBundle17 = renderBundleEncoder17.finish();
try {
computePassEncoder117.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup28);
} catch {}
try {
device0.queue.submit([]);
} catch {}
let imageData25 = new ImageData(20, 68);
let commandEncoder168 = device0.createCommandEncoder({});
let computePassEncoder120 = commandEncoder168.beginComputePass({});
try {
renderPassEncoder11.setBindGroup(3, bindGroup1);
} catch {}
try {
gpuCanvasContext10.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
  await promise20;
} catch {}
let buffer130 = device0.createBuffer({size: 20538, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder169 = device0.createCommandEncoder({});
let textureView147 = texture103.createView({arrayLayerCount: 1});
let texture175 = device0.createTexture({
  size: {width: 384},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView148 = texture54.createView({dimension: 'cube-array', baseArrayLayer: 1, arrayLayerCount: 6});
try {
computePassEncoder95.setBindGroup(0, bindGroup48, new Uint32Array(1455), 67, 0);
} catch {}
try {
renderPassEncoder56.setBindGroup(3, bindGroup30, new Uint32Array(188), 2, 0);
} catch {}
try {
renderPassEncoder43.setVertexBuffer(7, buffer94, 4_856, 722);
} catch {}
try {
renderPassEncoder22.insertDebugMarker('\u0be8');
} catch {}
let imageData26 = new ImageData(72, 52);
let commandEncoder170 = device0.createCommandEncoder({});
let renderPassEncoder69 = commandEncoder169.beginRenderPass({
  colorAttachments: [{view: textureView94, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet13,
  maxDrawCount: 179743895,
});
try {
computePassEncoder60.setBindGroup(3, bindGroup57, new Uint32Array(60), 17, 0);
} catch {}
try {
renderPassEncoder48.setIndexBuffer(buffer103, 'uint16', 1_010, 711);
} catch {}
try {
buffer13.unmap();
} catch {}
let pipeline4 = await device0.createRenderPipelineAsync({
  layout: pipelineLayout0,
  fragment: {
  module: shaderModule9,
  entryPoint: 'fragment8',
  targets: [{
  format: 'rgba16float',
  blend: {
    color: {operation: 'reverse-subtract', srcFactor: 'dst-alpha', dstFactor: 'one-minus-constant'},
    alpha: {operation: 'subtract', srcFactor: 'dst-alpha', dstFactor: 'src-alpha-saturated'},
  },
  writeMask: GPUColorWrite.ALL,
}],
},
  vertex: {
    module: shaderModule9,
    buffers: [
      {
        arrayStride: 436,
        stepMode: 'instance',
        attributes: [
          {format: 'float32', offset: 40, shaderLocation: 7},
          {format: 'sint16x2', offset: 112, shaderLocation: 15},
          {format: 'sint8x4', offset: 12, shaderLocation: 12},
          {format: 'snorm16x4', offset: 24, shaderLocation: 0},
          {format: 'sint16x4', offset: 72, shaderLocation: 4},
          {format: 'uint16x4', offset: 40, shaderLocation: 13},
        ],
      },
    ],
  },
  primitive: {frontFace: 'ccw', cullMode: 'back'},
});
let bindGroup77 = device0.createBindGroup({
  layout: bindGroupLayout9,
  entries: [{binding: 22, resource: {buffer: buffer74, offset: 0, size: 40}}],
});
let computePassEncoder121 = commandEncoder170.beginComputePass({});
try {
renderPassEncoder54.setBindGroup(1, bindGroup23);
} catch {}
try {
renderPassEncoder21.setPipeline(pipeline4);
} catch {}
try {
device0.queue.writeBuffer(buffer71, 60, new DataView(new ArrayBuffer(13501)), 1844, 28);
} catch {}
let bindGroup78 = device0.createBindGroup({
  label: '\u080d\u7e0a\u{1fc8f}\ue738\uc2c9\ubacd\u8c97',
  layout: bindGroupLayout8,
  entries: [{binding: 182, resource: textureView38}, {binding: 506, resource: textureView142}],
});
let texture176 = device0.createTexture({
  size: {width: 1, height: 1, depthOrArrayLayers: 16},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
});
let textureView149 = texture7.createView({});
try {
renderPassEncoder38.setIndexBuffer(buffer19, 'uint32', 1_092, 314);
} catch {}
let buffer131 = device0.createBuffer({
  size: 12923,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
try {
renderPassEncoder36.setBindGroup(2, bindGroup52);
} catch {}
try {
renderPassEncoder50.setIndexBuffer(buffer15, 'uint32', 372, 455);
} catch {}
let commandEncoder171 = device0.createCommandEncoder({});
let textureView150 = texture61.createView({dimension: '2d', baseArrayLayer: 1, arrayLayerCount: 1});
let computePassEncoder122 = commandEncoder171.beginComputePass({label: '\u010a\u6dfa\u0026\u2ccd\u040b\u{1fb66}\u0384\u{1f83b}\u0efd'});
try {
computePassEncoder75.setBindGroup(2, bindGroup17, new Uint32Array(1625), 32, 0);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(1, buffer47, 14_888);
} catch {}
try {
device0.queue.writeBuffer(buffer77, 2564, new Float32Array(20013), 155, 180);
} catch {}
try {
adapter0.label = '\u{1f879}\u2667\u{1f8e3}';
} catch {}
let bindGroup79 = device0.createBindGroup({layout: bindGroupLayout21, entries: [{binding: 504, resource: {buffer: buffer43, offset: 1024}}]});
try {
computePassEncoder35.setBindGroup(0, bindGroup5, new Uint32Array(324), 55, 0);
} catch {}
try {
computePassEncoder116.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder55.setBindGroup(3, bindGroup41, []);
} catch {}
try {
renderPassEncoder15.setBindGroup(3, bindGroup66, new Uint32Array(792), 19, 0);
} catch {}
try {
renderPassEncoder64.setBlendConstant({ r: 127.2, g: -931.6, b: 639.3, a: 600.8, });
} catch {}
try {
renderPassEncoder1.setScissorRect(0, 0, 0, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture165,
  mipLevel: 0,
  origin: {x: 0, y: 19, z: 0},
  aspect: 'all',
}, new Uint8Array(15_274).fill(72), /* required buffer size: 15_274 */
{offset: 555, bytesPerRow: 409}, {width: 101, height: 36, depthOrArrayLayers: 1});
} catch {}
try {
gpuCanvasContext3.unconfigure();
} catch {}
document.body.append(img0);
await gc();
try {
globalThis.someLabel = bindGroup30.label;
} catch {}
let commandEncoder172 = device0.createCommandEncoder({label: '\u{1f7cf}\u311f'});
let renderPassEncoder70 = commandEncoder172.beginRenderPass({
  colorAttachments: [{
  view: textureView97,
  clearValue: { r: 752.5, g: -41.17, b: -588.8, a: -793.0, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet2,
});
try {
renderPassEncoder59.setBindGroup(2, bindGroup38);
} catch {}
try {
renderPassEncoder2.setPipeline(pipeline2);
} catch {}
let videoFrame22 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'NV12',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'smpte240m', primaries: 'film', transfer: 'bt2020_12bit'} });
let textureView151 = texture11.createView({
  label: '\u7baf\u5e6b\u09ad\u{1fe9c}\u{1f767}\uabae',
  dimension: '2d-array',
  mipLevelCount: 1,
  baseArrayLayer: 0,
});
let externalTexture13 = device0.importExternalTexture({source: videoFrame17});
try {
computePassEncoder101.setBindGroup(0, bindGroup10);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder101); computePassEncoder101.dispatchWorkgroupsIndirect(buffer2, 2_380); };
} catch {}
try {
renderPassEncoder58.beginOcclusionQuery(21);
} catch {}
try {
renderPassEncoder58.endOcclusionQuery();
} catch {}
try {
renderPassEncoder28.setBlendConstant({ r: -476.4, g: 239.8, b: -180.0, a: 891.8, });
} catch {}
try {
renderPassEncoder63.setStencilReference(639);
} catch {}
let commandEncoder173 = device0.createCommandEncoder({});
let texture177 = device0.createTexture({
  size: {width: 256},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
try {
computePassEncoder101.end();
} catch {}
try {
computePassEncoder118.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder25.setBindGroup(3, bindGroup14, new Uint32Array(855), 90, 0);
} catch {}
try {
commandEncoder173.clearBuffer(buffer12, 3540, 560);
} catch {}
let imageData27 = new ImageData(32, 4);
let computePassEncoder123 = commandEncoder135.beginComputePass({});
let renderPassEncoder71 = commandEncoder173.beginRenderPass({colorAttachments: [{view: textureView126, loadOp: 'load', storeOp: 'store'}]});
try {
renderPassEncoder18.setBindGroup(0, bindGroup77);
} catch {}
try {
renderPassEncoder21.setIndexBuffer(buffer128, 'uint16', 10, 30);
} catch {}
try {
gpuCanvasContext8.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.writeBuffer(buffer23, 1684, new Int16Array(2180), 172, 888);
} catch {}
await gc();
let querySet14 = device0.createQuerySet({
  label: '\u8285\ue547\ucd1c\u08b9\u03a3\uc887\u1310\u{1fcfa}\ubcfc\ufcad\u0b9f',
  type: 'occlusion',
  count: 153,
});
let textureView152 = texture29.createView({format: 'rgb10a2uint', arrayLayerCount: 1});
let sampler119 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 14.44,
  lodMaxClamp: 28.51,
  maxAnisotropy: 18,
});
let externalTexture14 = device0.importExternalTexture({label: '\u1fcf\u7753\u01c6\u{1fec2}\u069f\ub1fa', source: videoFrame12});
try {
renderPassEncoder17.setBindGroup(1, bindGroup76, new Uint32Array(1853), 392, 0);
} catch {}
try {
gpuCanvasContext6.unconfigure();
} catch {}
document.body.prepend(img1);
let textureView153 = texture56.createView({format: 'rgb10a2uint', baseArrayLayer: 0});
let sampler120 = device0.createSampler({addressModeV: 'clamp-to-edge', addressModeW: 'mirror-repeat', magFilter: 'linear', lodMaxClamp: 83.20});
try {
renderPassEncoder71.setBindGroup(0, bindGroup6);
} catch {}
try {
computePassEncoder120.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder62.setVertexBuffer(4, buffer74);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 96, height: 456, depthOrArrayLayers: 1}
*/
{
  source: imageData3,
  origin: { x: 2, y: 9 },
  flipY: true,
}, {
  texture: texture48,
  mipLevel: 0,
  origin: {x: 0, y: 125, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 1, height: 3, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder122.setBindGroup(2, bindGroup1, new Uint32Array(1859), 209, 0);
} catch {}
try {
computePassEncoder121.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder36.executeBundles([renderBundle5, renderBundle15, renderBundle4, renderBundle15, renderBundle6, renderBundle6]);
} catch {}
try {
renderPassEncoder16.setViewport(20.359307739956233, 174.04471682945393, 7.333761454694714, 34.36327316920392, 0.014074874919239755, 0.6854433117806024);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(6, buffer105, 3_724, 5_723);
} catch {}
let promise21 = device0.queue.onSubmittedWorkDone();
let buffer132 = device0.createBuffer({size: 14384, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder174 = device0.createCommandEncoder();
let renderPassEncoder72 = commandEncoder174.beginRenderPass({
  colorAttachments: [{
  view: textureView97,
  clearValue: { r: 186.0, g: -834.2, b: 354.7, a: -983.5, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 21533851,
});
try {
computePassEncoder123.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder46.setBindGroup(2, bindGroup41);
} catch {}
try {
renderPassEncoder53.executeBundles([renderBundle9]);
} catch {}
try {
renderPassEncoder55.setIndexBuffer(buffer127, 'uint32', 1_344, 183);
} catch {}
try {
renderPassEncoder12.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder43.setVertexBuffer(3, buffer92);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture138,
  mipLevel: 0,
  origin: {x: 56, y: 45, z: 0},
  aspect: 'all',
}, new Uint8Array(9).fill(215), /* required buffer size: 9 */
{offset: 9, bytesPerRow: 340}, {width: 35, height: 71, depthOrArrayLayers: 0});
} catch {}
let bindGroup80 = device0.createBindGroup({layout: bindGroupLayout12, entries: [{binding: 76, resource: textureView142}]});
let buffer133 = device0.createBuffer({
  label: '\u0a8d\ue599\u{1f9b1}\u4a5e\u92f3',
  size: 4987,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let commandEncoder175 = device0.createCommandEncoder({label: '\u0919\u5227\u{1f918}\uf1f5\u63f9\u349e\u0304\u09e5\u23f3\uaadd'});
let textureView154 = texture169.createView({mipLevelCount: 1});
let computePassEncoder124 = commandEncoder175.beginComputePass({label: '\u0bd4\u43a7\uc909\u5794\u0c09\u85d3\u2e43\u696c\u{1f8a2}\ud471\u052f'});
try {
computePassEncoder74.setBindGroup(1, bindGroup37, new Uint32Array(525), 62, 0);
} catch {}
let shaderModule10 = device0.createShaderModule({
  code: `
enable f16;

requires packed_4x8_integer_dot_product;

requires packed_4x8_integer_dot_product;

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

var<workgroup> vw21: FragmentOutput6;

struct T0 {
  @align(1) @size(8) f0: array<u32>,
}

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

var<workgroup> vw17: f16;

@group(0) @binding(67) var tex1: texture_cube<f32>;

alias vec3b = vec3<bool>;

var<workgroup> vw23: mat4x2h;

var<workgroup> vw24: FragmentOutput6;

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(185) var tex2: texture_1d<f32>;

var<workgroup> vw18: atomic<i32>;

var<workgroup> vw20: array<atomic<u32>, 1>;

var<workgroup> vw22: atomic<u32>;

struct FragmentOutput6 {
  @builtin(sample_mask) f0: u32,
  @location(7) f1: vec2i,
  @location(0) f2: vec4f,
}

var<workgroup> vw19: mat4x3h;

@fragment
fn fragment9(@location(4) @interpolate(flat, center) a0: i32, @location(10) a1: f16) -> FragmentOutput6 {
  var out: FragmentOutput6;
  out.f0 += bitcast<u32>(textureLoad(tex2, i32(textureDimensions(tex2)), i32(unconst_i32(110)))[0]);
  var vf127: vec2u = textureDimensions(tex1, i32(unconst_i32(5)));
  out.f0 *= pack4x8snorm(vec4f(unconst_f32(0.1617), unconst_f32(0.1923), unconst_f32(0.00004), unconst_f32(0.1603)));
  out.f1 = vec2i(i32(textureNumLevels(tex1)));
  out.f0 &= u32(countLeadingZeros(vec2i(textureDimensions(tex1, i32(unconst_i32(17))))[0]));
  out.f0 <<= pack2x16unorm(bitcast<vec2f>(asinh(vec4h(f16(countLeadingZeros(i32(unconst_i32(262))))))));
  var vf128: vec4h = asinh(vec4h(unconst_f16(4243.3), unconst_f16(248.2), unconst_f16(343.8), unconst_f16(2478.7)));
  out.f2 = vec4f(f32(vf127[u32(unconst_u32(300))]));
  vf128 = vec4h(f16(vf127[0]));
  vf127 *= vec2u(textureNumLevels(tex2));
  var vf129: u32 = textureDimensions(tex2, 0i);
  discard;
  return out;
}

@compute @workgroup_size(1, 2, 1)
fn compute9() {
  let ptr142: ptr<workgroup, array<atomic<u32>, 1>> = &vw20;
  workgroupBarrier();
  let vf130: u32 = pack4x8unorm(vec4f(unconst_f32(0.00971), unconst_f32(-0.03147), unconst_f32(0.07633), unconst_f32(0.01966)));
  let ptr143: ptr<workgroup, u32> = &(*&vw24).f0;
  let ptr144: ptr<workgroup, mat4x2h> = &vw23;
  var vf131: u32 = atomicLoad(&(*&vw22));
  vf131 = u32(vw24.f1[u32(unconst_u32(88))]);
}`,
  sourceMap: {},
  hints: {},
});
let texture178 = device0.createTexture({
  label: '\u0317\u42e0',
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
try {
renderPassEncoder69.setBindGroup(0, bindGroup52, []);
} catch {}
try {
renderPassEncoder26.setIndexBuffer(buffer61, 'uint16', 1_546, 8_538);
} catch {}
try {
renderPassEncoder36.setVertexBuffer(4, buffer21, 0, 493);
} catch {}
let buffer134 = device0.createBuffer({size: 3507, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture179 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING,
});
let textureView155 = texture10.createView({label: '\u{1ff81}\u{1fac7}', dimension: '2d-array', mipLevelCount: 1});
try {
renderPassEncoder45.setBindGroup(0, bindGroup23, new Uint32Array(1297), 124, 0);
} catch {}
let texture180 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture181 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let texture182 = gpuCanvasContext8.getCurrentTexture();
let textureView156 = texture91.createView({dimension: '3d'});
let renderBundleEncoder18 = device0.createRenderBundleEncoder({label: '\ubdfd\u{1fbf6}\uaa3d\u{1f771}\u5591\u0e58\u{1fb60}\u308a', colorFormats: ['rgba16float']});
try {
computePassEncoder75.setBindGroup(3, bindGroup16);
} catch {}
try {
computePassEncoder120.setBindGroup(0, bindGroup10, new Uint32Array(3360), 403, 0);
} catch {}
try {
renderPassEncoder52.executeBundles([renderBundle12, renderBundle7, renderBundle8]);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer36, 'uint16', 4, 70);
} catch {}
try {
renderBundleEncoder18.setVertexBuffer(0, buffer110);
} catch {}
let imageData28 = new ImageData(60, 32);
let texture183 = device0.createTexture({
  size: {width: 1, height: 1, depthOrArrayLayers: 43},
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderBundle18 = renderBundleEncoder18.finish();
try {
computePassEncoder81.setBindGroup(3, bindGroup8);
} catch {}
try {
renderPassEncoder38.setBindGroup(1, bindGroup23);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(3, buffer66, 0);
} catch {}
await gc();
let bindGroup81 = device0.createBindGroup({
  layout: bindGroupLayout20,
  entries: [
    {binding: 150, resource: textureView117},
    {binding: 41, resource: externalTexture7},
    {binding: 189, resource: textureView8},
  ],
});
let pipelineLayout16 = device0.createPipelineLayout({label: '\u16b5\u0ba6\u0691\u{1f8c3}\u5288', bindGroupLayouts: []});
let commandEncoder176 = device0.createCommandEncoder();
let textureView157 = texture126.createView({
  label: '\u051d\u{1fed4}',
  dimension: 'cube-array',
  baseMipLevel: 0,
  baseArrayLayer: 8,
  arrayLayerCount: 6,
});
let computePassEncoder125 = commandEncoder176.beginComputePass({});
let renderBundleEncoder19 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint']});
let sampler121 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMaxClamp: 51.34,
});
try {
computePassEncoder13.setBindGroup(3, bindGroup17, []);
} catch {}
try {
computePassEncoder122.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder58.setBindGroup(3, bindGroup77, new Uint32Array(33), 0, 0);
} catch {}
try {
renderPassEncoder64.setIndexBuffer(buffer81, 'uint32', 576, 42);
} catch {}
try {
renderBundleEncoder19.setIndexBuffer(buffer127, 'uint16', 5_568, 265);
} catch {}
let bindGroup82 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [{binding: 41, resource: {buffer: buffer127, offset: 5120, size: 1511}}],
});
let commandEncoder177 = device0.createCommandEncoder({});
try {
computePassEncoder108.setBindGroup(1, bindGroup34);
} catch {}
try {
computePassEncoder90.setBindGroup(3, bindGroup74, new Uint32Array(740), 48, 0);
} catch {}
try {
renderPassEncoder46.setVertexBuffer(7, buffer67);
} catch {}
try {
renderBundleEncoder19.setBindGroup(0, bindGroup52, []);
} catch {}
try {
renderBundleEncoder19.setVertexBuffer(7, buffer110, 316);
} catch {}
try {
commandEncoder177.copyBufferToTexture({
  /* bytesInLastRow: 608 widthInBlocks: 76 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 728 */
  offset: 728,
  buffer: buffer16,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 0},
  aspect: 'all',
}, {width: 76, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder177.copyTextureToBuffer({
  texture: texture98,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 3},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 300 */
  offset: 300,
  bytesPerRow: 2048,
  buffer: buffer75,
}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup83 = device0.createBindGroup({
  layout: bindGroupLayout9,
  entries: [{binding: 22, resource: {buffer: buffer128, offset: 0, size: 44}}],
});
let computePassEncoder126 = commandEncoder177.beginComputePass({});
let sampler122 = device0.createSampler({addressModeV: 'clamp-to-edge', lodMinClamp: 86.09, lodMaxClamp: 92.10, compare: 'greater-equal'});
try {
computePassEncoder119.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder19.setBindGroup(3, bindGroup27);
} catch {}
try {
renderBundleEncoder19.setVertexBuffer(0, buffer94, 0, 1_297);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture118,
  mipLevel: 0,
  origin: {x: 6, y: 164, z: 14},
  aspect: 'all',
}, new Uint8Array(20_104_634).fill(179), /* required buffer size: 20_104_634 */
{offset: 2, bytesPerRow: 165, rowsPerImage: 210}, {width: 21, height: 47, depthOrArrayLayers: 581});
} catch {}
try {
  await promise21;
} catch {}
let buffer135 = device0.createBuffer({
  label: '\u6055\u{1fa87}\u0971\u723f\u0c0b\ub52c',
  size: 2447,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.VERTEX,
});
let sampler123 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 32.33,
  lodMaxClamp: 80.07,
  maxAnisotropy: 14,
});
try {
computePassEncoder124.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder14.setBindGroup(1, bindGroup72, new Uint32Array(109), 7, 0);
} catch {}
try {
renderPassEncoder70.setIndexBuffer(buffer0, 'uint32', 2_052, 732);
} catch {}
try {
renderBundleEncoder19.setIndexBuffer(buffer81, 'uint16', 2_588, 1_993);
} catch {}
let commandEncoder178 = device0.createCommandEncoder({});
let sampler124 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 92.23,
  lodMaxClamp: 94.64,
});
try {
computePassEncoder126.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder39.setBindGroup(0, bindGroup41, new Uint32Array(467), 27, 0);
} catch {}
try {
renderPassEncoder58.beginOcclusionQuery(10);
} catch {}
try {
renderPassEncoder15.executeBundles([renderBundle18, renderBundle17]);
} catch {}
try {
renderPassEncoder72.setVertexBuffer(0, buffer35);
} catch {}
try {
renderBundleEncoder19.setBindGroup(0, bindGroup18, new Uint32Array(661), 285, 0);
} catch {}
try {
renderBundleEncoder19.setIndexBuffer(buffer0, 'uint32', 13_336, 169);
} catch {}
try {
commandEncoder178.copyBufferToBuffer(buffer40, 2128, buffer49, 24, 32);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture16,
  mipLevel: 0,
  origin: {x: 8, y: 4, z: 0},
  aspect: 'all',
}, new Uint8Array(24).fill(10), /* required buffer size: 24 */
{offset: 24, bytesPerRow: 64}, {width: 12, height: 28, depthOrArrayLayers: 0});
} catch {}
let buffer136 = device0.createBuffer({size: 16476, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.VERTEX});
let renderPassEncoder73 = commandEncoder178.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -738.0, g: 423.5, b: -22.17, a: -783.8, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let renderBundle19 = renderBundleEncoder19.finish();
let sampler125 = device0.createSampler({addressModeV: 'clamp-to-edge', mipmapFilter: 'nearest', lodMinClamp: 92.02, lodMaxClamp: 97.74});
try {
renderPassEncoder46.setBindGroup(3, bindGroup16, new Uint32Array(1458), 295, 0);
} catch {}
try {
renderPassEncoder63.setViewport(56.29127445274575, 1378.2698665710686, 12.199525862497579, 97.21038063715551, 0.20993216526630631, 0.490886044325679);
} catch {}
try {
buffer69.unmap();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData8,
  origin: { x: 4, y: 0 },
  flipY: false,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder179 = device0.createCommandEncoder({});
let texture184 = device0.createTexture({size: [256, 256, 17], sampleCount: 1, format: 'etc2-rgb8unorm', usage: GPUTextureUsage.COPY_DST});
let computePassEncoder127 = commandEncoder179.beginComputePass({});
try {
computePassEncoder2.setBindGroup(0, bindGroup75);
} catch {}
try {
computePassEncoder4.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder125.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder58.endOcclusionQuery();
} catch {}
try {
renderPassEncoder40.setIndexBuffer(buffer61, 'uint16', 100, 5_611);
} catch {}
let commandEncoder180 = device0.createCommandEncoder();
let textureView158 = texture139.createView({});
try {
computePassEncoder105.setBindGroup(1, bindGroup45);
} catch {}
try {
renderPassEncoder12.executeBundles([renderBundle1, renderBundle11, renderBundle14, renderBundle8]);
} catch {}
try {
commandEncoder180.resolveQuerySet(querySet4, 72, 267, buffer129, 0);
} catch {}
let promise22 = device0.queue.onSubmittedWorkDone();
document.body.append(canvas0);
try {
globalThis.someLabel = externalTexture10.label;
} catch {}
let shaderModule11 = device0.createShaderModule({
  label: '\u{1fee5}\u80f0\ud43f\u2152\u08fb',
  code: `
enable f16;

diagnostic(info, xyz);

requires readonly_and_readwrite_storage_textures;

fn unconst_i32(v: i32) -> i32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

var<workgroup> vw30: atomic<i32>;

@group(1) @binding(13) var<storage, read_write> buffer138: array<array<f16, 20>>;

struct VertexOutput9 {
  @builtin(position) f50: vec4f,
}

var<workgroup> vw29: array<atomic<i32>, 28>;

var<workgroup> vw27: array<array<atomic<u32>, 24>, 1>;

struct FragmentOutput8 {
  @location(0) @interpolate(flat, centroid) f0: vec4u,
}

var<workgroup> vw25: VertexOutput9;

struct T0 {
  @size(16) f0: array<u32>,
}

var<workgroup> vw31: array<atomic<i32>, 2>;

var<private> vp17 = modf(vec2f());

@group(0) @binding(251) var<uniform> buffer137: mat4x2h;

var<workgroup> vw26: mat3x3f;

struct FragmentOutput7 {
  @location(0) f0: vec4u,
}

@group(1) @binding(138) var tex3: texture_2d<i32>;

fn unconst_u32(v: u32) -> u32 { return v; }

fn fn0() -> VertexOutput9 {
  var out: VertexOutput9;
  let vf132: vec2f = log(vp17.whole);
  let ptr145: ptr<private, vec2f> = &vp17.fract;
  var vf133: bool = any(bool(unconst_bool(true)));
  var vf134: vec2f = normalize(vec2f(unconst_f32(0.1419), unconst_f32(0.2555)));
  out.f50 = vec4f(firstTrailingBit(vec3i(unconst_i32(166), unconst_i32(307), unconst_i32(116))).ggbb);
  let ptr146 = &vp17;
  var vf135: vec2f = log(vec2f(unconst_f32(0.01308), unconst_f32(0.3192)));
  let vf136: bool = any(bool(unconst_bool(false)));
  let vf137: vec2f = log(vec2f(unconst_f32(-0.05653), unconst_f32(-0.1417)));
  vp17.whole = vf132;
  vf133 = bool((*ptr146).fract.g);
  let vf138: vec3f = faceForward(vec3f(unconst_f32(-0.1130), unconst_f32(0.1187), unconst_f32(0.5128)), vec3f(unconst_f32(-0.8014), unconst_f32(0.1163), unconst_f32(0.07258)), vec3f(unconst_f32(0.1855), unconst_f32(0.1419), unconst_f32(0.07055)));
  vf133 = bool(vp17.fract[0]);
  vf134 *= bitcast<vec2f>(log2(vec4h(unconst_f16(-46145.5), unconst_f16(8444.3), unconst_f16(14959.7), unconst_f16(-4170.6))));
  vf135 = vec2f(round(f32(unconst_f32(0.06574))));
  var vf139: f32 = vf138[u32(vf134[1])];
  vp17 = modf(vec2f(f32(any(bool(unpack4xU8(bitcast<u32>(sinh(bitcast<f32>(firstTrailingBit(bitcast<vec3i>(unpack4xU8(u32(unconst_u32(76))).raa))[2])))).x)))));
  out = VertexOutput9(vec4f(countLeadingZeros(vec3i(unconst_i32(18), unconst_i32(-37), unconst_i32(103))).gbgg));
  vf139 = vf139;
  var vf140: f32 = vf138[0];
  let ptr147 = &vp17;
  let vf141: vec4u = unpack4xU8(vec3u(countLeadingZeros(vec3i(bitcast<i32>(vf137[pack4xU8Clamp(vec4u(transpose(mat4x4h(atan2(vec4h(unconst_f16(24406.5), unconst_f16(3180.0), unconst_f16(22278.3), unconst_f16(4549.8)), vec4h(unconst_f16(38357.9), unconst_f16(3985.6), unconst_f16(19139.5), unconst_f16(2481.6))), atan2(vec4h(unconst_f16(24406.5), unconst_f16(3180.0), unconst_f16(22278.3), unconst_f16(4549.8)), vec4h(unconst_f16(38357.9), unconst_f16(3985.6), unconst_f16(19139.5), unconst_f16(2481.6))), atan2(vec4h(unconst_f16(24406.5), unconst_f16(3180.0), unconst_f16(22278.3), unconst_f16(4549.8)), vec4h(unconst_f16(38357.9), unconst_f16(3985.6), unconst_f16(19139.5), unconst_f16(2481.6))), atan2(vec4h(unconst_f16(24406.5), unconst_f16(3180.0), unconst_f16(22278.3), unconst_f16(4549.8)), vec4h(unconst_f16(38357.9), unconst_f16(3985.6), unconst_f16(19139.5), unconst_f16(2481.6)))))[3]))]))))[2]);
  return out;
}

var<workgroup> vw28: atomic<u32>;

fn unconst_f32(v: f32) -> f32 { return v; }

@vertex
fn vertex11(@location(8) a0: vec2h, @location(12) @interpolate(perspective) a1: vec2f, @location(14) @interpolate(flat, sample) a2: i32) -> VertexOutput9 {
  var out: VertexOutput9;
  vp17.fract *= log2(unpack4x8unorm(pack2x16snorm(vp17.whole)).yz);
  var vf142 = fn0();
  var vf143 = fn0();
  fn0();
  let vf144: u32 = textureNumLevels(tex3);
  var vf145: vec4h = log2(vec4h(vf143.f50));
  fn0();
  fn0();
  var vf146 = fn0();
  out.f50 += vec4f(f32(length(vec3h(f16(a1[u32(unconst_u32(102))])))));
  let ptr148: ptr<function, vec4f> = &vf143.f50;
  out.f50 -= unpack4x8unorm(u32(unconst_u32(6)));
  vf142 = VertexOutput9(vec4f((*ptr148)[1]));
  return out;
}

@fragment
fn fragment10(@location(9) @interpolate(linear, centroid) a0: vec2h, @location(8) a1: f32, @location(11) a2: vec2u) -> FragmentOutput7 {
  var out: FragmentOutput7;
  var vf147: u32 = a2[u32(unconst_u32(200))];
  let vf148: f32 = determinant(mat3x3f(unconst_f32(1.000), unconst_f32(0.2627), unconst_f32(0.03468), unconst_f32(0.2650), unconst_f32(0.03950), unconst_f32(-0.09101), unconst_f32(0.2444), unconst_f32(0.00002), unconst_f32(0.2171)));
  vf147 |= bitcast<u32>(mix(vec4f(clamp(vec2u(u32(buffer138[arrayLength(&buffer138)][textureDimensions(tex3, i32(textureDimensions(tex3, vec2i(vp17.fract)[1])[1])).y])), vec2u(unconst_u32(65), unconst_u32(126)), vec2u(round(vec3h(unconst_f16(50093.4), unconst_f16(27844.3), unconst_f16(-5810.2))).bg)).yyxx), unpack4x8unorm(pack2x16snorm(bitcast<vec2f>(textureLoad(tex3, vec2i(unconst_i32(62), unconst_i32(96)), i32((*&buffer138)[u32(buffer138[arrayLength(&buffer138)][u32(unconst_u32(144))])][19])).yy))), f32(unconst_f32(0.01438))).b);
  var vf149: u32 = pack4xU8(vec4u(unconst_u32(90), unconst_u32(442), unconst_u32(264), unconst_u32(139)));
  fn0();
  let ptr149: ptr<private, vec2f> = &vp17.fract;
  out.f0 <<= unpack4xU8(vf147);
  vp17 = modf(vec2f(f32((*&buffer138)[arrayLength(&(*&buffer138))][u32(unconst_u32(478))])));
  vp17.fract = (*ptr149);
  var vf150 = fn0();
  let vf151: vec4h = radians(vec4h(unconst_f16(1321.3), unconst_f16(18318.3), unconst_f16(2747.4), unconst_f16(16438.8)));
  vf150.f50 = unpack4x8unorm(vf147);
  out = FragmentOutput7(unpack4xU8(dot4U8Packed(u32(unconst_u32(20)), u32(unconst_u32(88)))));
  fn0();
  fn0();
  let vf152: f32 = (*ptr149)[0];
  fn0();
  var vf153: u32 = textureNumLevels(tex3);
  fn0();
  out = FragmentOutput7(vec4u(firstLeadingBit(vec2i(i32(vf151[u32(unconst_u32(7))]))).rrrg));
  var vf154: vec2u = textureDimensions(tex3, i32(unconst_i32(216)));
  vf147 ^= textureDimensions(tex3).y;
  var vf155: vec4f = mix(vec4f(f32(buffer138[arrayLength(&buffer138)][u32(unconst_u32(195))])), vf150.f50, a1);
  fn0();
  var vf156 = fn0();
  return out;
}

@fragment
fn fragment11() -> FragmentOutput8 {
  var out: FragmentOutput8;
  fn0();
  vp17 = modf(vec2f(distance(vec2f(unconst_f32(0.4459), unconst_f32(-0.03126)), vec2f(unconst_f32(0.2297), unconst_f32(0.2245)))));
  fn0();
  vp17.whole *= quantizeToF16(vec2f(unconst_f32(0.3660), unconst_f32(0.03942)));
  buffer138[bitcast<u32>(length(vec2f(f32(buffer138[arrayLength(&buffer138)][19]))))][u32(cross(vec3h(unconst_f16(-2614.9), unconst_f16(16043.7), unconst_f16(6527.3)), vec3h(unconst_f16(3933.2), unconst_f16(8741.5), unconst_f16(6453.9))).x)] += (*&buffer138)[arrayLength(&(*&buffer138))][19];
  let ptr150: ptr<storage, array<array<f16, 20>>, read_write> = &buffer138;
  out = FragmentOutput8(vec4u(quantizeToF16(vec2f(unconst_f32(0.2242), unconst_f32(0.6745))).yxyx));
  return out;
}

@compute @workgroup_size(2, 1, 1)
fn compute10() {
  var vf157: i32 = atomicExchange(&vw31[1], atomicExchange(&vw30, i32(unconst_i32(99))));
  fn0();
}`,
  sourceMap: {},
  hints: {},
});
let commandEncoder181 = device0.createCommandEncoder({});
let commandBuffer1 = commandEncoder181.finish();
let computePassEncoder128 = commandEncoder180.beginComputePass({});
try {
computePassEncoder74.setBindGroup(1, bindGroup64);
} catch {}
try {
computePassEncoder127.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder23.setBindGroup(2, bindGroup26, new Uint32Array(2573), 221, 0);
} catch {}
try {
renderPassEncoder69.setVertexBuffer(0, undefined, 58_676_282, 470_380_226);
} catch {}
try {
buffer75.unmap();
} catch {}
await gc();
let offscreenCanvas9 = new OffscreenCanvas(346, 682);
let pipelineLayout17 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer139 = device0.createBuffer({size: 4645, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
try {
{ clearResourceUsages(device0, computePassEncoder120); computePassEncoder120.dispatchWorkgroups(1, 1, 1); };
} catch {}
try {
renderPassEncoder29.setBindGroup(2, bindGroup12);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer61, 'uint32', 3_552, 6_857);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture168,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(51).fill(7), /* required buffer size: 51 */
{offset: 51}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let canvas3 = document.createElement('canvas');
let bindGroup84 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 67, resource: textureView20}, {binding: 185, resource: textureView102}],
});
let commandEncoder182 = device0.createCommandEncoder({});
let querySet15 = device0.createQuerySet({type: 'occlusion', count: 839});
let texture185 = device0.createTexture({
  label: '\u0fa3\u0b80\u4cc8\ua017\u0db5\u5edd\ub6df\u067e',
  size: [4, 1, 162],
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder129 = commandEncoder182.beginComputePass({});
try {
computePassEncoder3.setBindGroup(2, bindGroup74, new Uint32Array(1899), 95, 0);
} catch {}
try {
computePassEncoder129.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder10.setPipeline(pipeline2);
} catch {}
let gpuCanvasContext12 = canvas3.getContext('webgpu');
let sampler126 = device0.createSampler({addressModeU: 'repeat', magFilter: 'nearest', minFilter: 'nearest', mipmapFilter: 'nearest'});
try {
renderPassEncoder16.setBlendConstant({ r: 995.6, g: -972.3, b: -685.6, a: 249.1, });
} catch {}
try {
renderPassEncoder29.setViewport(69.11881924522251, 117.2754665474569, 22.265510358867907, 26.230242693847867, 0.5868132564931969, 0.6977604951671604);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer104, 'uint16', 166, 42);
} catch {}
try {
renderPassEncoder43.setPipeline(pipeline4);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
let commandEncoder183 = device0.createCommandEncoder();
let texture186 = device0.createTexture({
  size: {width: 2},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder130 = commandEncoder183.beginComputePass({});
try {
computePassEncoder120.end();
} catch {}
try {
renderPassEncoder0.setBindGroup(3, bindGroup26);
} catch {}
try {
renderPassEncoder70.executeBundles([renderBundle16, renderBundle19]);
} catch {}
try {
commandEncoder168.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1160 */
  offset: 1160,
  bytesPerRow: 22784,
  rowsPerImage: 1737,
  buffer: buffer75,
}, {
  texture: texture25,
  mipLevel: 0,
  origin: {x: 2, y: 71, z: 0},
  aspect: 'all',
}, {width: 2, height: 213, depthOrArrayLayers: 0});
} catch {}
let sampler127 = device0.createSampler({addressModeU: 'mirror-repeat', addressModeW: 'clamp-to-edge', lodMinClamp: 66.79, lodMaxClamp: 80.22});
try {
computePassEncoder130.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder50.setIndexBuffer(buffer112, 'uint32', 3_516, 1_477);
} catch {}
try {
buffer112.unmap();
} catch {}
document.body.append(canvas2);
let videoFrame23 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'NV12',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'smpte170m', primaries: 'bt2020', transfer: 'bt2020_12bit'} });
let bindGroup85 = device0.createBindGroup({
  layout: bindGroupLayout19,
  entries: [{binding: 721, resource: {buffer: buffer44, offset: 24576, size: 860}}],
});
let commandEncoder184 = device0.createCommandEncoder({label: '\u{1f76b}\ufb1d\u5a97\u{1f923}'});
let computePassEncoder131 = commandEncoder168.beginComputePass({label: '\ue29b\u{1f681}\u25a0\u{1f720}\u{1f742}\u0c47\u{1ff8b}\u59d3\udb73\u{1f76e}\u90eb'});
let renderPassEncoder74 = commandEncoder184.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: 112.9, g: -719.7, b: 44.23, a: -916.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder35.setBindGroup(0, bindGroup41);
} catch {}
try {
renderPassEncoder42.setBindGroup(2, bindGroup68, new Uint32Array(1908), 909, 0);
} catch {}
try {
renderPassEncoder7.setViewport(1.1162753240026393, 0.5556506232304441, 0.7430828644562543, 0.3551843236843369, 0.7638252104278264, 0.8142943697777286);
} catch {}
try {
renderPassEncoder45.setIndexBuffer(buffer60, 'uint32', 128, 5);
} catch {}
try {
device0.queue.writeBuffer(buffer62, 108, new DataView(new ArrayBuffer(19247)), 587, 2716);
} catch {}
let imageData29 = new ImageData(8, 96);
let bindGroup86 = device0.createBindGroup({
  layout: bindGroupLayout8,
  entries: [{binding: 182, resource: textureView23}, {binding: 506, resource: textureView55}],
});
try {
computePassEncoder128.setPipeline(pipeline0);
} catch {}
try {
buffer116.unmap();
} catch {}
let imageData30 = new ImageData(8, 12);
try {
adapter0.label = '\uf887\u{1ff24}\u{1fc61}\u0170\u390b\uf78e\ub3e8';
} catch {}
let bindGroup87 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [
    {binding: 119, resource: {buffer: buffer52, offset: 0, size: 260}},
    {binding: 78, resource: externalTexture4},
    {binding: 204, resource: {buffer: buffer37, offset: 768}},
  ],
});
let commandEncoder185 = device0.createCommandEncoder();
let computePassEncoder132 = commandEncoder185.beginComputePass({label: '\u2bf4\u2358\u0706\u20ea'});
try {
computePassEncoder54.setBindGroup(1, bindGroup60);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 4, height: 1, depthOrArrayLayers: 3}
*/
{
  source: videoFrame14,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture112,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext10.unconfigure();
} catch {}
let pipelineLayout18 = device0.createPipelineLayout({label: '\uc9b1\uace8\u39f0', bindGroupLayouts: []});
try {
renderPassEncoder71.setBindGroup(3, bindGroup47);
} catch {}
try {
renderPassEncoder18.setBindGroup(1, bindGroup38, new Uint32Array(419), 41, 0);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline3);
} catch {}
let imageData31 = new ImageData(8, 36);
let commandEncoder186 = device0.createCommandEncoder({});
let computePassEncoder133 = commandEncoder186.beginComputePass({});
try {
computePassEncoder133.setBindGroup(1, bindGroup16);
} catch {}
try {
computePassEncoder65.setBindGroup(2, bindGroup17, new Uint32Array(1112), 103, 0);
} catch {}
try {
renderPassEncoder66.setBindGroup(2, bindGroup61, new Uint32Array(2818), 253, 0);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline2);
} catch {}
try {
device0.queue.submit([commandBuffer1]);
} catch {}
document.body.prepend(canvas3);
let textureView159 = texture150.createView({});
let sampler128 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 34.77,
  lodMaxClamp: 96.00,
  maxAnisotropy: 19,
});
try {
computePassEncoder111.setBindGroup(3, bindGroup37, new Uint32Array(5550), 431, 0);
} catch {}
try {
computePassEncoder132.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder18.setBindGroup(2, bindGroup61, new Uint32Array(850), 72, 0);
} catch {}
try {
renderPassEncoder62.setScissorRect(10, 25, 2, 109);
} catch {}
try {
renderPassEncoder39.setIndexBuffer(buffer40, 'uint32', 604, 293);
} catch {}
let sampler129 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 42.07,
  maxAnisotropy: 5,
});
try {
computePassEncoder14.setBindGroup(3, bindGroup62);
} catch {}
try {
computePassEncoder133.setPipeline(pipeline1);
} catch {}
let commandEncoder187 = device0.createCommandEncoder({label: '\u{1fc4a}\u{1f835}\u5e64\u28a9\u{1fe4b}\u05e2\u1975\u077a'});
let computePassEncoder134 = commandEncoder187.beginComputePass({});
try {
computePassEncoder93.setBindGroup(3, bindGroup36, new Uint32Array(492), 4, 0);
} catch {}
try {
renderPassEncoder38.setIndexBuffer(buffer113, 'uint16', 1_816, 2_136);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture91,
  mipLevel: 0,
  origin: {x: 9, y: 47, z: 2},
  aspect: 'all',
}, new Uint8Array(98).fill(163), /* required buffer size: 98 */
{offset: 98, bytesPerRow: 69, rowsPerImage: 93}, {width: 0, height: 46, depthOrArrayLayers: 0});
} catch {}
let texture187 = device0.createTexture({
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  mipLevelCount: 3,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
try {
renderPassEncoder40.setIndexBuffer(buffer37, 'uint32', 704, 413);
} catch {}
let bindGroup88 = device0.createBindGroup({
  label: '\ua578\u8329\u0e44\u{1f6c6}\u012f\u{1f842}\u01df',
  layout: bindGroupLayout13,
  entries: [{binding: 457, resource: textureView146}, {binding: 135, resource: textureView68}],
});
let commandEncoder188 = device0.createCommandEncoder();
let texture188 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 20},
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING,
});
let renderPassEncoder75 = commandEncoder188.beginRenderPass({
  colorAttachments: [{
  view: textureView139,
  clearValue: { r: -209.9, g: 116.0, b: 461.7, a: -648.4, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet0,
});
try {
computePassEncoder14.setBindGroup(0, bindGroup0, new Uint32Array(4190), 207, 0);
} catch {}
try {
computePassEncoder134.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder45.setBlendConstant({ r: 560.6, g: 87.31, b: 377.0, a: 182.3, });
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 2, height: 1, depthOrArrayLayers: 2}
*/
{
  source: videoFrame20,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture27,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await promise22;
} catch {}
let imageData32 = new ImageData(32, 4);
let buffer140 = device0.createBuffer({
  label: '\uc087\u24d4\u8682\u0ace\u1584\u03cf\ucf36',
  size: 3695,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
  mappedAtCreation: false,
});
let commandEncoder189 = device0.createCommandEncoder({});
let externalTexture15 = device0.importExternalTexture({source: videoFrame17});
try {
computePassEncoder131.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder25.setBindGroup(1, bindGroup0);
} catch {}
try {
renderPassEncoder18.setBindGroup(1, bindGroup64, new Uint32Array(3787), 963, 0);
} catch {}
try {
renderPassEncoder47.setVertexBuffer(4, buffer92, 1_100, 46);
} catch {}
try {
commandEncoder189.copyBufferToBuffer(buffer56, 272, buffer84, 312, 132);
} catch {}
let commandEncoder190 = device0.createCommandEncoder();
let textureView160 = texture172.createView({baseArrayLayer: 1, arrayLayerCount: 1});
let computePassEncoder135 = commandEncoder190.beginComputePass();
let renderPassEncoder76 = commandEncoder189.beginRenderPass({
  colorAttachments: [{view: textureView94, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet12,
  maxDrawCount: 134926900,
});
try {
computePassEncoder90.setBindGroup(1, bindGroup78);
} catch {}
try {
computePassEncoder125.setBindGroup(1, bindGroup44, new Uint32Array(2826), 106, 0);
} catch {}
try {
renderPassEncoder20.setBindGroup(2, bindGroup38);
} catch {}
try {
renderPassEncoder22.executeBundles([renderBundle17, renderBundle10, renderBundle0]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture100,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(2).fill(26), /* required buffer size: 2 */
{offset: 2}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 1, depthOrArrayLayers: 62}
*/
{
  source: imageData3,
  origin: { x: 11, y: 2 },
  flipY: true,
}, {
  texture: texture28,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 17},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer141 = device0.createBuffer({
  label: '\u5feb\u7037\ub328\u{1fd5b}\ucb97\u280e\u5a0e\u8048',
  size: 1719,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let texture189 = device0.createTexture({
  label: '\u{1f64c}\u7270\ueeca\u5b89\u0455\ub531\u386c\ue866',
  size: [8],
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
try {
renderPassEncoder60.setPipeline(pipeline3);
} catch {}
try {
if (!arrayBuffer8.detached) { new Uint8Array(arrayBuffer8).fill(0x55); };
} catch {}
document.body.prepend(img3);
let bindGroup89 = device0.createBindGroup({layout: bindGroupLayout7, entries: [{binding: 218, resource: textureView25}]});
let buffer142 = device0.createBuffer({size: 10865, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE});
let renderBundleEncoder20 = device0.createRenderBundleEncoder({colorFormats: ['rgba16float'], depthReadOnly: false, stencilReadOnly: true});
let sampler130 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 35.33,
  lodMaxClamp: 73.04,
});
try {
computePassEncoder130.setBindGroup(0, bindGroup68, new Uint32Array(3847), 150, 0);
} catch {}
try {
computePassEncoder52.end();
} catch {}
try {
computePassEncoder135.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder29.setBindGroup(0, bindGroup41);
} catch {}
try {
renderPassEncoder24.beginOcclusionQuery(112);
} catch {}
try {
renderPassEncoder36.setIndexBuffer(buffer117, 'uint32', 1_184, 473);
} catch {}
try {
renderBundleEncoder20.setIndexBuffer(buffer104, 'uint16', 20, 2_056);
} catch {}
try {
renderBundleEncoder20.setPipeline(pipeline4);
} catch {}
try {
commandEncoder72.copyBufferToTexture({
  /* bytesInLastRow: 120 widthInBlocks: 30 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1200 */
  offset: 1200,
  bytesPerRow: 2048,
  buffer: buffer120,
}, {
  texture: texture138,
  mipLevel: 0,
  origin: {x: 23, y: 179, z: 0},
  aspect: 'all',
}, {width: 30, height: 21, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer13.detached) { new Uint8Array(arrayBuffer13).fill(0x55); };
} catch {}
let img4 = await imageWithData(20, 2, '#10101010', '#20202020');
let commandEncoder191 = device0.createCommandEncoder({});
let texture190 = device0.createTexture({
  size: [256, 256, 17],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let textureView161 = texture133.createView({aspect: 'all', baseMipLevel: 1});
let renderPassEncoder77 = commandEncoder191.beginRenderPass({
  colorAttachments: [{
  view: textureView122,
  depthSlice: 149,
  clearValue: { r: 146.4, g: 215.9, b: 48.50, a: 252.2, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundle20 = renderBundleEncoder20.finish({});
try {
computePassEncoder74.setBindGroup(1, bindGroup25);
} catch {}
try {
computePassEncoder60.setBindGroup(1, bindGroup18, new Uint32Array(1940), 159, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder130); computePassEncoder130.dispatchWorkgroups(4, 1, 1); };
} catch {}
try {
commandEncoder72.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 216 */
  offset: 216,
  bytesPerRow: 41216,
  buffer: buffer124,
}, {
  texture: texture168,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture46,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(128).fill(224), /* required buffer size: 128 */
{offset: 128}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: videoFrame17,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture178,
  mipLevel: 0,
  origin: {x: 0, y: 100, z: 1},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer13.detached) { new Uint8Array(arrayBuffer13).fill(0x55); };
} catch {}
let textureView162 = texture180.createView({});
let computePassEncoder136 = commandEncoder72.beginComputePass();
let sampler131 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 19.87,
  lodMaxClamp: 44.39,
  maxAnisotropy: 15,
});
try {
computePassEncoder8.setBindGroup(3, bindGroup22);
} catch {}
try {
computePassEncoder33.setBindGroup(0, bindGroup71, new Uint32Array(162), 46, 0);
} catch {}
try {
computePassEncoder136.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer73, 'uint32', 692, 7);
} catch {}
try {
renderPassEncoder63.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(7, buffer40, 2_552, 390);
} catch {}
let arrayBuffer15 = buffer72.getMappedRange(184, 0);
let bindGroup90 = device0.createBindGroup({
  layout: bindGroupLayout17,
  entries: [
    {binding: 211, resource: textureView100},
    {binding: 231, resource: externalTexture13},
    {binding: 441, resource: textureView88},
    {binding: 82, resource: sampler108},
    {binding: 25, resource: textureView107},
  ],
});
let sampler132 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 98.42,
  lodMaxClamp: 99.20,
  compare: 'not-equal',
  maxAnisotropy: 9,
});
try {
computePassEncoder94.setBindGroup(1, bindGroup63);
} catch {}
try {
renderPassEncoder10.setBindGroup(3, bindGroup1, []);
} catch {}
try {
renderPassEncoder2.setBindGroup(0, bindGroup80, new Uint32Array(659), 46, 0);
} catch {}
try {
renderPassEncoder70.setIndexBuffer(buffer37, 'uint32', 3_236, 4_246);
} catch {}
try {
buffer47.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture169,
  mipLevel: 1,
  origin: {x: 54, y: 120, z: 0},
  aspect: 'all',
}, new Uint8Array(76).fill(77), /* required buffer size: 76 */
{offset: 76, bytesPerRow: 100, rowsPerImage: 13}, {width: 3, height: 12, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext8.unconfigure();
} catch {}
let commandEncoder192 = device0.createCommandEncoder();
let texture191 = device0.createTexture({
  size: [2, 1, 37],
  mipLevelCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView163 = texture111.createView({dimension: '2d', baseArrayLayer: 2});
let computePassEncoder137 = commandEncoder192.beginComputePass({});
let sampler133 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 57.66,
  lodMaxClamp: 88.84,
  maxAnisotropy: 1,
});
try {
renderPassEncoder24.endOcclusionQuery();
} catch {}
try {
renderPassEncoder76.setIndexBuffer(buffer70, 'uint32', 5_240, 908);
} catch {}
let commandEncoder193 = device0.createCommandEncoder({});
let textureView164 = texture72.createView({});
let computePassEncoder138 = commandEncoder193.beginComputePass({});
try {
computePassEncoder58.setBindGroup(1, bindGroup18);
} catch {}
try {
computePassEncoder138.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder56.setPipeline(pipeline4);
} catch {}
try {
computePassEncoder89.pushDebugGroup('\u335c');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas4,
  origin: { x: 37, y: 26 },
  flipY: false,
}, {
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let gpuCanvasContext13 = offscreenCanvas9.getContext('webgpu');
let buffer143 = device0.createBuffer({
  label: '\u03ac\u44dd\u5e85\u3a68\uc676\uc535\u5d40',
  size: 5283,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let commandEncoder194 = device0.createCommandEncoder({});
let computePassEncoder139 = commandEncoder194.beginComputePass({});
try {
computePassEncoder130.end();
} catch {}
try {
computePassEncoder53.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder139.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder58.setViewport(53.36449314504411, 1244.2312371757957, 70.87811308792702, 212.85544650828464, 0.8361850317554199, 0.9923883898931604);
} catch {}
try {
renderPassEncoder13.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder38.setVertexBuffer(1, buffer102, 1_032);
} catch {}
let buffer144 = device0.createBuffer({size: 5227, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE});
let commandEncoder195 = device0.createCommandEncoder();
let commandBuffer2 = commandEncoder183.finish({label: '\u{1f61f}\uac9d\uf38e\udb15'});
let computePassEncoder140 = commandEncoder195.beginComputePass({});
try {
computePassEncoder140.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder72.setBindGroup(1, bindGroup22, new Uint32Array(971), 32, 0);
} catch {}
try {
device0.queue.writeBuffer(buffer99, 188, new Int16Array(4775), 595, 32);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData26,
  origin: { x: 13, y: 16 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 50, y: 36, z: 3},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 16, height: 7, depthOrArrayLayers: 0});
} catch {}
let commandEncoder196 = device0.createCommandEncoder({label: '\u{1f8e6}\u{1f732}\u0dde'});
let texture192 = device0.createTexture({
  label: '\u32fd\u681c\u0d03\uae12\u2af1\uf6c4\u5d71\u9548\u{1fb3b}',
  size: [96, 456, 1],
  format: 'etc2-rgb8a1unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderPassEncoder78 = commandEncoder196.beginRenderPass({
  colorAttachments: [{
  view: textureView77,
  clearValue: { r: -699.5, g: 455.4, b: 77.49, a: 532.0, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder137.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder9.setBindGroup(0, bindGroup44);
} catch {}
try {
renderPassEncoder37.setVertexBuffer(3, undefined, 0, 849_796_169);
} catch {}
try {
buffer98.unmap();
} catch {}
await gc();
try {
globalThis.someLabel = externalTexture13.label;
} catch {}
let commandEncoder197 = device0.createCommandEncoder({});
let computePassEncoder141 = commandEncoder197.beginComputePass({});
try {
computePassEncoder141.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder29.setIndexBuffer(buffer79, 'uint16', 3_732, 6_790);
} catch {}
let querySet16 = device0.createQuerySet({
  label: '\u90f3\u{1fa22}\u{1ff6e}\u603b\u0a53\u99fa\u18b3\u283f\u{1f6f8}\u940e\u6a27',
  type: 'occlusion',
  count: 165,
});
try {
renderPassEncoder47.executeBundles([renderBundle16]);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer116, 'uint32', 2_252, 266);
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
try {
device0.queue.writeBuffer(buffer41, 592, new DataView(new ArrayBuffer(17501)), 4246, 908);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture162,
  mipLevel: 0,
  origin: {x: 39, y: 17, z: 1},
  aspect: 'all',
}, new Uint8Array(37_338).fill(34), /* required buffer size: 37_338 */
{offset: 238, bytesPerRow: 148, rowsPerImage: 74}, {width: 25, height: 29, depthOrArrayLayers: 4});
} catch {}
let imageBitmap3 = await createImageBitmap(videoFrame2);
let commandEncoder198 = device0.createCommandEncoder({});
let texture193 = device0.createTexture({
  size: [192],
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder142 = commandEncoder198.beginComputePass({});
try {
computePassEncoder105.setBindGroup(3, bindGroup81);
} catch {}
try {
renderPassEncoder61.setIndexBuffer(buffer19, 'uint16', 260, 116);
} catch {}
try {
computePassEncoder89.popDebugGroup();
} catch {}
document.body.prepend(img2);
let buffer145 = device0.createBuffer({
  size: 5358,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
try {
computePassEncoder107.setBindGroup(2, bindGroup41);
} catch {}
try {
computePassEncoder142.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder62.setBindGroup(0, bindGroup6);
} catch {}
try {
renderPassEncoder42.setBindGroup(1, bindGroup59, new Uint32Array(1722), 149, 0);
} catch {}
try {
renderPassEncoder46.executeBundles([renderBundle15, renderBundle16]);
} catch {}
try {
renderPassEncoder25.setIndexBuffer(buffer103, 'uint16', 1_728, 4_392);
} catch {}
let arrayBuffer16 = buffer32.getMappedRange(8, 0);
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture48,
  mipLevel: 0,
  origin: {x: 6, y: 82, z: 0},
  aspect: 'all',
}, new Uint8Array(205).fill(67), /* required buffer size: 205 */
{offset: 205, bytesPerRow: 376}, {width: 44, height: 205, depthOrArrayLayers: 0});
} catch {}
let bindGroup91 = device0.createBindGroup({
  label: '\ue0a2\u2331\u97d6\u1cea\ue42d\u9423\ufb28\u35ca\u8260\u0691\u{1f684}',
  layout: bindGroupLayout1,
  entries: [{binding: 381, resource: textureView25}, {binding: 177, resource: textureView4}],
});
let commandEncoder199 = device0.createCommandEncoder();
let computePassEncoder143 = commandEncoder199.beginComputePass();
try {
computePassEncoder75.setBindGroup(3, bindGroup34);
} catch {}
try {
renderPassEncoder53.setBindGroup(0, bindGroup91);
} catch {}
try {
renderPassEncoder52.setBindGroup(2, bindGroup25, new Uint32Array(406), 200, 0);
} catch {}
let bindGroup92 = device0.createBindGroup({
  layout: bindGroupLayout21,
  entries: [{binding: 504, resource: {buffer: buffer145, offset: 1536, size: 16}}],
});
let buffer146 = device0.createBuffer({size: 22212, usage: GPUBufferUsage.MAP_WRITE});
let commandEncoder200 = device0.createCommandEncoder({});
let renderPassEncoder79 = commandEncoder200.beginRenderPass({colorAttachments: [{view: textureView12, loadOp: 'load', storeOp: 'discard'}]});
try {
computePassEncoder143.setBindGroup(0, bindGroup92);
} catch {}
try {
renderPassEncoder59.setScissorRect(6, 43, 0, 9);
} catch {}
await gc();
let buffer147 = device0.createBuffer({
  size: 6135,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder201 = device0.createCommandEncoder({});
let computePassEncoder144 = commandEncoder201.beginComputePass({});
try {
computePassEncoder70.setBindGroup(0, bindGroup47, new Uint32Array(115), 26, 0);
} catch {}
try {
renderPassEncoder19.setBindGroup(2, bindGroup25);
} catch {}
try {
renderPassEncoder61.executeBundles([renderBundle11, renderBundle20, renderBundle13]);
} catch {}
try {
computePassEncoder124.insertDebugMarker('\u0cf6');
} catch {}
try {
gpuCanvasContext4.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  alphaMode: 'premultiplied',
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
renderPassEncoder38.setBindGroup(3, bindGroup25, new Uint32Array(1084), 170, 0);
} catch {}
try {
renderPassEncoder61.setVertexBuffer(7, buffer93, 1_108);
} catch {}
let imageBitmap4 = await createImageBitmap(img4);
try {
computePassEncoder99.setBindGroup(3, bindGroup27, new Uint32Array(2320), 111, 0);
} catch {}
try {
computePassEncoder144.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder56.setScissorRect(1, 10, 40, 28);
} catch {}
try {
renderPassEncoder34.setStencilReference(825);
} catch {}
try {
gpuCanvasContext12.configure({device: device0, format: 'rgba16float', usage: GPUTextureUsage.RENDER_ATTACHMENT, alphaMode: 'opaque'});
} catch {}
let textureView165 = texture63.createView({aspect: 'all', baseMipLevel: 0, mipLevelCount: 1});
try {
computePassEncoder143.setPipeline(pipeline0);
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let commandEncoder202 = device0.createCommandEncoder({});
let textureView166 = texture75.createView({dimension: '2d-array', mipLevelCount: 1});
let renderPassEncoder80 = commandEncoder202.beginRenderPass({
  label: '\u0570\u0b12',
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -392.7, g: 675.4, b: -517.5, a: -959.3, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
let renderBundleEncoder21 = device0.createRenderBundleEncoder({label: '\u0b69\u68ab', colorFormats: ['rgba16float']});
try {
computePassEncoder58.setBindGroup(1, bindGroup19);
} catch {}
try {
computePassEncoder115.setBindGroup(3, bindGroup85, new Uint32Array(185), 34, 0);
} catch {}
try {
renderPassEncoder71.executeBundles([renderBundle14, renderBundle1, renderBundle10]);
} catch {}
try {
renderPassEncoder80.setIndexBuffer(buffer70, 'uint16', 686, 1_362);
} catch {}
try {
renderPassEncoder41.setVertexBuffer(7, buffer113, 0, 5_099);
} catch {}
try {
renderBundleEncoder21.setBindGroup(3, bindGroup17, new Uint32Array(1390), 158, 0);
} catch {}
try {
renderBundleEncoder21.setVertexBuffer(6, buffer81, 0);
} catch {}
try {
buffer18.unmap();
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
document.body.append(img2);
let commandEncoder203 = device0.createCommandEncoder({label: '\u1160\u9dbf\u{1fa84}\u{1fa52}\u71a2\u0a95'});
let textureView167 = texture31.createView({mipLevelCount: 1});
let renderPassEncoder81 = commandEncoder203.beginRenderPass({
  colorAttachments: [{
  view: textureView161,
  depthSlice: 15,
  clearValue: { r: 971.5, g: 365.1, b: 640.1, a: 488.6, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 338986640,
});
let renderBundle21 = renderBundleEncoder21.finish({});
let sampler134 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  lodMinClamp: 62.42,
  lodMaxClamp: 80.15,
  compare: 'greater',
});
try {
renderPassEncoder28.setBindGroup(2, bindGroup81, new Uint32Array(855), 112, 0);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(5, buffer42, 416);
} catch {}
try {
device0.queue.submit([commandBuffer2]);
} catch {}
let bindGroup93 = device0.createBindGroup({
  layout: bindGroupLayout8,
  entries: [{binding: 506, resource: textureView142}, {binding: 182, resource: textureView38}],
});
let buffer148 = device0.createBuffer({
  size: 1153,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let sampler135 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 48.57,
  lodMaxClamp: 53.00,
});
try {
renderPassEncoder35.setScissorRect(4, 17, 3, 89);
} catch {}
let commandEncoder204 = device0.createCommandEncoder({});
let textureView168 = texture39.createView({});
let renderPassEncoder82 = commandEncoder204.beginRenderPass({
  label: '\u{1fc5b}\u02b1\u220d\u0fbc\u02f8\u{1fd6d}\u{1f762}',
  colorAttachments: [{view: textureView74, loadOp: 'clear', storeOp: 'discard'}],
  occlusionQuerySet: querySet14,
});
try {
computePassEncoder38.setBindGroup(1, bindGroup3);
} catch {}
try {
renderPassEncoder13.setBindGroup(3, bindGroup75, []);
} catch {}
try {
renderPassEncoder73.setScissorRect(12, 100, 23, 5);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer149 = device0.createBuffer({
  size: 3745,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture194 = device0.createTexture({
  label: '\uc358\u77d7\u0423\uddac\u{1fca0}\u0db5\ueade',
  size: [256, 256, 17],
  mipLevelCount: 1,
  sampleCount: 1,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let textureView169 = texture194.createView({label: '\u01ae\u{1faa3}\uc965\u{1f911}\u4ee5', baseArrayLayer: 3, arrayLayerCount: 5});
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let textureView170 = texture99.createView({aspect: 'all', baseMipLevel: 0});
let sampler136 = device0.createSampler({
  label: '\uf9c6\u0845\u3101\uf795\u67d7\u5a65\u{1ff97}\uf05c\u0e5d\u0038\u0b92',
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMaxClamp: 97.26,
});
try {
computePassEncoder53.setBindGroup(2, bindGroup62);
} catch {}
try {
renderPassEncoder46.setBindGroup(3, bindGroup3);
} catch {}
try {
renderPassEncoder48.setBindGroup(2, bindGroup16, new Uint32Array(2501), 187, 0);
} catch {}
try {
renderPassEncoder55.setVertexBuffer(7, buffer113);
} catch {}
let arrayBuffer17 = buffer14.getMappedRange(6184, 136);
try {
computePassEncoder50.setBindGroup(0, bindGroup76);
} catch {}
try {
computePassEncoder72.setBindGroup(3, bindGroup6, new Uint32Array(1084), 147, 0);
} catch {}
let commandEncoder205 = device0.createCommandEncoder({});
let computePassEncoder145 = commandEncoder205.beginComputePass({});
let renderBundleEncoder22 = device0.createRenderBundleEncoder({
  label: '\u{1fe27}\uef34\u{1f629}\u19bd\u807b\u07bc\u4d15\u216e\u0dab',
  colorFormats: ['rgba16float'],
  depthReadOnly: true,
});
let sampler137 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 40.93,
  lodMaxClamp: 95.19,
});
try {
computePassEncoder106.setBindGroup(2, bindGroup91, new Uint32Array(7), 0, 0);
} catch {}
try {
renderPassEncoder28.setBindGroup(0, bindGroup93, new Uint32Array(1290), 48, 0);
} catch {}
try {
renderPassEncoder73.setViewport(25.078008504162447, 11.695745914356788, 16.47143576078393, 45.079105919835754, 0.12549985889863935, 0.18433122434847304);
} catch {}
try {
renderBundleEncoder22.setBindGroup(0, bindGroup41, []);
} catch {}
try {
renderBundleEncoder22.setBindGroup(1, bindGroup9, new Uint32Array(6687), 1_704, 0);
} catch {}
try {
renderBundleEncoder22.setPipeline(pipeline3);
} catch {}
try {
renderBundleEncoder22.setVertexBuffer(6, buffer12);
} catch {}
try {
buffer124.unmap();
} catch {}
let imageData33 = new ImageData(24, 32);
let bindGroup94 = device0.createBindGroup({
  layout: bindGroupLayout3,
  entries: [{binding: 251, resource: {buffer: buffer66, offset: 0, size: 316}}],
});
let buffer150 = device0.createBuffer({
  size: 19864,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder206 = device0.createCommandEncoder({label: '\u{1f6ba}\u034c\u{1fb56}\u3528\u17c8\u0192\u08fc\u{1ffaf}\uca7d\u67d4'});
let computePassEncoder146 = commandEncoder206.beginComputePass({});
let renderBundle22 = renderBundleEncoder22.finish({label: '\u7c03\u{1f658}'});
try {
computePassEncoder92.setBindGroup(3, bindGroup54, new Uint32Array(262), 2, 0);
} catch {}
try {
renderPassEncoder62.setBindGroup(2, bindGroup32);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: offscreenCanvas7,
  origin: { x: 5, y: 31 },
  flipY: false,
}, {
  texture: texture178,
  mipLevel: 0,
  origin: {x: 3, y: 4, z: 9},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 25, height: 14, depthOrArrayLayers: 0});
} catch {}
let textureView171 = texture24.createView({});
let sampler138 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 86.48,
  lodMaxClamp: 99.75,
});
try {
computePassEncoder95.setBindGroup(3, bindGroup16);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup27);
} catch {}
try {
renderPassEncoder9.executeBundles([renderBundle12]);
} catch {}
try {
renderPassEncoder25.setPipeline(pipeline4);
} catch {}
try {
gpuCanvasContext12.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'opaque',
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData3,
  origin: { x: 37, y: 0 },
  flipY: true,
}, {
  texture: texture18,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\u{1ff49}\u2c17';
} catch {}
let buffer151 = device0.createBuffer({
  size: 17110,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let commandEncoder207 = device0.createCommandEncoder({});
let textureView172 = texture130.createView({dimension: 'cube-array', mipLevelCount: 1, baseArrayLayer: 2, arrayLayerCount: 6});
let computePassEncoder147 = commandEncoder207.beginComputePass({});
try {
computePassEncoder134.setBindGroup(0, bindGroup28, new Uint32Array(1467), 297, 0);
} catch {}
try {
computePassEncoder146.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder34.executeBundles([renderBundle3, renderBundle15]);
} catch {}
try {
buffer46.unmap();
} catch {}
let buffer152 = device0.createBuffer({size: 8864, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX});
let sampler139 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 26.71,
  lodMaxClamp: 55.37,
});
try {
renderPassEncoder21.setIndexBuffer(buffer24, 'uint16', 112, 111);
} catch {}
try {
adapter0.label = '\u{1fe8c}\ufc2b\u0287\u093f\uba16\uf8a9\u0c19\u2fe0\u0450\ue80f';
} catch {}
let commandEncoder208 = device0.createCommandEncoder({});
let texture195 = device0.createTexture({
  size: {width: 192, height: 912, depthOrArrayLayers: 1},
  mipLevelCount: 4,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let textureView173 = texture71.createView({dimension: 'cube-array', baseArrayLayer: 0, arrayLayerCount: 6});
try {
computePassEncoder131.setBindGroup(0, bindGroup15);
} catch {}
try {
renderPassEncoder46.setBindGroup(3, bindGroup50, new Uint32Array(1705), 337, 0);
} catch {}
try {
renderPassEncoder3.setViewport(0.5290388570075673, 0.8729458285507079, 0.4121182194685302, 0.07667752629438758, 0.8420692648154212, 0.8789181246474672);
} catch {}
try {
renderPassEncoder81.setIndexBuffer(buffer149, 'uint32', 556, 525);
} catch {}
try {
renderPassEncoder41.setPipeline(pipeline2);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 128, height: 128, depthOrArrayLayers: 17}
*/
{
  source: imageData33,
  origin: { x: 0, y: 4 },
  flipY: false,
}, {
  texture: texture23,
  mipLevel: 1,
  origin: {x: 0, y: 4, z: 1},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 2, depthOrArrayLayers: 0});
} catch {}
let bindGroup95 = device0.createBindGroup({
  label: '\u{1fc4f}\ue502\u0581',
  layout: bindGroupLayout14,
  entries: [{binding: 41, resource: {buffer: buffer109, offset: 3584}}],
});
let pipelineLayout19 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture196 = device0.createTexture({
  size: [8, 1, 1],
  mipLevelCount: 3,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder148 = commandEncoder208.beginComputePass({});
let sampler140 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 29.59,
  lodMaxClamp: 91.37,
  maxAnisotropy: 13,
});
try {
computePassEncoder128.setBindGroup(0, bindGroup13);
} catch {}
try {
computePassEncoder145.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder68.setIndexBuffer(buffer12, 'uint16', 2_154, 563);
} catch {}
let arrayBuffer18 = buffer72.getMappedRange(192, 0);
let bindGroup96 = device0.createBindGroup({layout: bindGroupLayout11, entries: [{binding: 31, resource: textureView63}]});
let buffer153 = device0.createBuffer({
  size: 4869,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder209 = device0.createCommandEncoder({});
try {
computePassEncoder147.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder80.setBindGroup(1, bindGroup68);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
let buffer154 = device0.createBuffer({
  label: '\u{1ff87}\u{1fbc3}\u5c57\uc7b3\ue2e9\ub191\u{1f76a}\ue563',
  size: 3367,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE,
});
try {
renderPassEncoder45.setIndexBuffer(buffer136, 'uint32', 3_160, 3_909);
} catch {}
try {
commandEncoder209.copyTextureToBuffer({
  texture: texture191,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 6},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 40 */
  offset: 40,
  bytesPerRow: 256,
  buffer: buffer94,
}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
try {
commandEncoder209.clearBuffer(buffer12, 900, 604);
} catch {}
let commandEncoder210 = device0.createCommandEncoder({label: '\u{1fd80}\u013a\u991a\u{1fc2b}\u096b\u01e4'});
let texture197 = device0.createTexture({
  size: {width: 192},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder149 = commandEncoder209.beginComputePass({});
let renderPassEncoder83 = commandEncoder210.beginRenderPass({
  colorAttachments: [{
  view: textureView113,
  clearValue: { r: 81.65, g: -729.1, b: 439.5, a: -704.8, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let externalTexture16 = device0.importExternalTexture({label: '\u4d46\u{1fc2a}\u0bb6\u88c8', source: videoFrame6});
try {
computePassEncoder57.setBindGroup(0, bindGroup44);
} catch {}
try {
computePassEncoder148.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.executeBundles([renderBundle9, renderBundle4, renderBundle4]);
} catch {}
try {
renderPassEncoder62.setStencilReference(103);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline4);
} catch {}
try {
gpuCanvasContext9.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
let bindGroup97 = device0.createBindGroup({
  layout: bindGroupLayout13,
  entries: [{binding: 457, resource: textureView146}, {binding: 135, resource: textureView71}],
});
let sampler141 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 70.94,
  lodMaxClamp: 86.30,
});
try {
computePassEncoder114.setBindGroup(2, bindGroup91, new Uint32Array(6001), 900, 0);
} catch {}
try {
renderPassEncoder83.setIndexBuffer(buffer117, 'uint16', 756, 1_207);
} catch {}
let commandEncoder211 = device0.createCommandEncoder();
try {
renderPassEncoder34.setBindGroup(2, bindGroup70);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
externalTexture13.label = '\u0857\uda7f\u0d75';
} catch {}
let buffer155 = device0.createBuffer({
  size: 5250,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder212 = device0.createCommandEncoder({});
let textureView174 = texture159.createView({baseMipLevel: 1, mipLevelCount: 1, baseArrayLayer: 0});
let renderPassEncoder84 = commandEncoder211.beginRenderPass({
  colorAttachments: [{
  view: textureView47,
  clearValue: { r: -223.3, g: 797.2, b: 778.3, a: 53.83, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet5,
});
try {
computePassEncoder35.setBindGroup(1, bindGroup19, new Uint32Array(708), 316, 0);
} catch {}
try {
renderPassEncoder10.setBindGroup(3, bindGroup97);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer116, 'uint32', 1_964, 926);
} catch {}
try {
renderPassEncoder6.setPipeline(pipeline3);
} catch {}
try {
commandEncoder212.copyBufferToBuffer(buffer0, 4200, buffer90, 824, 224);
} catch {}
try {
renderPassEncoder38.insertDebugMarker('\uc6a0');
} catch {}
try {
device0.queue.writeTexture({
  texture: texture169,
  mipLevel: 1,
  origin: {x: 17, y: 20, z: 0},
  aspect: 'all',
}, new Uint8Array(137).fill(114), /* required buffer size: 137 */
{offset: 137, bytesPerRow: 17}, {width: 1, height: 10, depthOrArrayLayers: 0});
} catch {}
await gc();
let buffer156 = device0.createBuffer({
  size: 1803,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let texture198 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView175 = texture60.createView({baseArrayLayer: 1, arrayLayerCount: 1});
try {
computePassEncoder67.setBindGroup(1, bindGroup73, new Uint32Array(2671), 142, 0);
} catch {}
try {
renderPassEncoder31.setIndexBuffer(buffer53, 'uint16', 1_440, 13_218);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer157 = device0.createBuffer({
  label: '\u8e86\u58ea\u0c89\u{1f932}',
  size: 16545,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder213 = device0.createCommandEncoder();
try {
computePassEncoder149.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder29.setBindGroup(2, bindGroup9, new Uint32Array(82), 5, 0);
} catch {}
try {
renderPassEncoder48.end();
} catch {}
try {
renderPassEncoder34.setIndexBuffer(buffer135, 'uint32', 132, 155);
} catch {}
try {
renderPassEncoder47.setVertexBuffer(3, buffer113, 7_516);
} catch {}
try {
buffer123.destroy();
} catch {}
try {
commandEncoder212.insertDebugMarker('\u045e');
} catch {}
try {
device0.queue.writeBuffer(buffer103, 4348, new DataView(new ArrayBuffer(12310)), 1560, 972);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture112,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(174).fill(92), /* required buffer size: 174 */
{offset: 174, bytesPerRow: 20}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer158 = device0.createBuffer({size: 1564, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE, mappedAtCreation: false});
let texture199 = device0.createTexture({
  size: {width: 1, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder150 = commandEncoder212.beginComputePass();
let sampler142 = device0.createSampler({
  label: '\u{1ffca}\u6376\uf8d2',
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 21.32,
  maxAnisotropy: 11,
});
try {
renderPassEncoder14.setBindGroup(2, bindGroup77);
} catch {}
try {
renderPassEncoder44.setBindGroup(1, bindGroup52, new Uint32Array(826), 143, 0);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer153, 'uint32', 684, 54);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 4, height: 1, depthOrArrayLayers: 3}
*/
{
  source: videoFrame15,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture112,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext10.unconfigure();
} catch {}
try {
if (!arrayBuffer17.detached) { new Uint8Array(arrayBuffer17).fill(0x55); };
} catch {}
let buffer159 = device0.createBuffer({size: 12022, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE});
let commandBuffer3 = commandEncoder130.finish({});
let computePassEncoder151 = commandEncoder213.beginComputePass({label: '\u3c56\u195b\u{1ff3f}\u{1f947}\uc10b\u0d93\u071e\u{1f9a3}\u{1f727}'});
try {
computePassEncoder109.setBindGroup(2, bindGroup88, new Uint32Array(865), 138, 0);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle14, renderBundle2]);
} catch {}
let promise23 = device0.queue.onSubmittedWorkDone();
try {
  await promise23;
} catch {}
let bindGroupLayout22 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 91,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba16sint', access: 'read-only', viewDimension: '3d' },
    },
    {
      binding: 62,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'r32uint', access: 'read-write', viewDimension: '1d' },
    },
  ],
});
let bindGroup98 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 22, resource: {buffer: buffer2, offset: 2816}}]});
let texture200 = device0.createTexture({
  size: [96],
  sampleCount: 1,
  dimension: '1d',
  format: 'r32uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture201 = device0.createTexture({
  label: '\uca7c\ua156\u{1f964}\ud59f\u0192\u0e46\uf443\u789d',
  size: {width: 8, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder83.setBindGroup(0, bindGroup49, new Uint32Array(329), 25, 0);
} catch {}
try {
renderPassEncoder58.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder77.setVertexBuffer(2, buffer2);
} catch {}
try {
buffer23.unmap();
} catch {}
let commandEncoder214 = device0.createCommandEncoder({});
let textureView176 = texture200.createView({format: 'r32uint', mipLevelCount: 1});
try {
computePassEncoder43.setBindGroup(0, bindGroup85);
} catch {}
try {
renderPassEncoder82.setBindGroup(0, bindGroup13);
} catch {}
try {
renderPassEncoder55.setIndexBuffer(buffer153, 'uint32', 172, 172);
} catch {}
try {
renderPassEncoder81.setVertexBuffer(0, buffer103);
} catch {}
try {
commandEncoder214.copyBufferToTexture({
  /* bytesInLastRow: 116 widthInBlocks: 29 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 4772 */
  offset: 4772,
  bytesPerRow: 5120,
  buffer: buffer111,
}, {
  texture: texture175,
  mipLevel: 0,
  origin: {x: 20, y: 0, z: 0},
  aspect: 'all',
}, {width: 29, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.prepend(canvas0);
let buffer160 = device0.createBuffer({label: '\u{1fb53}\uc067', size: 4950, usage: GPUBufferUsage.INDEX | GPUBufferUsage.VERTEX});
let texture202 = device0.createTexture({
  label: '\u{1fd41}\u2406\u091d',
  size: [1, 1, 381],
  dimension: '3d',
  format: 'rgba16sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder152 = commandEncoder214.beginComputePass({});
let sampler143 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 68.79,
  lodMaxClamp: 98.94,
  compare: 'greater-equal',
});
try {
computePassEncoder22.setBindGroup(1, bindGroup61);
} catch {}
let promise24 = device0.queue.onSubmittedWorkDone();
let textureView177 = texture202.createView({format: 'rgba16sint'});
let texture203 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 30},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
renderPassEncoder0.setBindGroup(3, bindGroup4, []);
} catch {}
try {
renderPassEncoder56.setPipeline(pipeline4);
} catch {}
let commandEncoder215 = device0.createCommandEncoder({});
let textureView178 = texture165.createView({arrayLayerCount: 1});
let computePassEncoder153 = commandEncoder215.beginComputePass({});
let textureView179 = texture0.createView({label: '\ua22b\u0495\ue456\u82e8\u03a9', mipLevelCount: 1});
try {
computePassEncoder134.setBindGroup(0, bindGroup66);
} catch {}
try {
renderPassEncoder7.executeBundles([renderBundle10, renderBundle8]);
} catch {}
try {
renderPassEncoder78.setIndexBuffer(buffer125, 'uint16', 1_248, 873);
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let shaderModule12 = device0.createShaderModule({
  label: '\u0cf3\u7427\u709a\u{1f9cf}\uf287\u{1f7bf}\u1044\u8739\u9234\u{1fcee}\u{1ffa5}',
  code: `
diagnostic(info, xyz);

enable f16;

requires readonly_and_readwrite_storage_textures;

requires unrestricted_pointer_parameters;

fn unconst_u32(v: u32) -> u32 { return v; }

@group(0) @binding(204) var<storage, read> buffer162: array<vec2h, 5>;

fn unconst_bool(v: bool) -> bool { return v; }

struct T0 {
  @align(2) @size(52) f0: array<u32>,
}

struct FragmentOutput9 {
  @location(0) @interpolate(linear) f0: vec4f,
}

struct VertexOutput10 {
  @location(4) f51: vec4i,
  @builtin(position) f52: vec4f,
}

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

fn fn0() -> mat4x3h {
  var out: mat4x3h;
  var vf158: vec4f = tanh(tanh(vec4f(unconst_f32(0.7102), unconst_f32(0.04097), unconst_f32(0.00324), unconst_f32(0.3227))));
  buffer161[u32((*&buffer161)[u32(tanh(vec4h(unconst_f16(17097.8), unconst_f16(7868.3), unconst_f16(18251.5), unconst_f16(21625.6)))[0])][24])][u32((*&buffer161)[arrayLength(&(*&buffer161))][24])] = f16(tanh(vec4f(f32(pack4xI8Clamp(vec4i(unconst_i32(131), unconst_i32(52), unconst_i32(213), unconst_i32(146)))))).b);
  buffer161[bitcast<u32>(buffer162[4])][u32(unconst_u32(54))] += tanh(vec4h(buffer162[4][u32(unconst_u32(157))])).x;
  buffer161[u32(buffer162[4][0])][pack4xU8Clamp(bitcast<vec4u>(textureLoad(et8, vec2u())))] = buffer162[4].x;
  buffer161[u32(unconst_u32(425))][u32(unconst_u32(56))] = buffer161[u32((*&buffer162)[4][u32(unconst_u32(79))])][24];
  let vf159: vec3h = asin(vec3h(unconst_f16(2610.5), unconst_f16(12230.8), unconst_f16(6268.8)));
  let ptr151: ptr<storage, vec2h, read> = &(*&buffer162)[4];
  out -= mat4x3h(buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))], buffer161[arrayLength(&buffer161)][u32(unconst_u32(74))]);
  buffer161[u32(buffer162[4][0])][u32(unconst_u32(25))] *= f16(vf158[u32(buffer161[i32(buffer161[arrayLength(&buffer161)][u32(unconst_u32(39))])][24])]);
  let vf160: u32 = insertBits(u32((*&buffer161)[arrayLength(&(*&buffer161))][24]), u32(unconst_u32(76)), bitcast<vec4u>(tanh(vec4f(unconst_f32(0.3044), unconst_f32(0.6919), unconst_f32(0.1553), unconst_f32(0.1244))))[0], u32(unconst_u32(203)));
  return out;
}

@group(0) @binding(119) var<storage, read_write> buffer161: array<array<f16, 25>>;

@group(0) @binding(78) var et8: texture_external;

@vertex
fn vertex12(@location(8) @interpolate(perspective, centroid) a0: vec4f) -> @builtin(position) vec4f {
  var out: vec4f;
  let vf161: vec4f = round(acos(vec4f(unconst_f32(0.03341), unconst_f32(0.1157), unconst_f32(-0.1334), unconst_f32(0.04116))));
  out -= acos(vec4f(unconst_f32(0.2155), unconst_f32(-0.03074), unconst_f32(0.1014), unconst_f32(0.4067)));
  let vf162: f16 = buffer162[4][u32(unconst_u32(164))];
  var vf163: vec2h = fma(vec2h(unconst_f16(11988.3), unconst_f16(-13601.5)), vec2h(sin(vec3f(unconst_f32(0.02397), unconst_f32(0.1465), unconst_f32(0.1076))).bg), vec2h(unconst_f16(16134.7), unconst_f16(3316.0)));
  var vf164: f16 = buffer162[4][bitcast<u32>((*&buffer162)[4])];
  var vf165: f16 = buffer162[4][u32(buffer162[4][u32(vf161[2])])];
  vf164 += vf163[0];
  let vf166: u32 = pack2x16float(vec2f(f32(buffer162[4][1])));
  var vf167: u32 = pack4x8snorm(vec4f(unconst_f32(0.03357), unconst_f32(0.02959), unconst_f32(0.2463), unconst_f32(0.2154)));
  let vf168: f16 = vf163[1];
  let vf169: vec4f = step(vec4f(saturate(f32(unconst_f32(0.6547)))), vec4f(unconst_f32(0.2279), unconst_f32(0.01518), unconst_f32(0.00885), unconst_f32(0.06459)));
  let ptr152: ptr<storage, vec2h, read> = &buffer162[vf166];
  let ptr153: ptr<storage, vec2h, read> = &(*ptr152);
  return out;
}

@vertex
fn vertex13() -> @builtin(position) vec4f {
  var out: vec4f;
  let vf170: mat4x2h = transpose(mat2x4h(unconst_f16(18352.6), unconst_f16(831.8), unconst_f16(410.4), unconst_f16(7054.0), unconst_f16(10115.1), unconst_f16(7990.4), unconst_f16(8472.5), unconst_f16(1077.9)));
  out -= vec4f(bitcast<f32>(pack4xI8Clamp(vec4i(unconst_i32(251), unconst_i32(92), unconst_i32(757), unconst_i32(30)))));
  let ptr154: ptr<storage, vec2h, read> = &(*&buffer162)[bitcast<u32>(vf170[u32(unconst_u32(95))])];
  let vf171: f16 = (*ptr154)[u32((*ptr154)[0])];
  out = vec4f(f32((*ptr154)[0]));
  out -= vec4f(buffer162[4].yxxx);
  var vf172: f16 = vf170[0][bitcast<u32>((*ptr154))];
  var vf173: u32 = firstTrailingBit(u32(unconst_u32(91)));
  out += vec4f((*&buffer162)[4].xxyx);
  let ptr155: ptr<storage, vec2h, read> = &(*&buffer162)[bitcast<u32>((*&buffer162)[4])];
  out = vec4f(f32((*ptr154)[0]));
  var vf174: vec3f = sin(vec3f(unconst_f32(0.1736), unconst_f32(-0.00455), unconst_f32(0.06603)));
  out += vec4f(f32(buffer162[4][0]));
  vf173 >>= bitcast<u32>((*&buffer162)[4]);
  return out;
}

@vertex
fn vertex14() -> VertexOutput10 {
  var out: VertexOutput10;
  out.f52 = step(vec2f(unconst_f32(0.3571), unconst_f32(0.00796)), vec2f(unconst_f32(0.1098), unconst_f32(0.1610))).gggr;
  var vf175: f16 = (*&buffer162)[4][1];
  out.f51 = vec4i(sin(vec2f(unconst_f32(0.04943), unconst_f32(0.02409))).gggg);
  let vf176: u32 = pack2x16snorm(vec2f(unconst_f32(0.2060), unconst_f32(0.1792)));
  return out;
}

@fragment
fn fragment12() -> @location(200) @interpolate(perspective) vec4u {
  var out: vec4u;
  var vf177 = fn0();
  let vf178: f16 = buffer162[4][0];
  fn0();
  let ptr156: ptr<function, vec3h> = &vf177[2];
  buffer161[u32(buffer161[arrayLength(&buffer161)][u32(unconst_u32(177))])][u32(unconst_u32(133))] = buffer162[u32(unconst_u32(129))][0];
  discard;
  out -= vec4u(u32(buffer162[4][0]));
  let vf179: f16 = vf177[2][2];
  return out;
}

@fragment
fn fragment13(@builtin(position) a0: vec4f) -> @location(200) vec4f {
  var out: vec4f;
  buffer161[bitcast<u32>(buffer162[4])][24] = (*&buffer161)[arrayLength(&(*&buffer161))][u32(unconst_u32(21))];
  fn0();
  let ptr157: ptr<storage, f16, read_write> = &(*&buffer161)[arrayLength(&(*&buffer161))][24];
  buffer161[u32(buffer161[arrayLength(&buffer161)][24])][u32(unconst_u32(71))] = f16(a0[3]);
  return out;
}

@fragment
fn fragment14() -> FragmentOutput9 {
  var out: FragmentOutput9;
  var vf180 = fn0();
  let vf181: f16 = (*&buffer162)[4][u32(unconst_u32(41))];
  out.f0 = vec4f(f32((*&buffer162)[4][bitcast<u32>((*&buffer162)[4])]));
  var vf182 = fn0();
  buffer161[u32((*&buffer162)[4][u32(vf182[u32(unconst_u32(20))][0])])][u32(unconst_u32(541))] += (*&buffer162)[4][1];
  let ptr158: ptr<function, mat4x3h> = &vf182;
  return out;
}

@fragment
fn fragment15(@invariant @builtin(position) a0: vec4f) -> @location(200) vec4u {
  var out: vec4u;
  fn0();
  var vf183 = fn0();
  out = vec4u(u32(buffer161[arrayLength(&buffer161)][24]));
  var vf184 = fn0();
  fn0();
  let ptr159: ptr<function, vec3h> = &vf183[0];
  vf183 = mat4x3h(buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))], buffer162[4][u32(unconst_u32(146))]);
  out *= vec4u(u32(buffer162[4][1]));
  fn0();
  buffer161[u32(vf184[3][2])][bitcast<u32>(min(vec2i(i32(pack2x16snorm(vec2f(buffer162[4])))), vec2i(i32(vf183[0][u32(unconst_u32(395))])))[0])] -= vf183[0][u32(vf183[u32(unconst_u32(122))][0])];
  vf183 = mat4x3h(vf184[u32(unconst_u32(192))], vf184[u32(unconst_u32(192))], vf184[u32(unconst_u32(192))], vf184[u32(unconst_u32(192))]);
  buffer161[u32(unconst_u32(279))][u32(unconst_u32(21))] = f16(countOneBits(i32(unconst_i32(157))));
  let ptr160: ptr<function, vec3h> = &vf184[0];
  vf183 = mat4x3h(vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2], vf184[0][2]);
  var vf185 = fn0();
  var vf186 = fn0();
  vf186 = mat4x3h(buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24], buffer161[arrayLength(&buffer161)][24]);
  return out;
}`,
  sourceMap: {},
});
let buffer163 = device0.createBuffer({
  label: '\u84f0\u0619\u{1fa9f}\u0602\ub84b\u3358\ubf47\u797f\u1c88\ud935',
  size: 13785,
  usage: GPUBufferUsage.QUERY_RESOLVE,
});
let commandEncoder216 = device0.createCommandEncoder({});
try {
computePassEncoder50.setBindGroup(2, bindGroup82);
} catch {}
try {
renderPassEncoder36.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder19.setStencilReference(646);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture160,
  mipLevel: 0,
  origin: {x: 6, y: 74, z: 1},
  aspect: 'all',
}, new Uint8Array(69).fill(197), /* required buffer size: 69 */
{offset: 69, bytesPerRow: 32}, {width: 5, height: 60, depthOrArrayLayers: 0});
} catch {}
let buffer164 = device0.createBuffer({size: 6711, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT});
let computePassEncoder154 = commandEncoder216.beginComputePass({});
try {
computePassEncoder152.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder22.setScissorRect(0, 0, 0, 0);
} catch {}
try {
gpuCanvasContext12.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_SRC, colorSpace: 'display-p3'});
} catch {}
let videoFrame24 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRA',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'fcc', primaries: 'smpteSt4281', transfer: 'gamma22curve'} });
let buffer165 = device0.createBuffer({
  label: '\u480c\u{1fd53}\u6b69\u{1f92b}',
  size: 998,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE,
  mappedAtCreation: false,
});
let commandEncoder217 = device0.createCommandEncoder({});
let textureView180 = texture200.createView({baseMipLevel: 0});
let texture204 = device0.createTexture({
  size: [1, 1, 51],
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView181 = texture193.createView({label: '\u6604\ua3ec\u49ca\ud0f1\u05bd'});
let renderPassEncoder85 = commandEncoder217.beginRenderPass({
  label: '\ua191\u58c0\u{1fd21}\u03e6\u4186\u0fd3\uf2ab\u05de\ubfd3',
  colorAttachments: [{
  view: textureView106,
  clearValue: { r: -693.3, g: 864.1, b: 967.2, a: -404.2, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder110.setBindGroup(0, bindGroup26, []);
} catch {}
let bindGroup99 = device0.createBindGroup({layout: bindGroupLayout7, entries: [{binding: 218, resource: textureView113}]});
let textureView182 = texture60.createView({label: '\u{1fb19}\u1716', arrayLayerCount: 1});
try {
renderPassEncoder56.setBindGroup(0, bindGroup35, new Uint32Array(2513), 126, 0);
} catch {}
try {
renderPassEncoder76.beginOcclusionQuery(145);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline3);
} catch {}
let promise25 = device0.queue.onSubmittedWorkDone();
let videoFrame25 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'NV12',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'rgb', primaries: 'bt470m', transfer: 'bt709'} });
try {
renderPassEncoder63.setBindGroup(2, bindGroup72);
} catch {}
try {
renderPassEncoder24.executeBundles([renderBundle22, renderBundle20]);
} catch {}
try {
device0.queue.submit([commandBuffer3]);
} catch {}
try {
  await promise25;
} catch {}
document.body.prepend(img1);
await gc();
let textureView183 = texture99.createView({});
let sampler144 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  minFilter: 'nearest',
  lodMinClamp: 63.30,
  lodMaxClamp: 76.34,
});
try {
computePassEncoder150.setPipeline(pipeline0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let videoFrame26 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-ncl', primaries: 'bt709', transfer: 'smpteSt4281'} });
let buffer166 = device0.createBuffer({
  size: 3031,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
try {
renderPassEncoder39.setBindGroup(0, bindGroup88);
} catch {}
let arrayBuffer19 = buffer14.getMappedRange(6320, 56);
document.body.prepend(canvas2);
let buffer167 = device0.createBuffer({
  size: 7562,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder218 = device0.createCommandEncoder({});
let computePassEncoder155 = commandEncoder218.beginComputePass({});
try {
computePassEncoder86.setBindGroup(3, bindGroup42);
} catch {}
try {
renderPassEncoder69.setIndexBuffer(buffer37, 'uint32', 1_172, 3_034);
} catch {}
try {
renderPassEncoder52.setVertexBuffer(0, buffer156);
} catch {}
let bindGroupLayout23 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 64,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
  ],
});
let textureView184 = texture73.createView({label: '\u3a97\ub8be\u0f48'});
let sampler145 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  minFilter: 'nearest',
  lodMinClamp: 86.82,
  lodMaxClamp: 99.13,
});
try {
computePassEncoder131.setBindGroup(2, bindGroup77, new Uint32Array(313), 83, 0);
} catch {}
try {
computePassEncoder29.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder62.setIndexBuffer(buffer36, 'uint32', 36, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture121,
  mipLevel: 0,
  origin: {x: 22, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(343).fill(100), /* required buffer size: 343 */
{offset: 343, bytesPerRow: 34, rowsPerImage: 63}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture205 = device0.createTexture({
  size: {width: 256, height: 256, depthOrArrayLayers: 17},
  mipLevelCount: 4,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST,
});
let sampler146 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  compare: 'equal',
});
try {
renderPassEncoder58.setBindGroup(2, bindGroup59);
} catch {}
try {
renderPassEncoder33.setIndexBuffer(buffer71, 'uint16', 134, 84);
} catch {}
try {
device0.queue.writeBuffer(buffer75, 2104, new Int16Array(16577), 4859, 2076);
} catch {}
await gc();
let videoFrame27 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt2020-ncl', primaries: 'jedecP22Phosphors', transfer: 'bt2020_12bit'} });
let commandEncoder219 = device0.createCommandEncoder();
let computePassEncoder156 = commandEncoder219.beginComputePass({});
try {
renderPassEncoder24.setPipeline(pipeline4);
} catch {}
let bindGroupLayout24 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 297,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
    {
      binding: 126,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 47,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      storageTexture: { format: 'r32uint', access: 'read-only', viewDimension: '2d' },
    },
  ],
});
let bindGroup100 = device0.createBindGroup({
  layout: bindGroupLayout20,
  entries: [
    {binding: 41, resource: externalTexture3},
    {binding: 150, resource: textureView121},
    {binding: 189, resource: textureView16},
  ],
});
let buffer168 = device0.createBuffer({
  size: 164,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder220 = device0.createCommandEncoder({});
let computePassEncoder157 = commandEncoder220.beginComputePass();
try {
renderPassEncoder7.executeBundles([renderBundle14]);
} catch {}
try {
renderPassEncoder19.setVertexBuffer(4_294_967_294, undefined, 139_285_028, 875_158_466);
} catch {}
let commandEncoder221 = device0.createCommandEncoder({});
let textureView185 = texture202.createView({label: '\u0644\uc707'});
let computePassEncoder158 = commandEncoder221.beginComputePass({label: '\ubac2\u03a6\u{1f6c3}\u3b79\u0efc\u346d\u{1fe50}\u2324\u0fb5'});
let sampler147 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 34.80,
  maxAnisotropy: 11,
});
try {
computePassEncoder158.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder32.setBindGroup(2, bindGroup13);
} catch {}
try {
renderPassEncoder78.executeBundles([renderBundle18, renderBundle1, renderBundle17]);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer48, 'uint32', 2_036, 1_065);
} catch {}
try {
renderPassEncoder41.setVertexBuffer(1, buffer89, 0, 2_656);
} catch {}
let buffer169 = device0.createBuffer({size: 17291, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: false});
let commandEncoder222 = device0.createCommandEncoder({label: '\u01dd\ue5cc\u0606\ude1d\u4c92'});
let texture206 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 7},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder159 = commandEncoder222.beginComputePass();
try {
renderPassEncoder9.setIndexBuffer(buffer52, 'uint16', 82, 209);
} catch {}
try {
buffer1.unmap();
} catch {}
document.body.append(img4);
try {
globalThis.someLabel = texture206.label;
} catch {}
let bindGroup101 = device0.createBindGroup({
  layout: bindGroupLayout21,
  entries: [{binding: 504, resource: {buffer: buffer85, offset: 256, size: 104}}],
});
let commandEncoder223 = device0.createCommandEncoder({});
let renderPassEncoder86 = commandEncoder223.beginRenderPass({
  colorAttachments: [{view: textureView104, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet9,
});
try {
computePassEncoder127.setBindGroup(3, bindGroup2);
} catch {}
try {
renderPassEncoder76.endOcclusionQuery();
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle7, renderBundle17]);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let texture207 = device0.createTexture({
  size: [2, 1, 18],
  mipLevelCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder129.setBindGroup(3, bindGroup84);
} catch {}
try {
renderPassEncoder57.setBindGroup(1, bindGroup15);
} catch {}
try {
renderPassEncoder42.setIndexBuffer(buffer117, 'uint32', 120, 346);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 1, depthOrArrayLayers: 62}
*/
{
  source: videoFrame13,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture28,
  mipLevel: 0,
  origin: {x: 5, y: 0, z: 5},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let textureView186 = texture106.createView({});
try {
computePassEncoder149.setBindGroup(3, bindGroup90, new Uint32Array(1), 0, 0);
} catch {}
try {
renderPassEncoder54.setBindGroup(0, bindGroup5, new Uint32Array(516), 11, 0);
} catch {}
try {
renderPassEncoder52.executeBundles([renderBundle10, renderBundle7]);
} catch {}
try {
device0.queue.writeBuffer(buffer31, 576, new BigUint64Array(5089), 841, 12);
} catch {}
let commandEncoder224 = device0.createCommandEncoder({});
let textureView187 = texture26.createView({dimension: '2d-array', aspect: 'all', arrayLayerCount: 1});
let computePassEncoder160 = commandEncoder224.beginComputePass({});
try {
device0.pushErrorScope('internal');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise24;
} catch {}
try {
renderPassEncoder21.setBindGroup(2, bindGroup18);
} catch {}
try {
renderPassEncoder13.setBindGroup(2, bindGroup1, new Uint32Array(919), 159, 0);
} catch {}
try {
renderPassEncoder14.executeBundles([renderBundle9, renderBundle16]);
} catch {}
try {
renderPassEncoder60.setIndexBuffer(buffer141, 'uint32', 20, 99);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture87,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 33},
  aspect: 'all',
}, new Uint8Array(61_132).fill(27), /* required buffer size: 61_132 */
{offset: 82, bytesPerRow: 33, rowsPerImage: 37}, {width: 0, height: 0, depthOrArrayLayers: 51});
} catch {}
document.body.prepend(img0);
try {
renderPassEncoder15.executeBundles([renderBundle7, renderBundle18, renderBundle14]);
} catch {}
try {
renderPassEncoder7.setViewport(0.3554159685462839, 0.9128574015797026, 1.616560087434545, 0.0024850365372914586, 0.038402986964178876, 0.4394254301492963);
} catch {}
try {
renderPassEncoder63.setPipeline(pipeline2);
} catch {}
try {
device0.queue.writeBuffer(buffer74, 132, new Float32Array(6217), 1031, 8);
} catch {}
let promise26 = device0.queue.onSubmittedWorkDone();
await gc();
let videoFrame28 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt2020-cl', primaries: 'bt709', transfer: 'linear'} });
let sampler148 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 27.99,
  lodMaxClamp: 31.70,
  maxAnisotropy: 17,
});
try {
computePassEncoder51.setBindGroup(0, bindGroup25, new Uint32Array(869), 10, 0);
} catch {}
try {
renderPassEncoder43.setBindGroup(0, bindGroup51, []);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(5, buffer136, 0, 12_573);
} catch {}
try {
device0.queue.writeBuffer(buffer80, 1332, new Float32Array(4203), 312, 4);
} catch {}
document.body.prepend(canvas0);
try {
renderPassEncoder7.executeBundles([renderBundle7, renderBundle8, renderBundle12, renderBundle1]);
} catch {}
try {
buffer127.unmap();
} catch {}
document.body.prepend(img0);
let bindGroup102 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [{binding: 177, resource: textureView4}, {binding: 381, resource: textureView24}],
});
let commandEncoder225 = device0.createCommandEncoder({});
let textureView188 = texture15.createView({arrayLayerCount: 1});
let renderPassEncoder87 = commandEncoder225.beginRenderPass({
  colorAttachments: [{
  view: textureView162,
  clearValue: { r: 36.06, g: 318.1, b: 210.8, a: 455.7, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder54.setBindGroup(1, bindGroup80);
} catch {}
try {
renderPassEncoder38.setBlendConstant({ r: -685.3, g: -84.05, b: 578.4, a: -412.8, });
} catch {}
try {
renderPassEncoder60.setIndexBuffer(buffer37, 'uint32', 976, 3_331);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline3);
} catch {}
let promise27 = device0.queue.onSubmittedWorkDone();
try {
if (!arrayBuffer3.detached) { new Uint8Array(arrayBuffer3).fill(0x55); };
} catch {}
let textureView189 = texture144.createView({});
let externalTexture17 = device0.importExternalTexture({label: '\u{1faaa}\u0e28\u{1f829}\u8fa2\u{1ff15}', source: videoFrame7});
try {
computePassEncoder51.setBindGroup(0, bindGroup54);
} catch {}
try {
computePassEncoder81.setBindGroup(3, bindGroup76, new Uint32Array(4315), 235, 0);
} catch {}
try {
renderPassEncoder23.setBindGroup(2, bindGroup65, new Uint32Array(1361), 394, 0);
} catch {}
try {
renderPassEncoder24.setIndexBuffer(buffer81, 'uint32', 128, 605);
} catch {}
let videoFrame29 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'yCgCo', primaries: 'bt709', transfer: 'gamma22curve'} });
let commandEncoder226 = device0.createCommandEncoder({label: '\u0d0f\u8d56\u4f6c\u91b3\u08fe\u{1f74e}\ub460\u{1f9a0}\u95b5'});
let textureView190 = texture16.createView({});
try {
computePassEncoder111.setBindGroup(1, bindGroup77);
} catch {}
try {
computePassEncoder156.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder76.setBindGroup(2, bindGroup68);
} catch {}
try {
renderPassEncoder46.executeBundles([renderBundle4]);
} catch {}
try {
renderPassEncoder50.setPipeline(pipeline3);
} catch {}
document.body.append(canvas1);
let bindGroup103 = device0.createBindGroup({layout: bindGroupLayout18, entries: [{binding: 188, resource: sampler108}]});
let texture208 = device0.createTexture({
  size: {width: 2, height: 1, depthOrArrayLayers: 30},
  dimension: '2d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC,
});
let sampler149 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 94.47,
  lodMaxClamp: 96.26,
  maxAnisotropy: 17,
});
try {
computePassEncoder8.setBindGroup(0, bindGroup15, new Uint32Array(2144), 198, 0);
} catch {}
try {
renderPassEncoder78.setPipeline(pipeline2);
} catch {}
try {
commandEncoder226.clearBuffer(buffer0, 2136, 3576);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise26;
} catch {}
let bindGroup104 = device0.createBindGroup({
  label: '\u05c8\ua6f8\u9cbb\u0b86\u{1f707}\u{1f7ea}',
  layout: bindGroupLayout11,
  entries: [{binding: 31, resource: textureView157}],
});
let commandEncoder227 = device0.createCommandEncoder();
let sampler150 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 91.45,
  lodMaxClamp: 99.44,
});
try {
computePassEncoder81.setBindGroup(1, bindGroup15);
} catch {}
try {
computePassEncoder117.setBindGroup(0, bindGroup8, new Uint32Array(252), 3, 0);
} catch {}
try {
computePassEncoder157.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer89, 'uint32', 984, 294);
} catch {}
let arrayBuffer20 = buffer14.getMappedRange(7920, 0);
try {
commandEncoder227.copyBufferToTexture({
  /* bytesInLastRow: 4 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1025 */
  offset: 1025,
  bytesPerRow: 10752,
  buffer: buffer103,
}, {
  texture: texture34,
  mipLevel: 0,
  origin: {x: 2, y: 39, z: 0},
  aspect: 'all',
}, {width: 4, height: 34, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
document.body.append(img0);
let texture209 = device0.createTexture({
  size: {width: 8, height: 1, depthOrArrayLayers: 104},
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder32.setBindGroup(0, bindGroup84, new Uint32Array(550), 46, 0);
} catch {}
try {
renderPassEncoder65.setBindGroup(3, bindGroup52, new Uint32Array(2851), 1_000, 0);
} catch {}
try {
renderPassEncoder69.executeBundles([renderBundle3]);
} catch {}
try {
renderPassEncoder5.setPipeline(pipeline2);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
let arrayBuffer21 = buffer32.getMappedRange(920, 216);
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
document.body.append(canvas1);
let commandEncoder228 = device0.createCommandEncoder({});
let querySet17 = device0.createQuerySet({type: 'occlusion', count: 2622});
let renderPassEncoder88 = commandEncoder227.beginRenderPass({
  colorAttachments: [{
  view: textureView18,
  clearValue: { r: -629.1, g: 495.7, b: -953.2, a: -120.5, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder35.setBindGroup(1, bindGroup104);
} catch {}
try {
computePassEncoder25.setBindGroup(0, bindGroup99, new Uint32Array(2477), 41, 0);
} catch {}
try {
computePassEncoder159.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder36.executeBundles([renderBundle16, renderBundle16]);
} catch {}
try {
renderPassEncoder71.setViewport(113.07623172528773, 63.72232183079262, 63.164862696681006, 188.47032452199858, 0.7191174607943258, 0.9823012041087998);
} catch {}
try {
renderPassEncoder58.setVertexBuffer(3, buffer34, 0, 3_873);
} catch {}
try {
adapter0.label = '\ucf81\u47e8\u{1f742}\ub3a1\u0efd\u{1fe4b}\u7b14\u5d6b';
} catch {}
let buffer170 = device0.createBuffer({
  size: 3573,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
let sampler151 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  lodMinClamp: 71.76,
  lodMaxClamp: 73.49,
  compare: 'less-equal',
});
try {
computePassEncoder66.setBindGroup(0, bindGroup93);
} catch {}
try {
computePassEncoder153.setPipeline(pipeline1);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise27;
} catch {}
document.body.append(img3);
let commandEncoder229 = device0.createCommandEncoder({});
let textureView191 = texture182.createView({dimension: '2d-array'});
let texture210 = device0.createTexture({
  size: [8, 1, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder161 = commandEncoder226.beginComputePass({});
try {
computePassEncoder78.setBindGroup(2, bindGroup56);
} catch {}
try {
computePassEncoder100.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder154.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder45.setBindGroup(1, bindGroup45, new Uint32Array(961), 39, 0);
} catch {}
let shaderModule13 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

enable f16;

requires packed_4x8_integer_dot_product;

enable f16;

@group(0) @binding(185) var tex5: texture_1d<f32>;

fn unconst_bool(v: bool) -> bool { return v; }

alias vec3b = vec3<bool>;

var<workgroup> vw33: mat3x4h;

var<workgroup> vw35: atomic<u32>;

@group(0) @binding(67) var tex4: texture_cube<f32>;

var<private> vp18: mat4x2h = mat4x2h();

fn unconst_i32(v: i32) -> i32 { return v; }

var<workgroup> vw32: mat4x4h;

var<workgroup> vw36: S6;

fn fn0() -> array<S6, 3> {
  var out: array<S6, 3>;
  vp18 = mat4x2h(vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))], vp18[1][u32(unconst_u32(46))]);
  var vf187: vec2u = textureDimensions(tex4);
  var vf188: vec4f = unpack4x8unorm(bitcast<u32>(vp18[bitcast<u32>(vp18[1])]));
  out[2] = S6(bitcast<vec4i>(transpose(mat4x3f(unpack4x8unorm(u32(unconst_u32(190))).gaa, unpack4x8unorm(u32(unconst_u32(190))).rar, unpack4x8unorm(u32(unconst_u32(190))).bga, unpack4x8unorm(u32(unconst_u32(190))).aar))[0]).b);
  vf188 = vec4f(bitcast<f32>(vf187[vec4u(inverseSqrt(vp18[1].xxxx))[2]]));
  var vf189: vec4h = fma(vec4h(unconst_f16(-4846.7), unconst_f16(8275.0), unconst_f16(-339.4), unconst_f16(6809.4)), vec4h(f16(vf187[0])), vec4h(unconst_f16(4095.1), unconst_f16(5972.4), unconst_f16(50351.7), unconst_f16(354.8)));
  var vf190: vec2h = vp18[u32(unconst_u32(256))];
  out[u32(unconst_u32(272))].f0 += bitcast<i32>(normalize(vec2h(unconst_f16(5676.3), unconst_f16(3558.7))));
  let vf191: vec2h = vp18[u32(unconst_u32(153))];
  vf190 = vec2h(vf188.ga);
  var vf192: mat3x4f = transpose(mat4x3f(unconst_f32(0.05894), unconst_f32(0.1287), unconst_f32(0.4098), unconst_f32(0.04598), unconst_f32(0.02839), unconst_f32(0.1161), unconst_f32(-0.02147), unconst_f32(0.04018), unconst_f32(0.4974), unconst_f32(0.01173), unconst_f32(0.1053), unconst_f32(0.09018)));
  vp18 -= mat4x2h(vec2h(vf192[u32(unconst_u32(330))].zz), vec2h(vf192[u32(unconst_u32(330))].yy), vec2h(vf192[u32(unconst_u32(330))].yz), vec2h(vf192[u32(unconst_u32(330))].zw));
  vf190 = vec2h(vp18[1][0]);
  let vf193: vec4h = fma(vec4h(vp18[bitcast<u32>(normalize(vec2h(textureDimensions(tex4))))][u32(unconst_u32(49))]), vec4h(unconst_f16(16010.2), unconst_f16(4260.9), unconst_f16(693.6), unconst_f16(3744.0)), vec4h(f16(insertBits(i32(unconst_i32(197)), i32(unconst_i32(29)), u32(unconst_u32(204)), u32(unconst_u32(175))))));
  return out;
}

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

var<workgroup> vw34: S6;

struct T0 {
  @size(8) f0: array<u32>,
}

struct S6 {
  @location(7) @interpolate(flat) f0: i32,
}

fn unconst_f32(v: f32) -> f32 { return v; }

@vertex @must_use
fn vertex15(@location(2) @interpolate(flat) a0: f32, a1: S6) -> @builtin(position) vec4f {
  var out: vec4f;
  out += sin(vec3f(f32(vp18[u32(unconst_u32(72))][bitcast<u32>(vp18[2])]))).ggbb;
  let vf194: f32 = fract(f32(unconst_f32(0.5065)));
  out = vec4f(bitcast<f32>(a1.f0));
  var vf195 = fn0();
  var vf196 = fn0();
  var vf197 = fn0();
  vf197[u32(unconst_u32(64))].f0 = i32(pack2x16float(vec2f(firstLeadingBit(vec4u(unconst_u32(64), unconst_u32(14), unconst_u32(67), unconst_u32(143))).yz)));
  vf195[2] = S6(i32(vp18[bitcast<u32>(vp18[2])][u32(unconst_u32(0))]));
  vf196[2] = S6(i32(vp18[2][vec3u(sin(vec3f(unconst_f32(0.2211), unconst_f32(0.01915), unconst_f32(0.02285)))).x]));
  vf195[textureDimensions(tex4)[1]].f0 &= i32(textureNumLevels(tex4));
  let vf198: vec4h = inverseSqrt(vec4h(sin(vec3f(f32(vf196[2].f0))).bbbg));
  fn0();
  var vf199 = fn0();
  var vf200 = fn0();
  var vf201 = fn0();
  let ptr161: ptr<function, array<S6, 3>> = &vf196;
  return out;
}

@fragment
fn fragment16(@location(9) @interpolate(flat) a0: vec4u, @location(5) a1: vec2i, @location(8) @interpolate(flat, sample) a2: vec2h) -> @location(200) @interpolate(linear, sample) vec4f {
  var out: vec4f;
  let vf202: vec2h = radians(vec2h(unconst_f16(2100.9), unconst_f16(10556.9)));
  var vf203: u32 = a0[1];
  vp18 = mat4x2h(f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))), f16(pack4xI8Clamp(vec4i(i32(vp18[0][0])))));
  vp18 += mat4x2h(vec2h(saturate(vec3f(a0.zyx)).zz), vec2h(saturate(vec3f(a0.zyx)).gr), vec2h(saturate(vec3f(a0.zyx)).br), vec2h(saturate(vec3f(a0.zyx)).xy));
  return out;
}`,
  sourceMap: {},
  hints: {},
});
let computePassEncoder162 = commandEncoder229.beginComputePass({});
let renderPassEncoder89 = commandEncoder228.beginRenderPass({
  label: '\uc102\u04b2\uf3a2\uc1c8\u7c96\u{1f93e}\u{1f6f2}\u4212\u23f9',
  colorAttachments: [{
  view: textureView126,
  clearValue: { r: -882.9, g: 635.0, b: -891.2, a: 735.2, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet9,
  maxDrawCount: 404775653,
});
try {
computePassEncoder2.setBindGroup(1, bindGroup90);
} catch {}
try {
computePassEncoder161.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder43.setIndexBuffer(buffer125, 'uint16', 856, 42);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture169,
  mipLevel: 0,
  origin: {x: 86, y: 199, z: 0},
  aspect: 'all',
}, new Uint8Array(200).fill(56), /* required buffer size: 200 */
{offset: 200, bytesPerRow: 88}, {width: 6, height: 269, depthOrArrayLayers: 0});
} catch {}
document.body.append(canvas0);
let sampler152 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 43.29,
  lodMaxClamp: 61.18,
});
try {
computePassEncoder151.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder68.setBindGroup(3, bindGroup30, []);
} catch {}
try {
renderPassEncoder75.setBindGroup(0, bindGroup55, new Uint32Array(1882), 948, 0);
} catch {}
try {
device0.queue.writeBuffer(buffer111, 1004, new Int16Array(9923), 494, 1820);
} catch {}
await gc();
let bindGroup105 = device0.createBindGroup({
  layout: bindGroupLayout22,
  entries: [{binding: 62, resource: textureView176}, {binding: 91, resource: textureView185}],
});
let commandEncoder230 = device0.createCommandEncoder({});
let texture211 = device0.createTexture({
  label: '\u8435\u{1fccf}\u{1f67f}\u{1fed9}\u{1f75e}\u6fb0',
  size: {width: 384, height: 1824, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let texture212 = gpuCanvasContext3.getCurrentTexture();
try {
computePassEncoder162.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder10.executeBundles([renderBundle21]);
} catch {}
try {
renderPassEncoder54.setIndexBuffer(buffer50, 'uint16', 214, 1_452);
} catch {}
let arrayBuffer22 = buffer14.getMappedRange(9952, 680);
try {
buffer133.unmap();
} catch {}
try {
commandEncoder230.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 8232 */
  offset: 8232,
  bytesPerRow: 30208,
  buffer: buffer122,
}, {
  texture: texture8,
  mipLevel: 0,
  origin: {x: 4, y: 24, z: 0},
  aspect: 'all',
}, {width: 1, height: 36, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.submit([]);
} catch {}
document.body.prepend(img4);
let pipelineLayout20 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder231 = device0.createCommandEncoder({});
let textureView192 = texture155.createView({baseMipLevel: 0, mipLevelCount: 1});
try {
computePassEncoder102.setBindGroup(0, bindGroup60, []);
} catch {}
try {
computePassEncoder43.setBindGroup(0, bindGroup7, new Uint32Array(3726), 1_116, 0);
} catch {}
try {
renderPassEncoder47.setBindGroup(2, bindGroup32);
} catch {}
try {
device0.queue.writeBuffer(buffer82, 992, new Float32Array(5120), 86, 368);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture78,
  mipLevel: 1,
  origin: {x: 3, y: 44, z: 0},
  aspect: 'all',
}, new Uint8Array(160).fill(91), /* required buffer size: 160 */
{offset: 160, bytesPerRow: 573}, {width: 67, height: 50, depthOrArrayLayers: 0});
} catch {}
let buffer171 = device0.createBuffer({label: '\u{1fe0b}\u7667\ua2f7\u{1fa4f}\u7a67\ub0d1', size: 19269, usage: GPUBufferUsage.MAP_READ});
let commandEncoder232 = device0.createCommandEncoder({});
let texture213 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  dimension: '2d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC,
});
let computePassEncoder163 = commandEncoder232.beginComputePass({});
let sampler153 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  lodMinClamp: 58.24,
  lodMaxClamp: 73.30,
  maxAnisotropy: 1,
});
try {
computePassEncoder154.setBindGroup(2, bindGroup70, []);
} catch {}
try {
computePassEncoder143.setBindGroup(3, bindGroup61, new Uint32Array(1722), 34, 0);
} catch {}
try {
renderPassEncoder65.setBindGroup(1, bindGroup22);
} catch {}
try {
renderPassEncoder35.setBlendConstant({ r: -951.7, g: 246.1, b: -895.1, a: 235.3, });
} catch {}
try {
commandEncoder231.copyTextureToTexture({
  texture: texture77,
  mipLevel: 1,
  origin: {x: 3, y: 2, z: 0},
  aspect: 'all',
},
{
  texture: texture122,
  mipLevel: 0,
  origin: {x: 27, y: 0, z: 0},
  aspect: 'all',
},
{width: 18, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup106 = device0.createBindGroup({
  layout: bindGroupLayout19,
  entries: [{binding: 721, resource: {buffer: buffer145, offset: 1792, size: 112}}],
});
let commandEncoder233 = device0.createCommandEncoder();
let texture214 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  mipLevelCount: 3,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST,
});
let computePassEncoder164 = commandEncoder230.beginComputePass({label: '\u{1fb69}\ube58\u030e'});
let renderPassEncoder90 = commandEncoder233.beginRenderPass({
  colorAttachments: [{
  view: textureView74,
  clearValue: { r: 192.2, g: -476.5, b: 81.84, a: -560.9, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let arrayBuffer23 = buffer14.getMappedRange(7896, 0);
try {
buffer135.unmap();
} catch {}
try {
gpuCanvasContext7.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
let img5 = await imageWithData(58, 21, '#10101010', '#20202020');
let commandEncoder234 = device0.createCommandEncoder();
let texture215 = device0.createTexture({
  label: '\u{1f8d7}\u2ab5\uec56\u0c04\ub77f\u{1ff86}\u0bc3\uc639\ucc27',
  size: {width: 2, height: 1, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder165 = commandEncoder234.beginComputePass();
try {
renderPassEncoder62.setBindGroup(1, bindGroup68);
} catch {}
try {
renderPassEncoder29.setIndexBuffer(buffer153, 'uint32', 684, 747);
} catch {}
try {
commandEncoder231.clearBuffer(buffer23, 2700, 220);
} catch {}
try {
computePassEncoder53.insertDebugMarker('\u{1f7db}');
} catch {}
try {
gpuCanvasContext12.unconfigure();
} catch {}
let imageData34 = new ImageData(24, 76);
let renderPassEncoder91 = commandEncoder231.beginRenderPass({
  label: '\u93f3\u0fdc\u7e08\u19f3\u{1fea0}\u{1fc72}\u{1f9ed}\u{1f873}\u16ef\u2588',
  colorAttachments: [{view: textureView47, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet17,
});
let sampler154 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 22.97,
  lodMaxClamp: 78.02,
  maxAnisotropy: 2,
});
try {
computePassEncoder157.setBindGroup(2, bindGroup97);
} catch {}
try {
computePassEncoder149.setBindGroup(1, bindGroup104, new Uint32Array(1572), 41, 0);
} catch {}
try {
computePassEncoder163.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder43.executeBundles([renderBundle20]);
} catch {}
try {
if (!arrayBuffer14.detached) { new Uint8Array(arrayBuffer14).fill(0x55); };
} catch {}
let commandEncoder235 = device0.createCommandEncoder({});
let texture216 = device0.createTexture({
  label: '\u{1f6b4}\u60ce\ucaf6\u01db\u4380\u02b4\ud051\u033c\u073a',
  size: [192, 912, 1],
  format: 'rgb9e5ufloat',
  usage: GPUTextureUsage.COPY_DST,
});
let sampler155 = device0.createSampler({addressModeU: 'mirror-repeat', addressModeV: 'repeat', mipmapFilter: 'nearest', lodMaxClamp: 68.19});
try {
renderPassEncoder74.setBindGroup(1, bindGroup70, new Uint32Array(2965), 227, 0);
} catch {}
try {
renderPassEncoder0.setPipeline(pipeline2);
} catch {}
let commandEncoder236 = device0.createCommandEncoder({});
let renderPassEncoder92 = commandEncoder235.beginRenderPass({
  colorAttachments: [{
  view: textureView122,
  depthSlice: 33,
  clearValue: { r: 658.3, g: -259.3, b: -205.2, a: 291.0, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 43476533,
});
let renderBundleEncoder23 = device0.createRenderBundleEncoder({label: '\u2411\u3f27', colorFormats: ['rgb10a2uint'], depthReadOnly: true});
let renderBundle23 = renderBundleEncoder23.finish();
try {
computePassEncoder99.setBindGroup(1, bindGroup55, new Uint32Array(3619), 291, 0);
} catch {}
try {
renderPassEncoder44.setIndexBuffer(buffer71, 'uint32', 80, 277);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture36,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(205).fill(169), /* required buffer size: 205 */
{offset: 205}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let imageData35 = new ImageData(44, 8);
let commandEncoder237 = device0.createCommandEncoder();
let texture217 = device0.createTexture({
  size: {width: 48, height: 228, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder117.setBindGroup(3, bindGroup102, new Uint32Array(28), 0, 0);
} catch {}
try {
computePassEncoder155.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder92.setBindGroup(1, bindGroup92);
} catch {}
try {
renderPassEncoder76.setVertexBuffer(7, buffer65, 0, 815);
} catch {}
await gc();
let bindGroup107 = device0.createBindGroup({
  label: '\u1c4c\u8cc9\u38af\u95ca',
  layout: bindGroupLayout18,
  entries: [{binding: 188, resource: sampler17}],
});
let buffer172 = device0.createBuffer({
  size: 13770,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let computePassEncoder166 = commandEncoder237.beginComputePass({});
let renderPassEncoder93 = commandEncoder236.beginRenderPass({
  colorAttachments: [{
  view: textureView163,
  clearValue: { r: 830.1, g: 548.6, b: 886.0, a: 754.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder79.setBindGroup(3, bindGroup93, new Uint32Array(220), 124, 0);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
try {
computePassEncoder164.setBindGroup(0, bindGroup64, []);
} catch {}
try {
computePassEncoder164.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder31.setBindGroup(2, bindGroup106, new Uint32Array(1199), 10, 0);
} catch {}
try {
renderPassEncoder70.setVertexBuffer(7, undefined);
} catch {}
try {
device0.queue.writeBuffer(buffer159, 2296, new DataView(new ArrayBuffer(8130)), 838, 564);
} catch {}
try {
commandEncoder4.label = '\ua422\ua34d\uda4b\u05d5\ueeb4';
} catch {}
try {
computePassEncoder89.setBindGroup(2, bindGroup90, new Uint32Array(1672), 687, 0);
} catch {}
try {
renderPassEncoder74.setBindGroup(3, bindGroup91, new Uint32Array(523), 72, 0);
} catch {}
try {
renderPassEncoder84.setVertexBuffer(0, buffer110, 12);
} catch {}
let buffer173 = device0.createBuffer({
  size: 1352,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder238 = device0.createCommandEncoder({});
let computePassEncoder167 = commandEncoder238.beginComputePass({});
let sampler156 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 77.02,
  lodMaxClamp: 81.51,
});
try {
renderPassEncoder20.beginOcclusionQuery(434);
} catch {}
try {
renderPassEncoder73.executeBundles([renderBundle3]);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(6, buffer113, 0, 9_408);
} catch {}
let commandEncoder239 = device0.createCommandEncoder({});
let texture218 = device0.createTexture({
  label: '\u5f98\u5200\u09ab\u0708\u{1feac}\u0954\u0521\u8827\u5091',
  size: {width: 96},
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder168 = commandEncoder239.beginComputePass({});
try {
computePassEncoder32.setBindGroup(3, bindGroup86);
} catch {}
try {
computePassEncoder166.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder13.setBindGroup(0, bindGroup11);
} catch {}
try {
renderPassEncoder82.setViewport(75.07668531267848, 104.51509284193824, 1.4237906518204395, 252.80945901190964, 0.5490664872641159, 0.6710678229510778);
} catch {}
try {
renderPassEncoder85.setVertexBuffer(6, buffer23, 0);
} catch {}
let arrayBuffer24 = buffer32.getMappedRange(80, 28);
let bindGroup108 = device0.createBindGroup({layout: bindGroupLayout11, entries: [{binding: 31, resource: textureView172}]});
let sampler157 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 73.53,
});
try {
computePassEncoder147.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder81.setPipeline(pipeline2);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
gpuCanvasContext9.unconfigure();
} catch {}
let textureView193 = texture57.createView({dimension: '2d-array'});
try {
computePassEncoder160.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder20.endOcclusionQuery();
} catch {}
let pipeline5 = await device0.createRenderPipelineAsync({
  layout: pipelineLayout0,
  fragment: {
  module: shaderModule8,
  entryPoint: 'fragment7',
  constants: {52_878: 0},
  targets: [{
  format: 'rgb10a2uint',
  writeMask: GPUColorWrite.ALL | GPUColorWrite.ALPHA | GPUColorWrite.GREEN | GPUColorWrite.RED,
}],
},
  vertex: {
    module: shaderModule0,
    entryPoint: 'vertex2',
    buffers: [
      {
        arrayStride: 412,
        stepMode: 'vertex',
        attributes: [
          {format: 'sint32x3', offset: 32, shaderLocation: 10},
          {format: 'float16x2', offset: 4, shaderLocation: 3},
        ],
      },
    ],
  },
});
document.body.prepend(img2);
let commandEncoder240 = device0.createCommandEncoder({});
let computePassEncoder169 = commandEncoder240.beginComputePass();
try {
computePassEncoder89.setBindGroup(0, bindGroup25);
} catch {}
try {
computePassEncoder5.setBindGroup(0, bindGroup28, new Uint32Array(453), 53, 0);
} catch {}
try {
renderPassEncoder81.setBindGroup(1, bindGroup52);
} catch {}
try {
renderPassEncoder70.end();
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer12, 'uint16', 694, 1_411);
} catch {}
let commandEncoder241 = device0.createCommandEncoder({});
let querySet18 = device0.createQuerySet({type: 'occlusion', count: 474});
let renderBundleEncoder24 = device0.createRenderBundleEncoder({colorFormats: ['rgb10a2uint'], stencilReadOnly: true});
try {
computePassEncoder62.setBindGroup(1, bindGroup65);
} catch {}
try {
computePassEncoder165.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setBindGroup(1, bindGroup63);
} catch {}
try {
renderPassEncoder61.setBindGroup(0, bindGroup83, new Uint32Array(41), 4, 0);
} catch {}
try {
renderPassEncoder53.executeBundles([renderBundle23, renderBundle5]);
} catch {}
try {
renderPassEncoder60.setVertexBuffer(0, buffer109);
} catch {}
try {
renderBundleEncoder24.setIndexBuffer(buffer9, 'uint16', 142, 991);
} catch {}
try {
renderBundleEncoder24.setPipeline(pipeline5);
} catch {}
try {
renderBundleEncoder24.setVertexBuffer(4, buffer105);
} catch {}
try {
commandEncoder172.resolveQuerySet(querySet7, 0, 29, buffer155, 0);
} catch {}
let imageData36 = new ImageData(52, 48);
let videoFrame30 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'fcc', primaries: 'bt2020', transfer: 'hlg'} });
let renderPassEncoder94 = commandEncoder241.beginRenderPass({
  colorAttachments: [{
  view: textureView104,
  clearValue: { r: 793.4, g: -693.5, b: 96.24, a: 355.3, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let externalTexture18 = device0.importExternalTexture({source: videoFrame9});
try {
computePassEncoder90.setBindGroup(0, bindGroup49, new Uint32Array(1144), 24, 0);
} catch {}
try {
renderPassEncoder7.setBindGroup(1, bindGroup96);
} catch {}
try {
renderPassEncoder47.setScissorRect(5, 30, 24, 208);
} catch {}
try {
renderPassEncoder24.setVertexBuffer(3, buffer40, 2_836);
} catch {}
try {
renderBundleEncoder24.setBindGroup(1, bindGroup21, new Uint32Array(71), 20, 0);
} catch {}
try {
renderBundleEncoder24.setPipeline(pipeline5);
} catch {}
try {
commandEncoder172.copyTextureToBuffer({
  texture: texture25,
  mipLevel: 0,
  origin: {x: 8, y: 71, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 24 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1592 */
  offset: 1592,
  bytesPerRow: 4096,
  rowsPerImage: 112,
  buffer: buffer94,
}, {width: 3, height: 22, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer69, 136, new Float32Array(18469), 3006, 16);
} catch {}
let buffer174 = device0.createBuffer({
  size: 11759,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let computePassEncoder170 = commandEncoder172.beginComputePass({});
try {
computePassEncoder161.setBindGroup(0, bindGroup61);
} catch {}
try {
renderPassEncoder73.executeBundles([renderBundle23, renderBundle16]);
} catch {}
try {
renderBundleEncoder24.setIndexBuffer(buffer156, 'uint16', 760, 85);
} catch {}
try {
renderBundleEncoder24.setVertexBuffer(5, buffer42, 0, 1_414);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 256, height: 256, depthOrArrayLayers: 17}
*/
{
  source: imageData28,
  origin: { x: 6, y: 0 },
  flipY: false,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 1, y: 113, z: 3},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 7, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder69.setBindGroup(1, bindGroup100, []);
} catch {}
try {
computePassEncoder169.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder57.setPipeline(pipeline5);
} catch {}
try {
renderBundleEncoder24.setIndexBuffer(buffer12, 'uint32', 1_024, 80);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame25,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture40,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer21.detached) { new Uint8Array(arrayBuffer21).fill(0x55); };
} catch {}
let commandEncoder242 = device0.createCommandEncoder();
let texture219 = device0.createTexture({size: [48], dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.TEXTURE_BINDING});
let textureView194 = texture14.createView({
  label: '\uf412\u{1f9aa}\ufe84\ud98e\u3ce6\u{1f675}\uc6f4\u00cf\u0330\u369f\u61fa',
  dimension: '2d',
  mipLevelCount: 1,
});
let renderPassEncoder95 = commandEncoder242.beginRenderPass({
  label: '\u{1fbb6}\ue1f8\u{1f830}\u037a\uc94a\u7198\u4e77\u{1fbc2}\u2b4a\u04a3\u08a7',
  colorAttachments: [{view: textureView77, loadOp: 'load', storeOp: 'store'}],
});
try {
renderPassEncoder3.setBindGroup(2, bindGroup24);
} catch {}
try {
renderPassEncoder73.setBindGroup(0, bindGroup24, new Uint32Array(640), 16, 0);
} catch {}
try {
renderPassEncoder5.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(1, buffer131, 0);
} catch {}
try {
renderBundleEncoder24.setPipeline(pipeline5);
} catch {}
videoFrame0.close();
videoFrame2.close();
videoFrame3.close();
videoFrame4.close();
videoFrame5.close();
videoFrame6.close();
videoFrame7.close();
videoFrame8.close();
videoFrame9.close();
videoFrame10.close();
videoFrame11.close();
videoFrame12.close();
videoFrame13.close();
videoFrame14.close();
videoFrame15.close();
videoFrame16.close();
videoFrame17.close();
videoFrame18.close();
videoFrame19.close();
videoFrame20.close();
videoFrame21.close();
videoFrame22.close();
videoFrame23.close();
videoFrame24.close();
videoFrame25.close();
videoFrame26.close();
videoFrame27.close();
videoFrame28.close();
videoFrame29.close();
videoFrame30.close();
}
async function window1() {
let adapter0 = await navigator.gpu.requestAdapter({});
let device0 = await adapter0.requestDevice({
  defaultQueue: {},
  requiredFeatures: [
    'depth-clip-control',
    'depth32float-stencil8',
    'texture-compression-etc2',
    'texture-compression-astc',
    'shader-f16',
    'rg11b10ufloat-renderable',
    'bgra8unorm-storage',
  ],
  requiredLimits: {
    maxStorageTexturesPerShaderStage: 4,
    maxUniformBufferBindingSize: 13198458,
    maxStorageBufferBindingSize: 193772507,
  },
});
try {
globalThis.someLabel = device0.queue.label;
} catch {}
let texture0 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 7},
  format: 'rg8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let renderBundleEncoder0 = device0.createRenderBundleEncoder({colorFormats: ['r8sint']});
let renderBundle0 = renderBundleEncoder0.finish({label: '\u0e10\u0e59\u{1f9b1}\u6510\u{1f9fe}\u0b03\uea1b\u0efb'});
let promise0 = device0.queue.onSubmittedWorkDone();
let img0 = await imageWithData(38, 1, '#10101010', '#20202020');
let imageData0 = new ImageData(16, 84);
let textureView0 = texture0.createView({dimension: '2d', baseArrayLayer: 1});
let sampler0 = device0.createSampler({
  label: '\uc8df\ufc18\u7b12',
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 75.47,
});
let commandEncoder0 = device0.createCommandEncoder();
let textureView1 = texture0.createView({label: '\u0b80\u4421\u78c6\u9058\u2ce6\u0748', dimension: '2d', baseArrayLayer: 1});
let computePassEncoder0 = commandEncoder0.beginComputePass({});
let commandEncoder1 = device0.createCommandEncoder({});
let textureView2 = texture0.createView({aspect: 'all', mipLevelCount: 1, baseArrayLayer: 1, arrayLayerCount: 1});
let sampler1 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 22.91,
  lodMaxClamp: 35.70,
  compare: 'greater-equal',
});
let buffer0 = device0.createBuffer({size: 2108, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder2 = device0.createCommandEncoder({});
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let commandEncoder3 = device0.createCommandEncoder({label: '\u735f\u0a24\ud526\u0781\u408b\u{1ff90}\u01a6\u0cfb\u{1ffb9}\ue489'});
let texture1 = device0.createTexture({
  label: '\u440f\u{1fd01}\uab0c\u{1fc99}\u544a\u{1fc11}\u{1fc5c}\ub1f8\uf284\u9636\u{1fef7}',
  size: {width: 3960, height: 1, depthOrArrayLayers: 10},
  mipLevelCount: 2,
  sampleCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder1 = commandEncoder2.beginComputePass({label: '\u{1fb0e}\u846f\u07d2\u9df4\u{1fd77}\u{1f77a}\uaae2\u22b8\u{1f953}\u{1fa7f}'});
let imageData1 = new ImageData(24, 8);
let buffer1 = device0.createBuffer({size: 10657, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let computePassEncoder2 = commandEncoder1.beginComputePass({});
try {
commandEncoder3.copyTextureToTexture({
  texture: texture1,
  mipLevel: 0,
  origin: {x: 44, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture1,
  mipLevel: 1,
  origin: {x: 286, y: 0, z: 0},
  aspect: 'all',
},
{width: 179, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer0, 52, new Float32Array(2978), 2551);
} catch {}
try {
adapter0.label = '\uba71\u6504\u93fb\u0f6a\u{1fbdc}\u02e9\ua35f';
} catch {}
let buffer2 = device0.createBuffer({
  size: 13680,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder4 = device0.createCommandEncoder({label: '\ue650\u671f\u{1fd29}\u0215'});
let textureView3 = texture0.createView({dimension: '2d', baseArrayLayer: 1});
document.body.prepend(img0);
let bindGroupLayout0 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 48,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '2d-array' },
    },
    {binding: 182, visibility: GPUShaderStage.COMPUTE, sampler: { type: 'non-filtering' }},
  ],
});
let pipelineLayout0 = device0.createPipelineLayout({label: '\udd3a\u{1f841}\u6162\u5114', bindGroupLayouts: [bindGroupLayout0]});
let texture2 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 154},
  format: 'r32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler2 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 54.15,
  lodMaxClamp: 85.85,
  maxAnisotropy: 7,
});
let textureView4 = texture2.createView({baseMipLevel: 0, baseArrayLayer: 43, arrayLayerCount: 6});
try {
buffer1.unmap();
} catch {}
try {
commandEncoder4.copyTextureToTexture({
  texture: texture1,
  mipLevel: 1,
  origin: {x: 26, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture1,
  mipLevel: 0,
  origin: {x: 188, y: 0, z: 0},
  aspect: 'all',
},
{width: 12, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer3 = device0.createBuffer({
  label: '\u75ac\ubfde\u9e3c\u0e02\uc0a5\u5397\u09d4\u0075',
  size: 9403,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
});
let commandEncoder5 = device0.createCommandEncoder();
let renderBundleEncoder1 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true, stencilReadOnly: true});
try {
commandEncoder3.clearBuffer(buffer0);
} catch {}
try {
device0.queue.submit([]);
} catch {}
let commandEncoder6 = device0.createCommandEncoder({});
let computePassEncoder3 = commandEncoder6.beginComputePass({label: '\u066d\ufd1b'});
let sampler3 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 55.78,
  lodMaxClamp: 98.85,
  compare: 'less',
  maxAnisotropy: 3,
});
try {
renderBundleEncoder1.setIndexBuffer(buffer2, 'uint32', 2_856, 1_164);
} catch {}
try {
  await promise0;
} catch {}
let texture3 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 9},
  mipLevelCount: 6,
  dimension: '2d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
  viewFormats: [],
});
try {
renderBundleEncoder1.setIndexBuffer(buffer2, 'uint32', 2_812, 5_659);
} catch {}
try {
commandEncoder3.copyBufferToTexture({
  /* bytesInLastRow: 4 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 2900 */
  offset: 2900,
  bytesPerRow: 12032,
  buffer: buffer1,
}, {
  texture: texture0,
  mipLevel: 0,
  origin: {x: 342, y: 0, z: 1},
  aspect: 'all',
}, {width: 2, height: 2, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder5.copyTextureToTexture({
  texture: texture1,
  mipLevel: 0,
  origin: {x: 1767, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture1,
  mipLevel: 0,
  origin: {x: 510, y: 0, z: 0},
  aspect: 'all',
},
{width: 619, height: 0, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout1 = device0.createPipelineLayout({label: '\u{1fb62}\u1858\u15dd\uac55\u8118\u{1fae4}', bindGroupLayouts: []});
let commandEncoder7 = device0.createCommandEncoder({});
let textureView5 = texture1.createView({dimension: '2d', mipLevelCount: 1});
let renderPassEncoder0 = commandEncoder4.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 957.3, g: -966.0, b: 944.3, a: -550.2, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
renderBundleEncoder1.setIndexBuffer(buffer2, 'uint32', 548, 3_979);
} catch {}
let buffer4 = device0.createBuffer({
  size: 18833,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let computePassEncoder4 = commandEncoder7.beginComputePass({});
let renderPassEncoder1 = commandEncoder3.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 970.1, g: 369.1, b: -662.1, a: 189.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 101240267,
});
try {
renderBundleEncoder1.setIndexBuffer(buffer2, 'uint16', 3_656, 4_702);
} catch {}
try {
commandEncoder5.copyTextureToBuffer({
  texture: texture1,
  mipLevel: 0,
  origin: {x: 169, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 867 widthInBlocks: 867 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 692 */
  offset: 692,
  bytesPerRow: 26880,
  buffer: buffer0,
}, {width: 867, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer4, 1496, new Int16Array(5398), 2797, 220);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let imageData2 = new ImageData(16, 16);
let bindGroupLayout1 = device0.createBindGroupLayout({
  label: '\u019d\u{1f9b1}\u{1fdb7}\u0ac5\ufb56\u80e5\ufa52',
  entries: [
    {
      binding: 21,
      visibility: GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'float', multisampled: false },
    },
    {
      binding: 227,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
    {
      binding: 7,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'uint', multisampled: false },
    },
  ],
});
let pipelineLayout2 = device0.createPipelineLayout({label: '\ubdc8\u{1fc57}\uc0bb\u{1f79c}\u1f66\u05d5\ub557', bindGroupLayouts: []});
let buffer5 = device0.createBuffer({
  size: 4513,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture4 = device0.createTexture({
  label: '\u{1f7ed}\u2c9b\u{1fa47}\u{1fcd4}\u{1ffc5}',
  size: {width: 1980, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 5,
  dimension: '2d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView6 = texture0.createView({dimension: '2d', baseArrayLayer: 1});
let bindGroupLayout2 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 276,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'bgra8unorm', access: 'write-only', viewDimension: '1d' },
    },
    {
      binding: 50,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: 'cube', sampleType: 'float', multisampled: false },
    },
  ],
});
let texture5 = device0.createTexture({
  size: {width: 3960, height: 1, depthOrArrayLayers: 37},
  mipLevelCount: 3,
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderBundle1 = renderBundleEncoder1.finish();
try {
renderPassEncoder1.executeBundles([renderBundle0]);
} catch {}
let buffer6 = device0.createBuffer({size: 8342, usage: GPUBufferUsage.INDIRECT});
let texture6 = device0.createTexture({
  size: [380],
  mipLevelCount: 1,
  dimension: '1d',
  format: 'bgra8unorm',
  usage: GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture7 = device0.createTexture({
  size: [95, 1, 1],
  sampleCount: 1,
  dimension: '2d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let buffer7 = device0.createBuffer({
  size: 1480,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM,
});
let texture8 = device0.createTexture({
  size: [1980, 1, 42],
  mipLevelCount: 5,
  format: 'rg32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView7 = texture4.createView({format: 'rgb10a2uint', mipLevelCount: 2});
try {
renderPassEncoder0.setIndexBuffer(buffer7, 'uint16', 124, 198);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(2, undefined);
} catch {}
try {
buffer1.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture2,
  mipLevel: 0,
  origin: {x: 56, y: 0, z: 55},
  aspect: 'all',
}, new Uint8Array(41).fill(151), /* required buffer size: 41 */
{offset: 41}, {width: 19, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.prepend(img0);
let bindGroupLayout3 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 433,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'sint', multisampled: true },
    },
  ],
});
let textureView8 = texture6.createView({});
let computePassEncoder5 = commandEncoder5.beginComputePass({});
try {
renderPassEncoder1.setScissorRect(190, 0, 56, 0);
} catch {}
try {
renderPassEncoder0.setStencilReference(557);
} catch {}
try {
buffer0.unmap();
} catch {}
let bindGroupLayout4 = device0.createBindGroupLayout({
  label: '\u0db2\ufce1\u01ca\uf392\u7c89\u566e\u4f81\u5728\u3e4e\u47d7\u0d20',
  entries: [
    {
      binding: 7,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'uniform', minBindingSize: 206, hasDynamicOffset: false },
    },
    {
      binding: 171,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'rgba8sint', access: 'read-only', viewDimension: '3d' },
    },
    {
      binding: 569,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'rgba16float', access: 'write-only', viewDimension: '3d' },
    },
  ],
});
let texture9 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 1},
  sampleCount: 4,
  format: 'rgba16sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder0.executeBundles([renderBundle0]);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4_294_967_295, undefined, 749_671_477);
} catch {}
let videoFrame0 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'rgb', primaries: 'smpte170m', transfer: 'logSqrt'} });
let commandEncoder8 = device0.createCommandEncoder({});
let texture10 = device0.createTexture({
  label: '\u04ab\u8a02\u0073\ufe4a\u{1fbf7}\u291a\u{1ffe9}\ubd4f\u7295\u{1fa99}\ua481',
  size: {width: 990, height: 1, depthOrArrayLayers: 159},
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView9 = texture9.createView({baseMipLevel: 0});
let renderBundleEncoder2 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true});
let renderBundle2 = renderBundleEncoder2.finish({});
try {
  await buffer1.mapAsync(GPUMapMode.WRITE, 0, 16);
} catch {}
try {
commandEncoder8.copyTextureToBuffer({
  texture: texture5,
  mipLevel: 0,
  origin: {x: 504, y: 0, z: 1},
  aspect: 'all',
}, {
  /* bytesInLastRow: 10368 widthInBlocks: 2592 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 184 */
  offset: 184,
  bytesPerRow: 50176,
  rowsPerImage: 413,
  buffer: buffer2,
}, {width: 2592, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer8 = device0.createBuffer({
  size: 11565,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture11 = device0.createTexture({
  size: [95, 1, 27],
  dimension: '3d',
  format: 'rgba8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView10 = texture1.createView({label: '\u0cd5\u0030\u{1fb6d}\u0f9c', dimension: '2d', mipLevelCount: 1});
try {
renderPassEncoder0.setStencilReference(154);
} catch {}
try {
commandEncoder8.copyBufferToTexture({
  /* bytesInLastRow: 144 widthInBlocks: 36 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 348 */
  offset: 348,
  bytesPerRow: 1280,
  buffer: buffer7,
}, {
  texture: texture4,
  mipLevel: 4,
  origin: {x: 22, y: 0, z: 0},
  aspect: 'all',
}, {width: 36, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture12 = device0.createTexture({
  size: {width: 1775, height: 36, depthOrArrayLayers: 1},
  format: 'astc-5x4-unorm-srgb',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture13 = device0.createTexture({
  size: [95, 1, 25],
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder6 = commandEncoder8.beginComputePass({});
try {
renderPassEncoder1.setIndexBuffer(buffer5, 'uint32', 36, 696);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(1, buffer8, 0, 627);
} catch {}
try {
adapter0.label = '\u4110\u{1fcee}\u6524\u58ed\u{1fa8a}';
} catch {}
let commandEncoder9 = device0.createCommandEncoder({});
let texture14 = device0.createTexture({
  label: '\udd9d\u217d\u20a4\uc594\u397f\u{1fd03}\u{1fa35}\u{1fe7b}\u{1fe29}',
  size: [190, 2, 55],
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderPassEncoder2 = commandEncoder9.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 742.9, g: 986.5, b: 937.0, a: 362.6, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let sampler4 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 29.92,
  lodMaxClamp: 72.96,
});
try {
renderPassEncoder2.setStencilReference(1621);
} catch {}
let shaderModule0 = device0.createShaderModule({
  code: `
requires readonly_and_readwrite_storage_textures;

enable f16;

requires unrestricted_pointer_parameters;

fn unconst_f32(v: f32) -> f32 { return v; }

fn fn0() -> T0 {
  var out: T0;
  out.f0 = bitcast<f32>(sqrt(vec2h(unconst_f16(16432.1), unconst_f16(2730.5))));
  var vf0: vec3f = min(vec3f(unconst_f32(0.4877), unconst_f32(0.04853), unconst_f32(0.2330)), vec3f(unconst_f32(0.1109), unconst_f32(0.01187), unconst_f32(0.6341)));
  let vf1: i32 = dot4I8Packed(u32(unconst_u32(174)), bitcast<u32>(sqrt(bitcast<vec2h>(length(vec4f(unconst_f32(-0.03183), unconst_f32(-0.05019), unconst_f32(-0.1062), unconst_f32(0.07820)))))));
  out = T0(bitcast<f32>(pack4xU8Clamp(vec4u(unconst_u32(812), unconst_u32(146), unconst_u32(121), unconst_u32(29)))));
  out.f0 = f32(pack4xU8Clamp(vec4u(unconst_u32(285), unconst_u32(109), unconst_u32(37), unconst_u32(157))));
  out = T0(f32(vf1));
  out.f0 *= vf0[u32(unconst_u32(115))];
  out.f0 -= vf0[u32(unconst_u32(310))];
  out.f0 = step(step(vec4f(unconst_f32(0.3643), unconst_f32(0.02008), unconst_f32(0.07407), unconst_f32(0.3378)), degrees(unpack4x8snorm(pack4xU8Clamp(vec4u(mix(vec4h(unconst_f16(11435.0), unconst_f16(21287.1), unconst_f16(-1865.4), unconst_f16(11195.4)), vec4h(unconst_f16(3897.1), unconst_f16(-12934.7), unconst_f16(6547.7), unconst_f16(16202.9)), vec4h(unconst_f16(15766.2), unconst_f16(29401.5), unconst_f16(4205.6), unconst_f16(6289.3)))))))), vec4f(unconst_f32(0.07197), unconst_f32(0.2344), unconst_f32(0.2137), unconst_f32(0.00168))).y;
  var vf2: vec2h = sqrt(vec2h(unconst_f16(-4055.5), unconst_f16(952.0)));
  var vf3: u32 = pack4xU8(vec4u(unconst_u32(126), unconst_u32(65), unconst_u32(53), unconst_u32(288)));
  let ptr0: ptr<function, vec3f> = &vf0;
  out.f0 = bitcast<f32>(dot4I8Packed(u32(unconst_u32(272)), u32(unconst_u32(151))));
  var vf4: f32 = vf0[u32(unconst_u32(133))];
  let vf5: f32 = length(vec4f(f32(vf1)));
  return out;
}

struct T0 {
  @size(16) f0: f32,
}

struct VertexOutput0 {
  @location(13) @interpolate(flat, sample) f0: vec2i,
  @builtin(position) f1: vec4f,
}

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(48) var st0: texture_storage_2d_array<r32float, read_write>;

var<workgroup> vw1: FragmentOutput0;

fn unconst_i32(v: i32) -> i32 { return v; }

alias vec3b = vec3<bool>;

@group(0) @binding(182) var sam0: sampler;

struct FragmentOutput0 {
  @location(0) @interpolate(flat, centroid) f0: vec2i,
  @location(3) f1: vec4i,
}

var<workgroup> vw0: array<mat2x4h, 1>;

@vertex
fn vertex0() -> @builtin(position) vec4f {
  var out: vec4f;
  out = bitcast<vec4f>(countOneBits(vec2i(unconst_i32(68), unconst_i32(48))).xxxy);
  fn0();
  var vf6 = fn0();
  var vf7 = fn0();
  fn0();
  let ptr1: ptr<function, T0> = &vf6;
  let ptr2: ptr<function, f32> = &vf6.f0;
  fn0();
  let vf8: f16 = floor(f16(unconst_f16(9242.3)));
  vf6 = T0(f32(vf8));
  vf6.f0 -= (*ptr1).f0;
  return out;
}

@vertex
fn vertex1(@location(0) a0: vec2h) -> @builtin(position) vec4f {
  var out: vec4f;
  var vf9: vec3f = radians(radians(vec3f(f32(any(vec2<bool>(tan(vec2h(unpack4x8unorm(u32(pow(f16(unconst_f16(6494.8)), clamp(vec2h(unconst_f16(28103.7), unconst_f16(2658.3)), vec2h(length(vec4h(unconst_f16(26855.4), unconst_f16(1983.0), unconst_f16(11804.5), unconst_f16(32423.9)))), vec2h(unconst_f16(7308.8), unconst_f16(8050.7)))[0]))).xz))))))));
  return out;
}

@vertex
fn vertex2() -> VertexOutput0 {
  var out: VertexOutput0;
  var vf10: vec4f = unpack4x8snorm(u32(unconst_u32(401)));
  fn0();
  fn0();
  out.f0 += bitcast<vec2i>(atanh(vec4h(unconst_f16(3548.4), unconst_f16(-18805.1), unconst_f16(3665.8), unconst_f16(12478.4))));
  let vf11: f16 = atanh(f16(unconst_f16(51528.5)));
  fn0();
  fn0();
  vf10 = vec4f(fract(f32(unconst_f32(0.1192))));
  fn0();
  return out;
}

@fragment
fn fragment0() -> FragmentOutput0 {
  var out: FragmentOutput0;
  let vf12: vec4u = unpack4xU8(bitcast<vec3u>(cos(vec3f(unpack4xU8(textureNumLayers(st0)).bbg))).y);
  textureStore(st0, vec2i(unconst_i32(26), unconst_i32(177)), i32(unconst_i32(541)), vec4f(vec4f(unconst_f32(0.1704), unconst_f32(0.3219), unconst_f32(0.07142), unconst_f32(0.3180))));
  var vf13: vec4i = countOneBits(vec4i(unconst_i32(80), unconst_i32(32), unconst_i32(3), unconst_i32(177)));
  var vf14: i32 = dot4I8Packed(u32(unconst_u32(170)), u32(unconst_u32(503)));
  out.f1 &= countOneBits(vec4i(unconst_i32(716), unconst_i32(108), unconst_i32(-89), unconst_i32(491)));
  var vf15: vec4i = countOneBits(vec4i(unconst_i32(131), unconst_i32(33), unconst_i32(89), unconst_i32(61)));
  vf14 &= bitcast<i32>(vf12[u32(unconst_u32(212))]);
  vf15 |= vec4i(i32(vf12[u32(unconst_u32(13))]));
  textureStore(st0, vec2i(i32(pack4x8snorm(vec4f(unconst_f32(0.2123), unconst_f32(0.1158), unconst_f32(-0.02534), unconst_f32(0.07938))))), bitcast<i32>(min(vec2h(unconst_f16(4779.1), unconst_f16(14800.4)), vec2h(unconst_f16(1214.2), unconst_f16(-1706.8)))), vec4f(vec4f(unconst_f32(0.1214), unconst_f32(0.05236), unconst_f32(0.00572), unconst_f32(0.4943))));
  var vf16 = fn0();
  vf14 = bitcast<i32>(atan(bitcast<f32>(pack4xI8(vec4i(unconst_i32(-222), unconst_i32(12), unconst_i32(56), unconst_i32(34))))));
  return out;
}

@compute @workgroup_size(1, 1, 1)
fn compute0(@builtin(global_invocation_id) a0: vec3u) {
  var vf17 = fn0();
  vf17.f0 -= f32(vw0[0][1].b);
  let ptr3: ptr<workgroup, vec2i> = &(*&vw1).f0;
  vw1 = FragmentOutput0(vec2i(i32(a0[0])), unpack4xI8(a0[0]));
  let ptr4: ptr<workgroup, mat2x4h> = &(*&vw0)[0];
  let ptr5: ptr<function, T0> = &vf17;
  fn0();
  vw0[u32(unconst_u32(44))] -= (*ptr4);
  let vf18: f16 = vw0[0][1][1];
  vf17 = T0(f32(determinant(mat2x2h(vec2h(refract(vec2f(unconst_f32(0.05171), unconst_f32(0.07086)), vec2f(unconst_f32(0.1522), unconst_f32(0.03191)), f32(unconst_f32(0.3588)))), vec2h(refract(vec2f(unconst_f32(0.05171), unconst_f32(0.07086)), vec2f(unconst_f32(0.1522), unconst_f32(0.03191)), f32(unconst_f32(0.3588))))))));
  vf17.f0 = f32(a0[0]);
}

@compute @workgroup_size(1, 1, 1)
fn compute1() {
  let ptr6: ptr<workgroup, mat2x4h> = &vw0[0];
  vw0[bitcast<vec3u>(quantizeToF16(vec3f(f32(vw0[0][u32(unconst_u32(270))][vec4u(workgroupUniformLoad(&vw0)[0][1])[1]]))))[2]] -= mat2x4h(f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]), f16(vw1.f0[u32(unconst_u32(29))]));
  let vf19: i32 = vw1.f1[1];
  fn0();
  var vf20: i32 = (*&vw1).f1[3];
}

@compute @workgroup_size(2, 1, 1)
fn compute2() {
  vw1 = FragmentOutput0((*&vw1).f0, (*&vw1).f0.rrgr);
  vw1 = FragmentOutput0(vec2i(vw1.f1[u32(unconst_u32(85))]), vec4i(vw1.f1[u32(unconst_u32(85))]));
  vw1.f0 ^= (*&vw1).f1.xx;
  let ptr7: ptr<workgroup, vec2i> = &vw1.f0;
  var vf21 = fn0();
  fn0();
  var vf22 = fn0();
  vf21.f0 *= bitcast<f32>((*&vw1).f1.y);
  vf22 = T0(vec4f(vw0[u32(unconst_u32(629))][0]).x);
  let ptr8: ptr<workgroup, vec2i> = &vw1.f0;
  vw0[u32((*&vw0)[u32(unconst_u32(29))][1].a)] = mat2x4h(round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w), round(vw0[0][1].w));
  let vf23: f16 = (*&vw0)[0][1][1];
  var vf24 = fn0();
  fn0();
  var vf25 = fn0();
  fn0();
  vf22 = T0(f32(vw0[0][0].g));
  vf21.f0 += vec4f(vw0[0][1])[2];
}`,
  sourceMap: {},
});
let buffer9 = device0.createBuffer({
  size: 70,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder10 = device0.createCommandEncoder({label: '\u{1fa31}\u24f3\u{1fc4b}\u0c40\u1d05\ud6c6\u0dda\u9378\u{1f675}'});
let textureView11 = texture11.createView({format: 'rgba8sint', baseMipLevel: 0});
let computePassEncoder7 = commandEncoder10.beginComputePass({});
let renderBundleEncoder3 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], sampleCount: 1, stencilReadOnly: true});
let renderBundle3 = renderBundleEncoder3.finish({});
try {
buffer0.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture14,
  mipLevel: 0,
  origin: {x: 32, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(227).fill(100), /* required buffer size: 227 */
{offset: 227, bytesPerRow: 411}, {width: 50, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData3 = new ImageData(76, 144);
let buffer10 = device0.createBuffer({
  size: 8299,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture15 = device0.createTexture({
  size: [47, 1, 15],
  dimension: '2d',
  format: 'r16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView12 = texture3.createView({label: '\u096a\ud296', dimension: '2d', mipLevelCount: 1});
try {
renderPassEncoder1.setVertexBuffer(2, buffer8, 0, 7_109);
} catch {}
let commandEncoder11 = device0.createCommandEncoder({});
let textureView13 = texture6.createView({});
let computePassEncoder8 = commandEncoder11.beginComputePass();
try {
renderPassEncoder0.setVertexBuffer(0, buffer10, 836);
} catch {}
try {
device0.queue.writeBuffer(buffer4, 1064, new DataView(new ArrayBuffer(19335)), 3897, 5148);
} catch {}
let querySet0 = device0.createQuerySet({type: 'occlusion', count: 118});
let texture16 = device0.createTexture({
  label: '\u0853\u1850\ud138\u4697\u0906\u829d\u0a68',
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  mipLevelCount: 2,
  format: 'eac-r11snorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
buffer0.unmap();
} catch {}
try {
renderPassEncoder0.pushDebugGroup('\u5f71');
} catch {}
let bindGroup0 = device0.createBindGroup({
  label: '\u{1ff18}\ud7c0\ufd84\u04f3\u03ee\u{1fc2b}\u{1f6c8}\u{1f83d}\u011c\ucc6e\u0bc7',
  layout: bindGroupLayout1,
  entries: [
    {binding: 7, resource: textureView7},
    {binding: 227, resource: {buffer: buffer10, offset: 2304, size: 36}},
    {binding: 21, resource: textureView3},
  ],
});
let textureView14 = texture14.createView({mipLevelCount: 1});
try {
renderPassEncoder1.setBindGroup(0, bindGroup0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer5, 'uint32', 1_180, 114);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(0, buffer8);
} catch {}
try {
renderPassEncoder0.popDebugGroup();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 15}
*/
{
  source: imageData0,
  origin: { x: 0, y: 1 },
  flipY: true,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 15, y: 0, z: 2},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder12 = device0.createCommandEncoder({});
let textureView15 = texture16.createView({dimension: 'cube', mipLevelCount: 1});
let textureView16 = texture1.createView({dimension: '2d-array', mipLevelCount: 1, arrayLayerCount: 1});
let sampler5 = device0.createSampler({addressModeV: 'mirror-repeat', addressModeW: 'clamp-to-edge', lodMinClamp: 54.63, lodMaxClamp: 69.71});
try {
renderPassEncoder0.setBindGroup(1, bindGroup0);
} catch {}
try {
renderPassEncoder1.setBindGroup(3, bindGroup0, new Uint32Array(6668), 345, 0);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer7, 'uint16', 150, 223);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(6, buffer8);
} catch {}
let commandEncoder13 = device0.createCommandEncoder({});
let texture17 = device0.createTexture({
  label: '\u0c8f\u{1f9e1}\ub018\u777f\u{1fd73}\u0495\u18ce\ua843\u0cd6\u846b',
  size: [3960],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView17 = texture15.createView({dimension: '2d'});
let renderPassEncoder3 = commandEncoder12.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: 752.7, g: -76.87, b: -598.2, a: -79.25, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet0,
  maxDrawCount: 53372075,
});
let sampler6 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 46.79,
  lodMaxClamp: 87.78,
});
try {
renderPassEncoder0.setVertexBuffer(6, buffer8, 2_160, 2_875);
} catch {}
try {
commandEncoder13.copyBufferToBuffer(buffer1, 3736, buffer0, 228, 212);
} catch {}
let computePassEncoder9 = commandEncoder13.beginComputePass();
let sampler7 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 97.69,
  lodMaxClamp: 99.59,
});
try {
renderPassEncoder0.setBindGroup(0, bindGroup0, new Uint32Array(1025), 350, 0);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer5, 'uint16', 160, 1_184);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(6, buffer8, 0, 998);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture0,
  mipLevel: 0,
  origin: {x: 34, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(1_056).fill(177), /* required buffer size: 1_056 */
{offset: 303, bytesPerRow: 251, rowsPerImage: 3}, {width: 72, height: 0, depthOrArrayLayers: 2});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroup1 = device0.createBindGroup({
  label: '\uf5fc\ud935\u7c10\u0b0c\u8a14\uced9\u0ede\ud5d7\u093f',
  layout: bindGroupLayout3,
  entries: [{binding: 433, resource: textureView9}],
});
let commandEncoder14 = device0.createCommandEncoder();
let texture18 = device0.createTexture({size: [380, 5, 1], mipLevelCount: 3, format: 'r8sint', usage: GPUTextureUsage.COPY_SRC});
let renderPassEncoder4 = commandEncoder14.beginRenderPass({
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: -20.87, g: -246.8, b: -48.91, a: -645.3, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 218731565,
});
try {
computePassEncoder2.setBindGroup(0, bindGroup1);
} catch {}
try {
renderPassEncoder3.setBindGroup(0, bindGroup1);
} catch {}
try {
renderPassEncoder3.beginOcclusionQuery(34);
} catch {}
try {
renderPassEncoder1.setViewport(2978.1254184457657, 0.3717190124876266, 955.147580425357, 0.5922245402441918, 0.24582757551959333, 0.504013276344139);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData2,
  origin: { x: 3, y: 0 },
  flipY: false,
}, {
  texture: texture14,
  mipLevel: 0,
  origin: {x: 77, y: 0, z: 9},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder15 = device0.createCommandEncoder({});
let texture19 = device0.createTexture({size: [495, 1, 5], mipLevelCount: 4, format: 'r8sint', usage: GPUTextureUsage.TEXTURE_BINDING});
let computePassEncoder10 = commandEncoder15.beginComputePass({});
try {
computePassEncoder9.setBindGroup(1, bindGroup1);
} catch {}
try {
renderPassEncoder3.endOcclusionQuery();
} catch {}
let pipeline0 = device0.createComputePipeline({layout: pipelineLayout0, compute: {module: shaderModule0, entryPoint: 'compute2', constants: {}}});
let videoFrame1 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt709', primaries: 'smpte432', transfer: 'hlg'} });
let buffer11 = device0.createBuffer({size: 680, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE});
let textureView18 = texture19.createView({dimension: '2d', format: 'r8sint', mipLevelCount: 1, baseArrayLayer: 1, arrayLayerCount: 1});
try {
renderPassEncoder1.setIndexBuffer(buffer7, 'uint32', 388, 81);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
computePassEncoder4.pushDebugGroup('\u{1f86b}');
} catch {}
try {
device0.queue.writeBuffer(buffer7, 260, new Int16Array(8817), 432, 44);
} catch {}
let buffer12 = device0.createBuffer({
  size: 354,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture20 = device0.createTexture({
  size: [8],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView19 = texture13.createView({dimension: '2d', baseArrayLayer: 10});
try {
computePassEncoder10.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup1, new Uint32Array(948), 176, 0);
} catch {}
let shaderModule1 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

requires unrestricted_pointer_parameters;

struct T2 {
  f0: vec2u,
}

@group(0) @binding(182) var sam1: sampler;

var<workgroup> vw3: atomic<u32>;

struct VertexOutput1 {
  @location(2) f2: vec2i,
  @location(7) f3: vec2h,
  @location(12) f4: vec2i,
  @location(8) f5: vec2f,
  @location(14) f6: vec4i,
  @location(5) f7: vec2f,
  @location(9) @interpolate(flat) f8: f32,
  @location(4) f9: vec4u,
  @location(11) @interpolate(flat, centroid) f10: vec2h,
  @invariant @builtin(position) f11: vec4f,
}

fn unconst_i32(v: i32) -> i32 { return v; }

@group(0) @binding(48) var st1: texture_storage_2d_array<r32float, read_write>;

struct T0 {
  f0: array<u32>,
}

var<private> vp0: T2 = T2();

var<workgroup> vw4: T2;

fn fn1() -> mat3x4f {
  var out: mat3x4f;
  vp0.f0 = vp0.f0;
  var vf27: u32 = vp0.f0[vp0.f0[1]];
  var vf28: f16 = length(vec2h(vp0.f0).x);
  var vf29: u32 = vp0.f0[u32(unconst_u32(589))];
  out = mat3x4f(bitcast<vec4f>(vp0.f0.grgr), bitcast<vec4f>(vp0.f0.rgrg), bitcast<vec4f>(vp0.f0.xxyx));
  let vf30: vec3u = countOneBits(vec3u(unconst_u32(240), unconst_u32(128), unconst_u32(33)));
  var vf31: vec4f = log2(vec4f(unconst_f32(0.02186), unconst_f32(0.2981), unconst_f32(0.02084), unconst_f32(0.2325)));
  vp0.f0 <<= vp0.f0;
  var vf32: u32 = vf30[1];
  vf32 <<= u32(log2(vec4f(unconst_f32(0.2621), unconst_f32(0.06387), unconst_f32(0.08405), unconst_f32(0.4792)))[1]);
  let vf33: u32 = vp0.f0[vp0.f0.y];
  vf32 |= u32(vf28);
  var vf34: f16 = length(f16(vp0.f0[0]));
  let vf35: vec3u = vf30;
  vp0 = T2(vec2u(vf27));
  let ptr9: ptr<private, vec2u> = &vp0.f0;
  let ptr10: ptr<function, vec4f> = &vf31;
  return out;
}

var<workgroup> vw2: array<array<bool, 1>, 33>;

fn unconst_f16(v: f16) -> f16 { return v; }

struct T1 {
  @size(8) f0: array<u32>,
}

fn fn0() -> mat4x4h {
  var out: mat4x4h;
  vp0 = T2(vec2u(radians(vec2h(textureDimensions(st1)))));
  let vf26: u32 = textureNumLayers(st1);
  vp0.f0 |= vp0.f0;
  return out;
}

fn unconst_u32(v: u32) -> u32 { return v; }

var<workgroup> vw5: FragmentOutput1;

fn unconst_bool(v: bool) -> bool { return v; }

struct FragmentOutput1 {
  @location(0) @interpolate(linear) f0: vec4f,
  @location(2) f1: vec4i,
}

alias vec3b = vec3<bool>;

fn unconst_f32(v: f32) -> f32 { return v; }

@vertex
fn vertex3(@location(10) @interpolate(flat, center) a0: vec4i, @location(5) a1: vec2h) -> VertexOutput1 {
  var out: VertexOutput1;
  let vf36: vec2h = exp2(vec2h(unconst_f16(404.9), unconst_f16(1425.9)));
  let vf37: vec4i = a0;
  out.f4 = vec2i(i32(dot4U8Packed(u32(unconst_u32(213)), pack2x16snorm(unpack2x16unorm(bitcast<u32>(a1))))));
  fn1();
  let vf38: vec4i = a0;
  var vf39: vec4i = a0;
  out.f6 += vec4i(i32(vp0.f0[0]));
  out.f7 *= vec2f(quantizeToF16(f32(unconst_f32(0.04622))));
  out.f8 += f32(vf37[0]);
  var vf40 = fn1();
  var vf41 = fn1();
  let vf42: vec4i = unpack4xI8(u32(unconst_u32(222)));
  vp0 = T2(vec2u(bitcast<u32>(a0[u32(unconst_u32(29))])));
  return out;
}

@fragment
fn fragment1(@builtin(sample_index) a0: u32, @builtin(position) a1: vec4f, @builtin(front_facing) a2: bool) -> FragmentOutput1 {
  var out: FragmentOutput1;
  var vf43: vec3i = sign(vec3i(bitcast<i32>(pack4x8unorm(textureLoad(st1, vec2i(unconst_i32(289), unconst_i32(430)), bitcast<i32>(a1[vp0.f0[1]]))))));
  out = FragmentOutput1(vec4f(abs(bitcast<f32>(insertBits(pack4xI8Clamp(vec4i(unconst_i32(272), unconst_i32(73), unconst_i32(52), unconst_i32(152))), bitcast<u32>(cross(vec3f(unconst_f32(0.1516), unconst_f32(0.07103), unconst_f32(0.03503)), vec3f(unconst_f32(-0.02382), unconst_f32(0.1807), unconst_f32(-0.1782)))[2]), bitcast<vec3u>(cross(vec3f(unconst_f32(-0.00178), unconst_f32(-0.4814), unconst_f32(0.04253)), vec3f(f32(a0))))[1], bitcast<u32>(asin(f32(unconst_f32(0.3083)))))))), vec4i(i32(abs(bitcast<f32>(insertBits(pack4xI8Clamp(vec4i(unconst_i32(272), unconst_i32(73), unconst_i32(52), unconst_i32(152))), bitcast<u32>(cross(vec3f(unconst_f32(0.1516), unconst_f32(0.07103), unconst_f32(0.03503)), vec3f(unconst_f32(-0.02382), unconst_f32(0.1807), unconst_f32(-0.1782)))[2]), bitcast<vec3u>(cross(vec3f(unconst_f32(-0.00178), unconst_f32(-0.4814), unconst_f32(0.04253)), vec3f(f32(a0))))[1], bitcast<u32>(asin(f32(unconst_f32(0.3083))))))))));
  fn0();
  vp0.f0 = vec2u(textureNumLayers(st1));
  var vf44: u32 = a0;
  let vf45: vec4f = a1;
  let ptr11: ptr<private, vec2u> = &vp0.f0;
  var vf46 = fn0();
  return out;
}

@compute @workgroup_size(1, 1, 1)
fn compute3(@builtin(local_invocation_id) a0: vec3u) {
  var vf47: u32 = atomicExchange(&vw3, u32(unconst_u32(795)));
  fn1();
  fn1();
  vw5.f1 *= unpack4xI8(a0[1]);
  let ptr12: ptr<workgroup, vec2u> = &vw4.f0;
  var vf48 = fn1();
  let ptr13: ptr<workgroup, bool> = &vw2[32][u32((*&vw2)[32][0])];
  vf48 -= mat3x4f(bitcast<vec4f>(a0.gggb), bitcast<vec4f>(a0.grbr), bitcast<vec4f>(a0.bbrb));
  var vf49: vec4i = unpack4xI8(u32(unconst_u32(50)));
  var vf50: vec4h = acosh(vec4h(unconst_f16(3583.1), unconst_f16(1497.5), unconst_f16(-20759.6), unconst_f16(2997.6)));
  fn1();
  let ptr14: ptr<workgroup, vec4f> = &(*&vw5).f0;
  let vf51: vec3u = firstLeadingBit(vec3u(unconst_u32(58), unconst_u32(37), unconst_u32(81)));
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup2 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler7}, {binding: 48, resource: textureView4}],
});
let commandEncoder16 = device0.createCommandEncoder({});
let textureView20 = texture15.createView({label: '\u0409\u0688\ud8d8\u744a\u320f\u00bd\u6258', dimension: '2d', baseArrayLayer: 1});
let sampler8 = device0.createSampler({
  label: '\u{1fb92}\udaf2\u03ba',
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 73.30,
  compare: 'less',
  maxAnisotropy: 9,
});
try {
computePassEncoder9.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(2, bindGroup1, new Uint32Array(350), 20, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4, buffer8, 1_200, 3_131);
} catch {}
try {
computePassEncoder1.setBindGroup(3, bindGroup0);
} catch {}
try {
computePassEncoder8.setPipeline(pipeline0);
} catch {}
let pipeline1 = device0.createRenderPipeline({
  layout: pipelineLayout0,
  multisample: {mask: 0x3761a564},
  fragment: {
  module: shaderModule1,
  targets: [{format: 'rgba32float', writeMask: GPUColorWrite.ALL | GPUColorWrite.ALPHA | GPUColorWrite.RED}],
},
  vertex: {module: shaderModule0, entryPoint: 'vertex0', constants: {}, buffers: []},
});
let buffer13 = device0.createBuffer({
  label: '\u0717\u{1f7e4}\uca61\ub421\u0e25\u9572',
  size: 7604,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM,
});
let textureView21 = texture19.createView({dimension: '2d', mipLevelCount: 1});
let textureView22 = texture10.createView({dimension: '3d'});
let computePassEncoder11 = commandEncoder16.beginComputePass({});
let renderBundleEncoder4 = device0.createRenderBundleEncoder({colorFormats: ['rgba32float'], sampleCount: 1, stencilReadOnly: true});
let sampler9 = device0.createSampler({addressModeU: 'mirror-repeat', addressModeW: 'mirror-repeat', lodMinClamp: 41.89, lodMaxClamp: 80.02});
try {
renderPassEncoder3.setBindGroup(1, bindGroup2);
} catch {}
try {
renderBundleEncoder4.setBindGroup(0, bindGroup1);
} catch {}
try {
renderBundleEncoder4.setPipeline(pipeline1);
} catch {}
let arrayBuffer0 = buffer1.getMappedRange(0, 0);
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let texture21 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  sampleCount: 1,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView23 = texture0.createView({label: '\u8016\u7db8\u314b\u133b\u{1f728}\ufcf1\u13e6', dimension: '2d'});
try {
computePassEncoder9.setBindGroup(0, bindGroup2);
} catch {}
try {
renderPassEncoder3.beginOcclusionQuery(41);
} catch {}
try {
renderPassEncoder3.endOcclusionQuery();
} catch {}
try {
renderBundleEncoder4.setBindGroup(0, bindGroup2);
} catch {}
try {
renderBundleEncoder4.drawIndirect(buffer10, 1_148);
} catch {}
try {
renderBundleEncoder4.setIndexBuffer(buffer10, 'uint32', 1_508, 1_245);
} catch {}
try {
renderBundleEncoder4.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder4.setVertexBuffer(4, buffer12);
} catch {}
try {
computePassEncoder4.popDebugGroup();
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let sampler10 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 38.46,
  lodMaxClamp: 45.36,
});
let externalTexture0 = device0.importExternalTexture({source: videoFrame0});
try {
computePassEncoder7.setBindGroup(3, bindGroup0, new Uint32Array(22), 1, 0);
} catch {}
try {
computePassEncoder3.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder4.setVertexBuffer(7, buffer10, 880);
} catch {}
try {
device0.queue.writeBuffer(buffer7, 732, new BigUint64Array(499), 37, 12);
} catch {}
let bindGroup3 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView9}]});
let texture22 = device0.createTexture({
  label: '\ufff7\u4033\u0113\ueda3\u07ec\u391f\ud326\u{1fa9b}\ud6d3\ud280\u0f6f',
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  format: 'r32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView24 = texture0.createView({dimension: '2d-array', arrayLayerCount: 2});
try {
computePassEncoder7.setBindGroup(0, bindGroup2);
} catch {}
try {
computePassEncoder9.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder7.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder4.drawIndexed(45, 20, 28, 775_210_081, 894_611_346);
} catch {}
try {
renderBundleEncoder4.drawIndexedIndirect(buffer8, 4_024);
} catch {}
try {
renderBundleEncoder4.setIndexBuffer(buffer2, 'uint32', 112, 163);
} catch {}
try {
renderBundleEncoder4.setVertexBuffer(0, buffer10, 0);
} catch {}
let commandEncoder17 = device0.createCommandEncoder();
let sampler11 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 46.19,
  lodMaxClamp: 70.03,
  compare: 'not-equal',
  maxAnisotropy: 8,
});
try {
computePassEncoder0.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder4.draw(179, 603, 871_372_166, 18_180_092);
} catch {}
try {
renderBundleEncoder4.setIndexBuffer(buffer11, 'uint32', 192, 79);
} catch {}
try {
renderBundleEncoder4.setVertexBuffer(4, buffer12, 64);
} catch {}
try {
commandEncoder17.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1403 */
  offset: 1403,
  bytesPerRow: 256,
  rowsPerImage: 639,
  buffer: buffer10,
}, {
  texture: texture3,
  mipLevel: 5,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let commandEncoder18 = device0.createCommandEncoder({});
let textureView25 = texture9.createView({});
let computePassEncoder12 = commandEncoder18.beginComputePass({});
try {
computePassEncoder0.setBindGroup(3, bindGroup1);
} catch {}
try {
computePassEncoder5.setBindGroup(3, bindGroup0, new Uint32Array(2060), 120, 0);
} catch {}
try {
computePassEncoder10.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder4.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder4.setBindGroup(1, bindGroup3, new Uint32Array(340), 1, 0);
} catch {}
try {
renderBundleEncoder4.draw(344, 279, 145_268_469, 421_486_115);
} catch {}
try {
renderBundleEncoder4.drawIndexedIndirect(buffer8, 560);
} catch {}
try {
buffer3.unmap();
} catch {}
let buffer14 = device0.createBuffer({
  size: 26838,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let renderPassEncoder5 = commandEncoder17.beginRenderPass({
  label: '\u{1ff11}\u8a28\u581c\ub464\u{1f83f}\u68ca\uf384\u3b96\uf9b2',
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: 369.9, g: -602.3, b: 973.0, a: 124.8, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 67790533,
});
try {
computePassEncoder6.setBindGroup(3, bindGroup2);
} catch {}
try {
renderBundleEncoder4.drawIndexedIndirect(buffer6, 412);
} catch {}
try {
renderBundleEncoder4.setIndexBuffer(buffer11, 'uint32', 4, 42);
} catch {}
try {
renderBundleEncoder4.setPipeline(pipeline1);
} catch {}
await gc();
let buffer15 = device0.createBuffer({
  label: '\u{1f98e}\u0dbb\u0d5f\u09ed\u{1f9f6}\u94f3',
  size: 1239,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM,
});
let texture23 = device0.createTexture({
  label: '\u{1f9ad}\u000e\u{1fd45}\u2815\uad81\u0052\u0db7\uf94c\uf922\u{1f970}\u0181',
  size: [190],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST,
});
let renderBundle4 = renderBundleEncoder4.finish({});
try {
{ clearResourceUsages(device0, computePassEncoder7); computePassEncoder7.dispatchWorkgroupsIndirect(buffer12, 24); };
} catch {}
try {
renderPassEncoder3.setVertexBuffer(6, buffer14);
} catch {}
let bindGroup4 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 50, resource: textureView15}, {binding: 276, resource: textureView13}],
});
try {
computePassEncoder1.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup3);
} catch {}
try {
renderPassEncoder5.setBindGroup(0, bindGroup2, new Uint32Array(125), 25, 0);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle3, renderBundle1, renderBundle1, renderBundle3]);
} catch {}
try {
renderPassEncoder1.pushDebugGroup('\u4e32');
} catch {}
let commandEncoder19 = device0.createCommandEncoder({label: '\u0d90\u0fce\u0984\u{1ff44}\u045e'});
let renderBundleEncoder5 = device0.createRenderBundleEncoder({colorFormats: ['r8sint']});
let renderBundle5 = renderBundleEncoder5.finish();
let sampler12 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 27.36,
  lodMaxClamp: 90.38,
});
try {
commandEncoder19.copyTextureToBuffer({
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 1},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 48 */
  offset: 48,
  bytesPerRow: 10240,
  buffer: buffer8,
}, {width: 0, height: 2, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder1.popDebugGroup();
} catch {}
let bindGroup5 = device0.createBindGroup({
  label: '\uc67e\u0d89\u{1f6b8}\ud148',
  layout: bindGroupLayout2,
  entries: [{binding: 50, resource: textureView15}, {binding: 276, resource: textureView13}],
});
let commandEncoder20 = device0.createCommandEncoder({});
let textureView26 = texture6.createView({});
let computePassEncoder13 = commandEncoder20.beginComputePass({});
try {
computePassEncoder1.setBindGroup(0, bindGroup2);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder1); computePassEncoder1.dispatchWorkgroups(1, 3, 1); };
} catch {}
try {
computePassEncoder6.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setBindGroup(1, bindGroup5, new Uint32Array(1755), 67, 0);
} catch {}
try {
commandEncoder19.clearBuffer(buffer12, 8, 96);
} catch {}
let bindGroupLayout5 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 173,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'read-only-storage', hasDynamicOffset: true },
    },
    {
      binding: 359,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
    {
      binding: 487,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '3d' },
    },
    {
      binding: 313,
      visibility: GPUShaderStage.COMPUTE,
      texture: { viewDimension: '2d', sampleType: 'float', multisampled: false },
    },
    {binding: 89, visibility: GPUShaderStage.VERTEX, sampler: { type: 'filtering' }},
    {
      binding: 150,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'unfilterable-float', multisampled: false },
    },
    {
      binding: 29,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba8uint', access: 'read-only', viewDimension: '2d-array' },
    },
    {
      binding: 298,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: true },
    },
    {
      binding: 140,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32sint', access: 'read-write', viewDimension: '2d-array' },
    },
  ],
});
let commandEncoder21 = device0.createCommandEncoder({});
let texture24 = device0.createTexture({
  size: {width: 47, height: 1, depthOrArrayLayers: 1},
  format: 'r32sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture25 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 17},
  mipLevelCount: 4,
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder14 = commandEncoder21.beginComputePass();
try {
computePassEncoder5.setBindGroup(0, bindGroup1, new Uint32Array(108), 17, 0);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(5, buffer10, 416, 598);
} catch {}
await gc();
let bindGroup6 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 48, resource: textureView4}, {binding: 182, resource: sampler6}],
});
let commandEncoder22 = device0.createCommandEncoder({});
let texture26 = device0.createTexture({
  label: '\u0015\u4104\u0697\u0550\u04dc\u1c84\u{1f984}\udfc4\u0438\uc6c1',
  size: [990, 1, 32],
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture27 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 35},
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder15 = commandEncoder19.beginComputePass({});
try {
computePassEncoder4.setBindGroup(0, bindGroup2, new Uint32Array(645), 53, 0);
} catch {}
try {
renderPassEncoder0.setBindGroup(1, bindGroup4, new Uint32Array(788), 33, 0);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer10, 'uint32', 1_204, 739);
} catch {}
try {
commandEncoder22.copyBufferToBuffer(buffer5, 2848, buffer15, 84, 248);
} catch {}
try {
commandEncoder22.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 736 */
  offset: 736,
  bytesPerRow: 98816,
  buffer: buffer10,
}, {
  texture: texture11,
  mipLevel: 0,
  origin: {x: 7, y: 0, z: 1},
  aspect: 'all',
}, {width: 2, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup7 = device0.createBindGroup({
  label: '\u9d16\u7784\u3678',
  layout: bindGroupLayout1,
  entries: [
    {binding: 21, resource: textureView20},
    {binding: 227, resource: {buffer: buffer10, offset: 0, size: 2063}},
    {binding: 7, resource: textureView7},
  ],
});
let texture28 = device0.createTexture({
  size: [47, 1, 1],
  mipLevelCount: 1,
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder16 = commandEncoder22.beginComputePass({});
try {
computePassEncoder12.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setScissorRect(359, 0, 539, 0);
} catch {}
try {
device0.label = '\u{1fb66}\u5ad4\u05ab\uf591\u0177\u0af2';
} catch {}
let buffer16 = device0.createBuffer({size: 28699, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture29 = device0.createTexture({
  label: '\u{1f630}\u6f26\u5aa2',
  size: {width: 1980, height: 1, depthOrArrayLayers: 99},
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
{ clearResourceUsages(device0, computePassEncoder1); computePassEncoder1.dispatchWorkgroupsIndirect(buffer7, 92); };
} catch {}
try {
computePassEncoder11.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer15, 'uint32', 80, 884);
} catch {}
try {
texture12.destroy();
} catch {}
try {
globalThis.someLabel = device0.label;
} catch {}
let buffer17 = device0.createBuffer({size: 12948, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture30 = device0.createTexture({
  size: [47, 1, 13],
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture31 = device0.createTexture({
  size: [495, 1, 1],
  mipLevelCount: 3,
  format: 'r8sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
{ clearResourceUsages(device0, computePassEncoder7); computePassEncoder7.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder13.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup4);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer5, 'uint32', 528, 1_156);
} catch {}
try {
renderPassEncoder5.setVertexBuffer(4, undefined);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture28,
  mipLevel: 0,
  origin: {x: 11, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(207).fill(106), /* required buffer size: 207 */
{offset: 207}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer18 = device0.createBuffer({
  size: 4700,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let texture32 = device0.createTexture({
  label: '\u6e0f\u7b4d\u5982\u{1fe36}',
  size: [190, 2, 98],
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture33 = device0.createTexture({
  size: {width: 47, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder11.setBindGroup(1, bindGroup5, new Uint32Array(603), 167, 0);
} catch {}
try {
computePassEncoder15.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(1, buffer8, 3_496);
} catch {}
let commandEncoder23 = device0.createCommandEncoder();
let textureView27 = texture32.createView({aspect: 'all', baseArrayLayer: 8, arrayLayerCount: 1});
let texture34 = device0.createTexture({
  size: [47],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder17 = commandEncoder23.beginComputePass();
try {
computePassEncoder0.setBindGroup(3, bindGroup5);
} catch {}
try {
computePassEncoder10.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer11, 'uint32', 92, 57);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(3, buffer10, 3_356);
} catch {}
let querySet1 = device0.createQuerySet({type: 'occlusion', count: 2723});
let textureView28 = texture24.createView({dimension: '2d-array'});
try {
computePassEncoder14.setPipeline(pipeline0);
} catch {}
let pipelineLayout3 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture35 = device0.createTexture({
  size: [1980, 1, 3],
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture36 = device0.createTexture({
  label: '\u4481\u0c72\u{1f6e9}\u{1fd3d}\u{1f840}\u921f\u01cf\u529e\u1f21\u3358\uf592',
  size: [1980, 1, 85],
  mipLevelCount: 4,
  format: 'rg8snorm',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
try {
renderPassEncoder5.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer5, 'uint32', 1_132, 2_411);
} catch {}
let imageData4 = new ImageData(24, 48);
let texture37 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 26},
  mipLevelCount: 1,
  dimension: '3d',
  format: 'r32float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture38 = device0.createTexture({
  size: [990, 1, 3],
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView29 = texture17.createView({format: 'r8sint'});
try {
computePassEncoder2.setPipeline(pipeline0);
} catch {}
let commandEncoder24 = device0.createCommandEncoder({});
let textureView30 = texture35.createView({label: '\u2a90\u0ac5\u0248\u{1ff12}\u{1fb0a}\u30b0\u04a1\u{1fa47}\u2f0d'});
let textureView31 = texture10.createView({});
let computePassEncoder18 = commandEncoder24.beginComputePass({});
let externalTexture1 = device0.importExternalTexture({label: '\u{1fe3a}\u6298\u{1fd34}\u{1f6ea}\u4737\u0949\ud634', source: videoFrame1});
try {
computePassEncoder9.setBindGroup(3, bindGroup7, new Uint32Array(151), 22, 0);
} catch {}
try {
computePassEncoder7.end();
} catch {}
try {
computePassEncoder5.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setVertexBuffer(3, buffer12, 0, 10);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture33,
  mipLevel: 1,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(109).fill(120), /* required buffer size: 109 */
{offset: 109}, {width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer19 = device0.createBuffer({size: 5775, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE});
let textureView32 = texture32.createView({baseArrayLayer: 38, arrayLayerCount: 5});
let computePassEncoder19 = commandEncoder10.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder1); computePassEncoder1.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder16.setPipeline(pipeline0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let textureView33 = texture15.createView({
  label: '\u{1f7fd}\u05e6\u{1ffa3}\uc896\uc6cb\u0d03\u088b\u0f8f\u0fd8\u0101',
  dimension: '2d',
  baseArrayLayer: 1,
});
try {
computePassEncoder1.end();
} catch {}
try {
computePassEncoder18.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer14, 'uint32', 15_676, 737);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(0, buffer10, 352, 3_562);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 15}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 6},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture39 = device0.createTexture({
  size: {width: 8},
  dimension: '1d',
  format: 'r8snorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView34 = texture23.createView({label: '\u0d91\u5bf7\ud2bf\u26c7\uf79b\u{1f845}\u0b38'});
let renderPassEncoder6 = commandEncoder2.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: 721.5, g: 972.4, b: 180.1, a: -473.0, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet0,
});
let sampler13 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 85.18,
  lodMaxClamp: 90.40,
  compare: 'greater',
});
try {
computePassEncoder17.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle2, renderBundle2, renderBundle1]);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer5, 'uint32', 748, 601);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(4, buffer8);
} catch {}
let promise1 = device0.queue.onSubmittedWorkDone();
let buffer20 = device0.createBuffer({
  size: 8318,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let sampler14 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 27.01,
  lodMaxClamp: 83.68,
});
try {
renderPassEncoder3.setVertexBuffer(1, buffer12, 0, 13);
} catch {}
try {
device0.queue.writeBuffer(buffer0, 272, new Float32Array(7612), 9, 40);
} catch {}
let sampler15 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 67.61,
  lodMaxClamp: 90.37,
  maxAnisotropy: 15,
});
try {
computePassEncoder4.setBindGroup(3, bindGroup3);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder9); computePassEncoder9.dispatchWorkgroups(2, 2); };
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer5, 'uint32', 124, 510);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let texture40 = device0.createTexture({
  size: [495],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView35 = texture28.createView({
  label: '\u9e56\u{1fb4a}\u092f\u377c\uc09c\u0470',
  dimension: '2d-array',
  aspect: 'all',
  format: 'rgba8uint',
  baseMipLevel: 0,
  arrayLayerCount: 1,
});
try {
computePassEncoder19.setBindGroup(1, bindGroup5, new Uint32Array(276), 47, 0);
} catch {}
try {
renderPassEncoder2.setBindGroup(0, bindGroup2);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle1, renderBundle1]);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(3, buffer14);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture3,
  mipLevel: 5,
  origin: {x: 0, y: 0, z: 4},
  aspect: 'all',
}, new Uint8Array(52).fill(83), /* required buffer size: 52 */
{offset: 52}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup8 = device0.createBindGroup({
  label: '\u60c3\u0fba\uf912\ucc13',
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView8}, {binding: 50, resource: textureView15}],
});
let commandEncoder25 = device0.createCommandEncoder({});
try {
computePassEncoder19.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup1);
} catch {}
try {
device0.queue.writeBuffer(buffer4, 2100, new BigUint64Array(54152), 3406, 48);
} catch {}
try {
  await promise1;
} catch {}
document.body.prepend(img0);
let buffer21 = device0.createBuffer({
  size: 23787,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let texture41 = device0.createTexture({size: [495, 1, 6], mipLevelCount: 3, format: 'r8sint', usage: GPUTextureUsage.TEXTURE_BINDING});
let textureView36 = texture22.createView({dimension: '2d', aspect: 'all', baseArrayLayer: 2});
try {
{ clearResourceUsages(device0, computePassEncoder4); computePassEncoder4.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer5, 'uint32', 1_388, 265);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 8, depthOrArrayLayers: 15}
*/
{
  source: img0,
  origin: { x: 4, y: 0 },
  flipY: false,
}, {
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 4},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup9 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler0}, {binding: 48, resource: textureView4}],
});
let texture42 = device0.createTexture({
  size: {width: 495, height: 1, depthOrArrayLayers: 34},
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
try {
renderPassEncoder5.executeBundles([renderBundle0]);
} catch {}
try {
commandEncoder25.copyBufferToBuffer(buffer20, 1308, buffer17, 352, 256);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData4,
  origin: { x: 1, y: 0 },
  flipY: false,
}, {
  texture: texture33,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 6, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder26 = device0.createCommandEncoder({});
let texture43 = device0.createTexture({
  size: {width: 47, height: 1, depthOrArrayLayers: 1},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder20 = commandEncoder25.beginComputePass({});
let sampler16 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 38.71,
  lodMaxClamp: 45.19,
});
try {
computePassEncoder20.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle0, renderBundle3]);
} catch {}
try {
commandEncoder26.clearBuffer(buffer2);
} catch {}
document.body.prepend(img0);
let bindGroup10 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 359, resource: {buffer: buffer8, offset: 512, size: 6077}},
    {binding: 173, resource: {buffer: buffer19, offset: 768, size: 684}},
    {binding: 140, resource: textureView28},
    {binding: 487, resource: textureView30},
    {binding: 313, resource: textureView20},
    {binding: 150, resource: textureView1},
    {binding: 298, resource: {buffer: buffer20, offset: 1792, size: 1428}},
    {binding: 89, resource: sampler2},
    {binding: 29, resource: textureView32},
  ],
});
let commandEncoder27 = device0.createCommandEncoder({});
let textureView37 = texture2.createView({baseArrayLayer: 20, arrayLayerCount: 55});
let computePassEncoder21 = commandEncoder27.beginComputePass({label: '\u5e73\u{1fd1f}\u88b7\u026e\uf97d\ucc6f\u3b7f\ub682\u{1fa2f}\u0aca\u{1fec5}'});
try {
{ clearResourceUsages(device0, computePassEncoder9); computePassEncoder9.dispatchWorkgroups(1, 1); };
} catch {}
try {
renderPassEncoder5.setBindGroup(3, bindGroup0);
} catch {}
try {
renderPassEncoder5.setBindGroup(1, bindGroup10, new Uint32Array(405), 43, 2);
} catch {}
try {
buffer1.unmap();
} catch {}
try {
commandEncoder26.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 2022 */
  offset: 2022,
  bytesPerRow: 15104,
  buffer: buffer20,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 2},
  aspect: 'all',
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer22 = device0.createBuffer({
  size: 13644,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT,
  mappedAtCreation: true,
});
let computePassEncoder22 = commandEncoder26.beginComputePass();
try {
computePassEncoder22.setPipeline(pipeline0);
} catch {}
try {
buffer9.unmap();
} catch {}
try {
renderPassEncoder1.insertDebugMarker('\u00f5');
} catch {}
let sampler17 = device0.createSampler({addressModeU: 'repeat', addressModeW: 'clamp-to-edge', lodMinClamp: 34.40, lodMaxClamp: 42.41});
try {
renderPassEncoder5.setBindGroup(2, bindGroup6, new Uint32Array(1343), 874, 0);
} catch {}
try {
renderPassEncoder0.setScissorRect(84, 0, 82, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let commandEncoder28 = device0.createCommandEncoder({});
let texture44 = device0.createTexture({
  size: {width: 495, height: 1, depthOrArrayLayers: 14},
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder23 = commandEncoder28.beginComputePass({});
let sampler18 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 92.82,
  maxAnisotropy: 10,
});
try {
computePassEncoder6.setBindGroup(0, bindGroup4);
} catch {}
try {
computePassEncoder22.setBindGroup(2, bindGroup1, new Uint32Array(299), 13, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder9); computePassEncoder9.dispatchWorkgroupsIndirect(buffer9, 4); };
} catch {}
try {
computePassEncoder23.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder1.setBindGroup(3, bindGroup4, new Uint32Array(200), 11, 0);
} catch {}
try {
buffer20.unmap();
} catch {}
let promise2 = device0.queue.onSubmittedWorkDone();
let bindGroup11 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 21, resource: textureView17},
    {binding: 227, resource: {buffer: buffer2, offset: 1024}},
    {binding: 7, resource: textureView7},
  ],
});
let commandEncoder29 = device0.createCommandEncoder({});
let textureView38 = texture15.createView({aspect: 'all', baseMipLevel: 0, arrayLayerCount: 2});
let computePassEncoder24 = commandEncoder29.beginComputePass({});
let sampler19 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 27.43,
  lodMaxClamp: 82.52,
  maxAnisotropy: 2,
});
try {
computePassEncoder4.setBindGroup(1, bindGroup1, new Uint32Array(2661), 129, 0);
} catch {}
try {
renderPassEncoder3.setBlendConstant({ r: -621.1, g: 429.5, b: 853.6, a: -75.51, });
} catch {}
try {
renderPassEncoder4.setViewport(2864.9631523786825, 0.5216536742381785, 938.979285184871, 0.2624418546667091, 0.8668622503250276, 0.9462417717072944);
} catch {}
let arrayBuffer1 = buffer22.getMappedRange();
let bindGroup12 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler12}, {binding: 48, resource: textureView4}],
});
let texture45 = device0.createTexture({
  label: '\ue01e\udffa\u0c69\uef5a',
  size: {width: 190, height: 2, depthOrArrayLayers: 55},
  dimension: '3d',
  format: 'rgba8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture46 = device0.createTexture({
  label: '\u2eee\u07d7\u0a4e\uddf9\u{1fc4e}\u{1fe06}\u{1fbe8}\u0cdd\u8fa6\u026e',
  size: {width: 190, height: 2, depthOrArrayLayers: 46},
  mipLevelCount: 7,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST,
  viewFormats: [],
});
try {
computePassEncoder9.setBindGroup(2, bindGroup4);
} catch {}
try {
renderPassEncoder1.setBindGroup(2, bindGroup1);
} catch {}
document.body.append(img0);
let bindGroup13 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView9}]});
let buffer23 = device0.createBuffer({
  size: 20674,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let commandEncoder30 = device0.createCommandEncoder({});
let querySet2 = device0.createQuerySet({type: 'occlusion', count: 119});
let sampler20 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 86.81,
  lodMaxClamp: 92.95,
  maxAnisotropy: 1,
});
try {
renderPassEncoder6.setIndexBuffer(buffer10, 'uint32', 2_200, 1_100);
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
let canvas0 = document.createElement('canvas');
try {
globalThis.someLabel = commandEncoder4.label;
} catch {}
let texture47 = device0.createTexture({
  size: {width: 190, height: 2, depthOrArrayLayers: 88},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView39 = texture34.createView({});
let computePassEncoder25 = commandEncoder30.beginComputePass({});
try {
renderPassEncoder3.setVertexBuffer(5, buffer18, 1_436, 331);
} catch {}
let gpuCanvasContext0 = canvas0.getContext('webgpu');
let buffer24 = device0.createBuffer({size: 1400, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
let texture48 = device0.createTexture({
  label: '\u3d6c\u2406\u7c95\u{1fce9}',
  size: {width: 1640, height: 252, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'astc-10x6-unorm-srgb',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder5.setBindGroup(2, bindGroup13, new Uint32Array(38), 8, 0);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer11, 'uint32', 20, 35);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(2, buffer12);
} catch {}
let commandEncoder31 = device0.createCommandEncoder({});
let computePassEncoder26 = commandEncoder31.beginComputePass({label: '\ubfbe\u0af8\u{1fa41}\u823f\u7d90\u{1fb22}\u784d'});
try {
renderPassEncoder4.setBindGroup(1, bindGroup5);
} catch {}
try {
renderPassEncoder3.setStencilReference(341);
} catch {}
try {
globalThis.someLabel = computePassEncoder5.label;
} catch {}
let bindGroup14 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 50, resource: textureView15}, {binding: 276, resource: textureView8}],
});
let buffer25 = device0.createBuffer({size: 31329, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder32 = device0.createCommandEncoder({});
let texture49 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView40 = texture5.createView({
  label: '\u3880\u0096\u011e\u0c80',
  baseMipLevel: 0,
  mipLevelCount: 1,
  baseArrayLayer: 3,
  arrayLayerCount: 2,
});
let computePassEncoder27 = commandEncoder32.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder4); computePassEncoder4.dispatchWorkgroupsIndirect(buffer8, 5_552); };
} catch {}
try {
computePassEncoder25.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder5.executeBundles([renderBundle5, renderBundle3]);
} catch {}
let texture50 = device0.createTexture({
  size: [8, 8, 15],
  sampleCount: 1,
  dimension: '2d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder12.setBindGroup(0, bindGroup2);
} catch {}
try {
computePassEncoder4.setBindGroup(1, bindGroup0, new Uint32Array(2358), 210, 0);
} catch {}
try {
computePassEncoder9.end();
} catch {}
try {
computePassEncoder24.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer11, 'uint16', 234, 104);
} catch {}
try {
externalTexture1.label = '\u831c\u03af\u3f6f\u{1fb4a}\u4510\ucd9e\u0dd4\u{1f87a}\u0c60\ua133';
} catch {}
let sampler21 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 83.46,
  lodMaxClamp: 96.79,
});
try {
computePassEncoder10.setBindGroup(1, bindGroup10, new Uint32Array(747), 171, 2);
} catch {}
try {
computePassEncoder2.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder21.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(6, buffer21);
} catch {}
try {
commandEncoder13.resolveQuerySet(querySet2, 3, 6, buffer11, 0);
} catch {}
try {
adapter0.label = '\u0b67\u9a9f\ue982\u069e\u019c\u0ae0\uae21\u{1fd06}\u0930\u3202\u6a30';
} catch {}
let buffer26 = device0.createBuffer({size: 52277, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let textureView41 = texture17.createView({mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder28 = commandEncoder13.beginComputePass({});
try {
computePassEncoder21.setBindGroup(0, bindGroup4);
} catch {}
try {
computePassEncoder27.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(1, buffer21);
} catch {}
document.body.prepend(canvas0);
let offscreenCanvas0 = new OffscreenCanvas(83, 107);
try {
device0.queue.label = '\u3f02\ua649\uec4b\u44a7\u089e\u{1face}\u8cd3\u6bf7\u30a8\u8680';
} catch {}
let textureView42 = texture22.createView({dimension: '2d', baseArrayLayer: 4});
let textureView43 = texture24.createView({dimension: '2d-array'});
let sampler22 = device0.createSampler({
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 71.36,
  lodMaxClamp: 77.97,
});
try {
computePassEncoder26.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(3, bindGroup14);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup13, new Uint32Array(653), 30, 0);
} catch {}
try {
renderPassEncoder6.executeBundles([renderBundle1, renderBundle0]);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(7, buffer18);
} catch {}
let gpuCanvasContext1 = offscreenCanvas0.getContext('webgpu');
try {
gpuCanvasContext1.unconfigure();
} catch {}
let bindGroup15 = device0.createBindGroup({
  layout: bindGroupLayout4,
  entries: [
    {binding: 7, resource: {buffer: buffer7, offset: 0}},
    {binding: 569, resource: textureView31},
    {binding: 171, resource: textureView11},
  ],
});
let commandEncoder33 = device0.createCommandEncoder({});
let computePassEncoder29 = commandEncoder33.beginComputePass({});
let renderBundleEncoder6 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: false});
let sampler23 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 55.13,
  lodMaxClamp: 69.47,
  maxAnisotropy: 11,
});
let externalTexture2 = device0.importExternalTexture({source: videoFrame0});
try {
computePassEncoder11.setBindGroup(1, bindGroup14);
} catch {}
try {
computePassEncoder29.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.executeBundles([renderBundle3]);
} catch {}
try {
renderPassEncoder5.setIndexBuffer(buffer18, 'uint32', 524, 523);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(3, buffer10, 0, 1_403);
} catch {}
try {
renderBundleEncoder6.setBindGroup(3, bindGroup6);
} catch {}
try {
renderBundleEncoder6.setIndexBuffer(buffer2, 'uint16', 5_862, 1_465);
} catch {}
try {
renderBundleEncoder6.setVertexBuffer(3, buffer10, 3_680, 228);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
device0.queue.writeBuffer(buffer8, 8488, new BigUint64Array(13454), 1, 0);
} catch {}
let imageData5 = new ImageData(48, 12);
let bindGroup16 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView8}, {binding: 50, resource: textureView15}],
});
try {
computePassEncoder6.setBindGroup(1, bindGroup14, new Uint32Array(783), 78, 0);
} catch {}
try {
computePassEncoder28.setPipeline(pipeline0);
} catch {}
try {
buffer4.unmap();
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let imageData6 = new ImageData(108, 16);
let bindGroup17 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 50, resource: textureView15}, {binding: 276, resource: textureView8}],
});
let commandEncoder34 = device0.createCommandEncoder();
let computePassEncoder30 = commandEncoder34.beginComputePass({});
let sampler24 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 34.11,
  lodMaxClamp: 63.84,
});
try {
renderPassEncoder3.setBindGroup(2, bindGroup13);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
let texture51 = device0.createTexture({
  size: [95, 1, 1],
  mipLevelCount: 2,
  dimension: '2d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let renderBundle6 = renderBundleEncoder6.finish();
try {
computePassEncoder30.setBindGroup(0, bindGroup10, new Uint32Array(40), 0, 2);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup15);
} catch {}
let promise3 = shaderModule0.getCompilationInfo();
let bindGroup18 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 7, resource: textureView7},
    {binding: 21, resource: textureView20},
    {binding: 227, resource: {buffer: buffer14, offset: 2560, size: 205}},
  ],
});
let commandEncoder35 = device0.createCommandEncoder({});
let textureView44 = texture30.createView({});
let renderBundleEncoder7 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true, stencilReadOnly: true});
try {
computePassEncoder8.setBindGroup(3, bindGroup18);
} catch {}
try {
computePassEncoder30.setPipeline(pipeline0);
} catch {}
try {
renderBundleEncoder7.setBindGroup(1, bindGroup4, new Uint32Array(4266), 510, 0);
} catch {}
let promise4 = device0.queue.onSubmittedWorkDone();
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let bindGroup19 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 48, resource: textureView4}, {binding: 182, resource: sampler17}],
});
let texture52 = device0.createTexture({
  size: [495, 1, 41],
  mipLevelCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView45 = texture35.createView({format: 'r32float'});
let computePassEncoder31 = commandEncoder35.beginComputePass({label: '\u08dc\u{1ff8a}\u{1f8fc}\u5674\ufb36\u9a24\u52c0\u{1f8fc}\u0256\u0498'});
try {
computePassEncoder17.setBindGroup(3, bindGroup15, new Uint32Array(3685), 1_010, 0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer5, 'uint32', 964, 69);
} catch {}
try {
renderBundleEncoder7.setIndexBuffer(buffer7, 'uint32', 152, 269);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let texture53 = device0.createTexture({
  label: '\ubaef\u0e84\u{1fa9a}\u0f13\u0d85\u0f24\ufecc\u9f0b\u{1f805}\ufded',
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  mipLevelCount: 2,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let sampler25 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 68.75,
  lodMaxClamp: 71.60,
});
try {
computePassEncoder14.setBindGroup(2, bindGroup4, new Uint32Array(1791), 21, 0);
} catch {}
try {
computePassEncoder31.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(3, bindGroup2, new Uint32Array(2878), 52, 0);
} catch {}
try {
renderBundleEncoder7.setIndexBuffer(buffer7, 'uint16', 484, 178);
} catch {}
let commandEncoder36 = device0.createCommandEncoder({});
let querySet3 = device0.createQuerySet({label: '\u7c57\ud15f', type: 'occlusion', count: 612});
let computePassEncoder32 = commandEncoder36.beginComputePass({});
try {
computePassEncoder0.setBindGroup(1, bindGroup1);
} catch {}
try {
renderPassEncoder5.end();
} catch {}
try {
renderPassEncoder0.setViewport(2930.3289801257242, 0.8970152247991958, 1025.8042744421618, 0.0616573647527756, 0.42009471340333493, 0.6694961183506047);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer11, 'uint32', 44, 10);
} catch {}
try {
renderBundleEncoder7.setBindGroup(2, bindGroup12);
} catch {}
try {
renderBundleEncoder7.setBindGroup(2, bindGroup15, new Uint32Array(521), 24, 0);
} catch {}
try {
renderBundleEncoder7.setIndexBuffer(buffer7, 'uint16', 46, 207);
} catch {}
try {
buffer13.unmap();
} catch {}
try {
commandEncoder17.copyBufferToTexture({
  /* bytesInLastRow: 6 widthInBlocks: 6 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1894 */
  offset: 1894,
  bytesPerRow: 10496,
  buffer: buffer1,
}, {
  texture: texture51,
  mipLevel: 1,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, {width: 6, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await promise3;
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let commandEncoder37 = device0.createCommandEncoder({});
let commandBuffer0 = commandEncoder17.finish({});
let computePassEncoder33 = commandEncoder37.beginComputePass();
try {
computePassEncoder20.setBindGroup(0, bindGroup9, []);
} catch {}
try {
computePassEncoder32.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder1.setBindGroup(3, bindGroup8, new Uint32Array(934), 28, 0);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(6, undefined);
} catch {}
let buffer27 = device0.createBuffer({
  size: 9374,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let sampler26 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 82.95,
});
let externalTexture3 = device0.importExternalTexture({source: videoFrame1});
try {
computePassEncoder26.setBindGroup(3, bindGroup14);
} catch {}
try {
computePassEncoder22.setBindGroup(3, bindGroup18, new Uint32Array(973), 238, 0);
} catch {}
try {
buffer26.unmap();
} catch {}
try {
device0.queue.submit([commandBuffer0]);
} catch {}
let shaderModule2 = device0.createShaderModule({
  code: `
requires readonly_and_readwrite_storage_textures;

diagnostic(info, xyz);

enable f16;

requires packed_4x8_integer_dot_product;

var<workgroup> vw6: array<f32, 18>;

struct S0 {
  @builtin(local_invocation_id) @size(16) f0: vec3u,
  @builtin(global_invocation_id) @size(16) f1: vec3u,
}

var<workgroup> vw7: S0;

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

struct T1 {
  f0: array<u32>,
}

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

fn fn0(a0: ptr<storage, array<u32>, read>) -> S0 {
  var out: S0;
  vp2.f1 |= vec3u(vp1.whole);
  var vf52: u32 = vp2.f1[u32(unconst_u32(188))];
  out.f1 &= vp2.f1;
  vp1 = modf(vec3h(vp2.f1));
  return out;
}

struct VertexOutput3 {
  @location(14) f15: vec4u,
  @location(0) f16: u32,
  @location(2) @interpolate(linear, center) f17: vec4h,
  @invariant @builtin(position) f18: vec4f,
}

struct VertexOutput2 {
  @builtin(position) f12: vec4f,
  @location(13) f13: f32,
  @location(10) f14: vec4f,
}

var<private> vp2: S0 = S0(vec3u(), vec3u());

@group(0) @binding(48) var st2: texture_storage_2d_array<r32float, read_write>;

var<private> vp1 = modf(vec3h());

struct T0 {
  @align(2) f0: array<u32>,
}

@group(0) @binding(182) var sam2: sampler;

fn unconst_f32(v: f32) -> f32 { return v; }

fn fn2(a0: array<array<array<array<f32, 1>, 8>, 1>, 2>, a1: vec2i) -> vec2u {
  var out: vec2u;
  fn1();
  let ptr20: ptr<private, vec3u> = &vp2.f1;
  let ptr21: ptr<private, vec3u> = &vp2.f1;
  vp1.fract = vec3h(f16(a0[1][0][7][0]));
  vp1 = modf(vec3h(vp2.f0));
  var vf63 = fn1();
  vp2 = S0(vec3u(bitcast<u32>(a0[1][0][7][0])), vec3u(bitcast<u32>(a0[1][0][7][0])));
  var vf64 = fn1();
  vf63[(*ptr20)[u32(unconst_u32(115))]] += bitcast<vec2h>(a1[0]);
  fn1();
  let vf65: f32 = a0[1][0][7][0];
  vf64[u32(unconst_u32(776))] *= vf63[u32(unconst_u32(54))];
  out |= bitcast<vec2u>(mix(vp1.whole.rrgb, vec4h(f16(a0[1][0][7][0])), vf64[9].xyyx));
  fn1();
  var vf66 = fn1();
  let ptr22: ptr<function, vec2h> = &vf64[9];
  fn1();
  vf63[9] = vec2h(vp2.f0.zz);
  vf63[u32(unconst_u32(18))] *= vec2h(vp2.f0.gg);
  fn1();
  return out;
}

fn fn1() -> array<vec2h, 10> {
  var out: array<vec2h, 10>;
  let vf53: vec4h = sin(vp1.fract.zxzz);
  let ptr15: ptr<private, vec3u> = &vp2.f1;
  let vf54: f32 = log(bitcast<f32>(vp2.f0[0]));
  vp2 = S0((*ptr15), (*ptr15));
  let ptr16: ptr<private, vec3u> = &vp2.f0;
  let vf55: i32 = firstLeadingBit(i32(unconst_i32(86)));
  vp2 = S0(vec3u((*ptr16)[2]), vec3u((*ptr16)[2]));
  let vf56: u32 = vp2.f0[0];
  let ptr17 = &vp1;
  vp1.fract = asin(vec3h(unconst_f16(15662.4), unconst_f16(8718.1), unconst_f16(1103.7)));
  var vf57: u32 = vf56;
  var vf58: u32 = vp2.f0[u32(dot(vec3h(unconst_f16(12151.6), unconst_f16(5651.0), unconst_f16(23117.8)), vec3h(vp2.f1)))];
  vp1 = modf(vec3h(vp2.f0));
  let ptr18: ptr<private, vec3h> = &vp1.whole;
  vp1 = modf(vec3h(f16((*ptr15)[u32(unconst_u32(241))])));
  out[u32(all(vec2<bool>(unconst_bool(false), unconst_bool(true))))] *= vec2h(determinant(mat4x4h(unconst_f16(13442.1), unconst_f16(46107.4), unconst_f16(4948.8), unconst_f16(-3666.8), unconst_f16(-21157.6), unconst_f16(14223.1), unconst_f16(4937.5), unconst_f16(3484.2), unconst_f16(25968.2), unconst_f16(12086.6), unconst_f16(29986.2), unconst_f16(14705.4), unconst_f16(6979.2), unconst_f16(12746.6), unconst_f16(8543.9), unconst_f16(27463.3))));
  let vf59: vec2f = sinh(vec2f(unconst_f32(0.02885), unconst_f32(0.2641)));
  let ptr19: ptr<private, vec3u> = &vp2.f0;
  let vf60: u32 = vp2.f0[bitcast<vec3u>(log2(vec3f(unconst_f32(0.2635), unconst_f32(0.08110), unconst_f32(0.4238)))).r];
  var vf61: u32 = pack4xU8(vec4u(unconst_u32(68), unconst_u32(9), unconst_u32(296), unconst_u32(27)));
  var vf62: vec4h = vf53;
  vf62 = vec4h(f16(vf59[u32(unconst_u32(215))]));
  return out;
}

@vertex
fn vertex4() -> VertexOutput2 {
  var out: VertexOutput2;
  let vf67: vec2f = radians(vec2f(unconst_f32(0.1878), unconst_f32(0.04315)));
  return out;
}

@vertex
fn vertex5(@location(3) a0: vec2i) -> VertexOutput3 {
  var out: VertexOutput3;
  var vf68 = fn1();
  out = VertexOutput3(vec4u(vp1.whole.bbbg), vec3u(vp1.whole)[2], vp1.whole.bbgr, vec4f(vp1.whole.rgrr));
  fn1();
  let vf69: f16 = distance(vec3h(unconst_f16(5173.6), unconst_f16(15112.7), unconst_f16(8679.0)), vp1.whole);
  vp1.fract = vec3h(f16(vp2.f0[1]));
  vp2 = S0(vp2.f0, vp2.f0);
  out.f18 -= vec4f(vp2.f1.xxyy);
  out.f15 *= unpack4xU8(vp2.f0[u32(unconst_u32(25))]);
  vf68[vec2u(floor(bitcast<vec2f>(vp2.f1.gg))).g] -= bitcast<vec2h>(a0[vp2.f1.y]);
  var vf70: f16 = radians(vec2h(fma(unpack2x16snorm(pack4xU8Clamp(vec4u(unconst_u32(630), unconst_u32(1), unconst_u32(32), unconst_u32(10)))), vec2f(vp2.f1.rb), vec2f(unconst_f32(0.03384), unconst_f32(0.01149))))[0]);
  let ptr23: ptr<private, S0> = &vp2;
  out.f16 <<= pack4xI8Clamp(firstTrailingBit(vec4i(i32(vf69))));
  out.f15 -= vec4u(asinh(vec4f(unconst_f32(0.02093), unconst_f32(0.02670), unconst_f32(0.3406), unconst_f32(0.04645))));
  vf70 *= radians(f16(unconst_f16(13271.9)));
  var vf71: vec2f = max(vec2f(vp1.whole.rg), vec2f(unconst_f32(0.1150), unconst_f32(0.06772)));
  vf70 = f16((*ptr23).f1[0]);
  vp2.f0 = vec3u((*ptr23).f0[pack4x8snorm(tan(vec4f(asinh(f32(vp2.f0.r)))))]);
  fn1();
  let ptr24: ptr<private, vec3u> = &vp2.f0;
  let ptr25: ptr<private, vec3u> = &(*ptr23).f1;
  vp2.f0 += vec3u(vp2.f0[u32(unconst_u32(42))]);
  vf71 = vec2f(f32(vf68[9][1]));
  return out;
}

@compute @workgroup_size(1, 1, 1)
fn compute4(a0: S0) {
  fn1();
  let vf72: vec3u = a0.f1;
  vw7 = S0(vec3u(vf72[pack4x8snorm(unpack4x8snorm(vp2.f1[u32(unconst_u32(385))]))]), vec3u(vf72[pack4x8snorm(unpack4x8snorm(vp2.f1[u32(unconst_u32(385))]))]));
  vp1.fract *= vec3h(vp2.f1);
  let vf73: S0 = a0;
  let ptr26: ptr<workgroup, vec3u> = &vw7.f0;
  vp2 = S0(vec3u(u32(mix(f16(unconst_f16(-2865.1)), vp1.whole.x, vec3h(a0.f1).g))), vec3u(u32(mix(f16(unconst_f16(-2865.1)), vp1.whole.x, vec3h(a0.f1).g))));
  let vf74: u32 = vf73.f0[pack4xI8(vec4i(unconst_i32(35), unconst_i32(97), unconst_i32(203), unconst_i32(244)))];
  var vf75 = fn2(array<array<array<array<f32, 1>, 8>, 1>, 2>(array<array<array<f32, 1>, 8>, 1>(array<array<f32, 1>, 8>(array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])))), array<array<array<f32, 1>, 8>, 1>(array<array<f32, 1>, 8>(array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(bitcast<f32>(vp2.f1[0])), array<f32, 1>(f32(vp2.f1[0]))))), vec2i(vp1.whole.gr));
  vw6[17] = asin(vec3f(step(f32(unconst_f32(0.3174)), f32(vw7.f0[u32(unconst_u32(450))]))))[0];
  vw7 = S0(vec3u((*&vw7).f0[u32(unconst_u32(147))]), vec3u((*&vw7).f0[u32(unconst_u32(147))]));
  var vf76: u32 = vw7.f1[u32(unconst_u32(146))];
  vw6[vf73.f0[u32(unconst_u32(208))]] = f32((*&vw7).f0[2]);
  var vf77 = fn1();
  var vf78: vec4h = log2(vec4h(f16(workgroupUniformLoad(&vw6)[17])));
}`,
  hints: {},
});
try {
computePassEncoder27.setBindGroup(0, bindGroup6, []);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(7, buffer20, 0, 291);
} catch {}
try {
renderBundleEncoder7.setVertexBuffer(6, buffer20, 0, 859);
} catch {}
let pipeline2 = device0.createRenderPipeline({
  layout: pipelineLayout0,
  fragment: {
  module: shaderModule0,
  entryPoint: 'fragment0',
  constants: {},
  targets: [{format: 'r8sint', writeMask: 0}],
},
  vertex: {
    module: shaderModule1,
    buffers: [
      {
        arrayStride: 364,
        stepMode: 'vertex',
        attributes: [
          {format: 'float32x2', offset: 32, shaderLocation: 5},
          {format: 'sint16x2', offset: 4, shaderLocation: 10},
        ],
      },
    ],
  },
  primitive: {topology: 'line-strip', stripIndexFormat: 'uint16', cullMode: 'back'},
});
try {
device0.queue.label = '\u{1f9f4}\u36db\u7173\u1c6d\u5074\u2ebd\u8e25\ue2d0\u347c\u1af6';
} catch {}
let bindGroup20 = device0.createBindGroup({
  label: '\u03de\u6fe0\u{1feda}\u9f64',
  layout: bindGroupLayout4,
  entries: [
    {binding: 171, resource: textureView11},
    {binding: 7, resource: {buffer: buffer10, offset: 256, size: 319}},
    {binding: 569, resource: textureView31},
  ],
});
let renderBundle7 = renderBundleEncoder7.finish();
try {
computePassEncoder13.setBindGroup(0, bindGroup2, new Uint32Array(112), 48, 0);
} catch {}
try {
computePassEncoder33.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(2, bindGroup17);
} catch {}
try {
renderPassEncoder0.setPipeline(pipeline2);
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let commandEncoder38 = device0.createCommandEncoder({});
let textureView46 = texture17.createView({});
let computePassEncoder34 = commandEncoder38.beginComputePass();
try {
computePassEncoder26.setBindGroup(0, bindGroup6);
} catch {}
try {
computePassEncoder4.end();
} catch {}
try {
renderPassEncoder6.setBindGroup(0, bindGroup20);
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer14, 'uint32', 12_540, 10_082);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(1, buffer27);
} catch {}
try {
commandEncoder7.copyTextureToBuffer({
  texture: texture20,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 1 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 981 */
  offset: 981,
  rowsPerImage: 164,
  buffer: buffer5,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(42).fill(167), /* required buffer size: 42 */
{offset: 42, rowsPerImage: 59}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer28 = device0.createBuffer({
  label: '\u0fc8\ueeb5\u585e',
  size: 323,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let renderPassEncoder7 = commandEncoder7.beginRenderPass({colorAttachments: [{view: textureView19, loadOp: 'clear', storeOp: 'discard'}]});
let sampler27 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 57.29,
  lodMaxClamp: 95.16,
});
try {
computePassEncoder25.setBindGroup(1, bindGroup15);
} catch {}
document.body.append(canvas0);
let texture54 = device0.createTexture({
  label: '\u9ab9\ua16a\uf2b2\u04ba\uf5da\ud4e3\uc569\uf856\u{1fd26}\uab1d\ueeb8',
  size: {width: 190, height: 2, depthOrArrayLayers: 55},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
try {
computePassEncoder34.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder7.setVertexBuffer(3, buffer10);
} catch {}
try {
computePassEncoder16.insertDebugMarker('\u1167');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 95, height: 1, depthOrArrayLayers: 27}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 1,
  origin: {x: 9, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let commandEncoder39 = device0.createCommandEncoder({});
let texture55 = device0.createTexture({
  size: [47, 1, 59],
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let externalTexture4 = device0.importExternalTexture({source: videoFrame1, colorSpace: 'display-p3'});
try {
{ clearResourceUsages(device0, computePassEncoder13); computePassEncoder13.dispatchWorkgroupsIndirect(buffer10, 1_308); };
} catch {}
try {
renderPassEncoder4.setBindGroup(0, bindGroup4, new Uint32Array(145), 8, 0);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
try {
commandEncoder39.copyBufferToTexture({
  /* bytesInLastRow: 2856 widthInBlocks: 357 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 3040 */
  offset: 3040,
  bytesPerRow: 5120,
  rowsPerImage: 776,
  buffer: buffer23,
}, {
  texture: texture10,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 49},
  aspect: 'all',
}, {width: 357, height: 0, depthOrArrayLayers: 1});
} catch {}
try {
commandEncoder39.resolveQuerySet(querySet2, 5, 6, buffer11, 0);
} catch {}
let commandEncoder40 = device0.createCommandEncoder({});
let texture56 = device0.createTexture({
  label: '\ue824\u0ba5\ub4e1\u0298\u{1fc8f}',
  size: {width: 380, height: 5, depthOrArrayLayers: 6},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder8 = commandEncoder39.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -386.2, g: 247.2, b: -489.4, a: 265.3, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder4.setIndexBuffer(buffer11, 'uint16', 22, 49);
} catch {}
try {
renderPassEncoder7.setPipeline(pipeline2);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
let texture57 = gpuCanvasContext0.getCurrentTexture();
let computePassEncoder35 = commandEncoder40.beginComputePass({});
try {
computePassEncoder34.setBindGroup(0, bindGroup9, new Uint32Array(24), 2, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder34); computePassEncoder34.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(1, buffer10, 0, 8);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 15}
*/
{
  source: imageData1,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 8, y: 0, z: 5},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 6, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup21 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 29, resource: textureView35},
    {binding: 359, resource: {buffer: buffer5, offset: 1536, size: 282}},
    {binding: 313, resource: textureView33},
    {binding: 150, resource: textureView33},
    {binding: 298, resource: {buffer: buffer12, offset: 0, size: 44}},
    {binding: 89, resource: sampler25},
    {binding: 140, resource: textureView28},
    {binding: 173, resource: {buffer: buffer21, offset: 2560, size: 3956}},
    {binding: 487, resource: textureView44},
  ],
});
try {
{ clearResourceUsages(device0, computePassEncoder26); computePassEncoder26.dispatchWorkgroups(4); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder34); computePassEncoder34.dispatchWorkgroupsIndirect(buffer12, 0); };
} catch {}
try {
computePassEncoder35.setPipeline(pipeline0);
} catch {}
let commandEncoder41 = device0.createCommandEncoder({});
let texture58 = gpuCanvasContext1.getCurrentTexture();
let textureView47 = texture36.createView({dimension: '2d', baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: 5});
try {
renderPassEncoder3.setViewport(2155.1656658982765, 0.11008215571970026, 281.59830321610497, 0.2009473494606273, 0.4382864247676803, 0.6134358334570582);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(2, buffer21, 0, 652);
} catch {}
try {
commandEncoder41.copyBufferToTexture({
  /* bytesInLastRow: 3 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1577 */
  offset: 1577,
  buffer: buffer10,
}, {
  texture: texture43,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
let shaderModule3 = device0.createShaderModule({
  label: '\u0779\u0eda\u3c03\u37a4\u77ab\u06ab\u0c6a\ud1b1\u5b59\u4e4a',
  code: `
enable f16;

requires packed_4x8_integer_dot_product;

enable f16;

struct VertexOutput4 {
  @builtin(position) f19: vec4f,
}

fn fn1() -> u32 {
  var out: u32;
  out = u32(trunc(vec3h(unconst_f16(27907.0), unconst_f16(21724.3), unconst_f16(12541.6))).x);
  out |= pack4x8unorm(log(vec3f(unconst_f32(-0.5475), unconst_f32(0.1139), unconst_f32(0.1940))).brbr);
  out -= u32(degrees(f16(unconst_f16(6352.6))));
  return out;
}

alias vec3b = vec3<bool>;

struct FragmentOutput2 {
  @location(0) f0: vec4f,
  @location(3) f1: u32,
}

fn unconst_i32(v: i32) -> i32 { return v; }

struct T0 {
  f0: array<u32>,
}

@group(0) @binding(182) var sam3: sampler;

@group(0) @binding(48) var st3: texture_storage_2d_array<r32float, read_write>;

fn fn0() -> VertexOutput4 {
  var out: VertexOutput4;
  let vf79: vec4u = min(unpack4xU8(pack4x8unorm(vec4f(unconst_f32(0.1986), unconst_f32(0.4483), unconst_f32(0.3482), unconst_f32(0.1003)))), vec4u(unconst_u32(67), unconst_u32(211), unconst_u32(14), unconst_u32(243)));
  let vf80: vec2f = unpack2x16unorm(u32(reverseBits(vec3i(unconst_i32(-437), unconst_i32(41), unconst_i32(55)))[2]));
  out.f19 = vec4f(round(vec2h(unconst_f16(26931.1), unconst_f16(-49667.5))).gggr);
  let vf81: f32 = vf80[1];
  let vf82: vec3h = sin(vec3h(unconst_f16(684.4), unconst_f16(9976.6), unconst_f16(2074.4)));
  var vf83: vec4u = min(vec4u(vf79[0]), vec4u(asin(vec4h(unconst_f16(-668.7), unconst_f16(972.0), unconst_f16(23708.1), unconst_f16(3003.2)))));
  var vf84: vec2f = vf80;
  var vf85: vec4u = min(vec4u(unconst_u32(87), unconst_u32(820), unconst_u32(172), unconst_u32(37)), vec4u(unconst_u32(2), unconst_u32(7), unconst_u32(94), unconst_u32(392)));
  let ptr27: ptr<function, vec4u> = &vf83;
  let vf86: i32 = firstLeadingBit(i32(unconst_i32(3)));
  var vf87: vec3h = atan2(vec3h(vf82[0]), vec3h(f16(vf80[bitcast<u32>(firstLeadingBit(i32(unconst_i32(131))))])));
  out.f19 = vec4f(vf81);
  let vf88: vec4u = vf79;
  vf83 <<= unpack4xU8(vf85[1]);
  let vf89: vec4u = vf79;
  var vf90: u32 = vf85[u32(unconst_u32(122))];
  vf84 *= unpack2x16float(vf83[u32(unconst_u32(113))]);
  return out;
}

fn unconst_bool(v: bool) -> bool { return v; }

var<workgroup> vw8: array<array<atomic<u32>, 1>, 14>;

var<workgroup> vw10: atomic<i32>;

var<workgroup> vw11: mat4x2f;

fn unconst_f32(v: f32) -> f32 { return v; }

struct T1 {
  @align(1) @size(60) f0: array<u32>,
}

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

var<workgroup> vw9: atomic<i32>;

@vertex @must_use
fn vertex6(@builtin(instance_index) a0: u32, @location(1) a1: vec4u) -> VertexOutput4 {
  var out: VertexOutput4;
  var vf91 = fn1();
  return out;
}

@fragment
fn fragment2(@location(14) @interpolate(flat) a0: vec4u) -> FragmentOutput2 {
  var out: FragmentOutput2;
  let vf92: u32 = a0[3];
  var vf93 = fn1();
  var vf94: vec2f = refract(vec2f(unconst_f32(0.5279), unconst_f32(0.06796)), vec2f(unconst_f32(0.1978), unconst_f32(0.1143)), textureLoad(st3, vec2i(unconst_i32(-116), unconst_i32(1)), i32(all(vec2<bool>(round(vec3h(unconst_f16(-5958.2), unconst_f16(23524.2), unconst_f16(3156.4))).gb)))).g);
  var vf95 = fn1();
  let vf96: u32 = a0[3];
  return out;
}

@compute @workgroup_size(5, 1, 2)
fn compute5() {
  atomicAnd(&vw10, i32(unconst_i32(133)));
  var vf97 = fn1();
  var vf98 = fn1();
  fn0();
  atomicMin(&vw8[bitcast<u32>(countLeadingZeros(vec3i(unconst_i32(163), unconst_i32(2), unconst_i32(370))).b)][u32((*&vw11)[3][vec4u(sqrt(vec4h(unconst_f16(1354.2), unconst_f16(9187.2), unconst_f16(7768.2), unconst_f16(571.5))))[0]])], u32(unconst_u32(53)));
  vw11 = mat4x2f(vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))], vw11[0][u32(atomicExchange(&vw9, i32(max(vec3h(unconst_f16(13508.8), unconst_f16(1606.2), unconst_f16(2330.4)), vec3h(unconst_f16(9017.4), unconst_f16(-4320.8), unconst_f16(12519.4))).y)))]);
  fn1();
  workgroupBarrier();
  fn1();
}`,
  sourceMap: {},
  hints: {},
});
let bindGroupLayout6 = device0.createBindGroupLayout({
  entries: [
    {binding: 49, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'storage', hasDynamicOffset: false }},
  ],
});
let buffer29 = device0.createBuffer({
  size: 7181,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let textureView48 = texture51.createView({dimension: '2d-array', mipLevelCount: 1});
let computePassEncoder36 = commandEncoder41.beginComputePass({});
try {
computePassEncoder36.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup17, new Uint32Array(986), 352, 0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer28, 'uint16', 26, 8);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(5, buffer8, 2_408);
} catch {}
let promise5 = device0.queue.onSubmittedWorkDone();
let bindGroup22 = device0.createBindGroup({
  label: '\u0235\uace1\u06fb\u0fa0',
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer10, offset: 512, size: 5764}}],
});
let commandEncoder42 = device0.createCommandEncoder();
let computePassEncoder37 = commandEncoder42.beginComputePass({});
try {
computePassEncoder26.setBindGroup(1, bindGroup5);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup20, new Uint32Array(10), 0, 0);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(1, buffer28, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture11,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(5_059).fill(23), /* required buffer size: 5_059 */
{offset: 15, bytesPerRow: 97, rowsPerImage: 52}, {width: 11, height: 0, depthOrArrayLayers: 2});
} catch {}
let bindGroup23 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView25}]});
let commandEncoder43 = device0.createCommandEncoder({label: '\u1ec9\u2eba\u0b3e\u{1fe59}\u{1f914}\ube26\u0455\u{1fef4}\u{1fdc1}\uae6a'});
let computePassEncoder38 = commandEncoder43.beginComputePass({});
try {
computePassEncoder10.setBindGroup(2, bindGroup20);
} catch {}
try {
computePassEncoder38.setPipeline(pipeline0);
} catch {}
try {
device0.queue.writeBuffer(buffer15, 52, new BigUint64Array(1701), 40, 20);
} catch {}
let buffer30 = device0.createBuffer({size: 3843, usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX});
let commandEncoder44 = device0.createCommandEncoder({});
let computePassEncoder39 = commandEncoder44.beginComputePass({label: '\ufc56\u07c2\u5a94\u0ae9\u0ee9'});
try {
computePassEncoder25.setBindGroup(1, bindGroup3, new Uint32Array(233), 6, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder27); computePassEncoder27.dispatchWorkgroupsIndirect(buffer23, 13_160); };
} catch {}
try {
computePassEncoder13.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder39.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setBindGroup(0, bindGroup9, []);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer11, 'uint32', 20, 82);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(4, buffer14);
} catch {}
let commandEncoder45 = device0.createCommandEncoder();
let texture59 = device0.createTexture({
  size: [190, 2, 1],
  mipLevelCount: 4,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder40 = commandEncoder45.beginComputePass({});
let externalTexture5 = device0.importExternalTexture({source: videoFrame1, colorSpace: 'display-p3'});
try {
computePassEncoder8.setBindGroup(3, bindGroup20);
} catch {}
try {
computePassEncoder40.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder7.executeBundles([renderBundle7]);
} catch {}
let commandEncoder46 = device0.createCommandEncoder({label: '\u9d0d\u1a01\u1918\u080a\u{1fa10}\u6277'});
let texture60 = device0.createTexture({
  size: [495, 1, 775],
  mipLevelCount: 3,
  dimension: '3d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler28 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 78.82,
  compare: 'greater-equal',
});
try {
computePassEncoder28.setBindGroup(1, bindGroup20);
} catch {}
try {
computePassEncoder27.end();
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer7, 'uint16', 74, 267);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(3, buffer8);
} catch {}
document.body.prepend(img0);
let bindGroup24 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer5, offset: 0, size: 260}}],
});
try {
computePassEncoder6.setBindGroup(2, bindGroup16);
} catch {}
try {
computePassEncoder16.setBindGroup(3, bindGroup16, new Uint32Array(1972), 376, 0);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(5, buffer14, 6_024, 4_875);
} catch {}
try {
commandEncoder46.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 10000 */
  offset: 10000,
  bytesPerRow: 37376,
  rowsPerImage: 474,
  buffer: buffer4,
}, {
  texture: texture59,
  mipLevel: 2,
  origin: {x: 7, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await promise2;
} catch {}
try {
globalThis.someLabel = buffer14.label;
} catch {}
let bindGroupLayout7 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 329,
      visibility: GPUShaderStage.COMPUTE,
      texture: { viewDimension: '2d', sampleType: 'sint', multisampled: false },
    },
    {
      binding: 267,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
  ],
});
let buffer31 = device0.createBuffer({size: 6667, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let textureView49 = texture40.createView({});
let computePassEncoder41 = commandEncoder32.beginComputePass({});
try {
computePassEncoder37.setBindGroup(1, bindGroup21, [0, 2304]);
} catch {}
try {
computePassEncoder41.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.setBlendConstant({ r: -662.9, g: 477.1, b: 333.0, a: 748.0, });
} catch {}
try {
commandEncoder46.resolveQuerySet(querySet3, 27, 13, buffer27, 3584);
} catch {}
let commandEncoder47 = device0.createCommandEncoder({});
let textureView50 = texture36.createView({mipLevelCount: 1, baseArrayLayer: 9, arrayLayerCount: 31});
let computePassEncoder42 = commandEncoder47.beginComputePass({label: '\u{1fc0c}\u00c2\u1cbe\u316c\uc3b2'});
let sampler29 = device0.createSampler({
  label: '\u{1fced}\u0a5d\u5052\u{1fb8a}\u4f42\u{1fc25}\ue923\u6028\u6e14',
  addressModeV: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 9.667,
  lodMaxClamp: 64.40,
});
try {
computePassEncoder21.setBindGroup(0, bindGroup6);
} catch {}
try {
computePassEncoder31.setBindGroup(2, bindGroup18, new Uint32Array(2593), 1_816, 0);
} catch {}
try {
computePassEncoder37.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.executeBundles([renderBundle1, renderBundle3]);
} catch {}
try {
renderPassEncoder1.setPipeline(pipeline2);
} catch {}
try {
commandEncoder46.copyBufferToTexture({
  /* bytesInLastRow: 18 widthInBlocks: 9 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 1368 */
  offset: 1368,
  buffer: buffer5,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 11, y: 0, z: 5},
  aspect: 'all',
}, {width: 9, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 8, depthOrArrayLayers: 15}
*/
{
  source: img0,
  origin: { x: 8, y: 0 },
  flipY: false,
}, {
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 2, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\ua3a3\u{1f9e8}\u0692\u7ec4\ufee0\ufd46\u{1fce9}\u280f\udebd\u05b9\u9a23';
} catch {}
let commandEncoder48 = device0.createCommandEncoder({});
let computePassEncoder43 = commandEncoder46.beginComputePass();
try {
computePassEncoder18.setBindGroup(0, bindGroup16, new Uint32Array(748), 3, 0);
} catch {}
try {
renderPassEncoder0.setPipeline(pipeline2);
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let bindGroup25 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler16}, {binding: 48, resource: textureView37}],
});
let texture61 = device0.createTexture({
  size: [95, 1, 1],
  mipLevelCount: 2,
  sampleCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder44 = commandEncoder48.beginComputePass({});
try {
computePassEncoder34.setBindGroup(0, bindGroup25, new Uint32Array(2220), 794, 0);
} catch {}
try {
computePassEncoder44.setPipeline(pipeline0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture23,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(378).fill(4), /* required buffer size: 378 */
{offset: 378}, {width: 36, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup26 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView8}, {binding: 50, resource: textureView15}],
});
let pipelineLayout4 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer32 = device0.createBuffer({
  size: 1901,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
try {
computePassEncoder43.setPipeline(pipeline0);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroup27 = device0.createBindGroup({
  label: '\ubc01\ub14d\ua413\u31e0\u0f0f\u0d19\u4273\u4558\ue7c0\u8e83\u0d91',
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer4, offset: 768, size: 8672}}],
});
let buffer33 = device0.createBuffer({
  size: 1771,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let textureView51 = texture59.createView({dimension: '2d-array', aspect: 'all', baseMipLevel: 0, mipLevelCount: 1});
try {
renderPassEncoder0.setIndexBuffer(buffer32, 'uint16', 1_756, 49);
} catch {}
try {
renderPassEncoder0.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(1, buffer30, 0);
} catch {}
let commandEncoder49 = device0.createCommandEncoder({label: '\u{1f995}\u53a0\u46be\u{1f6f9}\ud1b1\u{1ffd2}\u3547\u0138\u4975\uf913'});
let texture62 = device0.createTexture({
  size: {width: 3960, height: 1, depthOrArrayLayers: 1},
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let sampler30 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 77.07,
  lodMaxClamp: 81.80,
  maxAnisotropy: 11,
});
try {
computePassEncoder42.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup27);
} catch {}
try {
renderPassEncoder3.setBindGroup(1, bindGroup1, new Uint32Array(1386), 517, 0);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer23, 'uint32', 136, 2_997);
} catch {}
try {
commandEncoder49.copyTextureToTexture({
  texture: texture50,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 2},
  aspect: 'all',
},
{
  texture: texture59,
  mipLevel: 1,
  origin: {x: 57, y: 0, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder2.insertDebugMarker('\u2647');
} catch {}
try {
device0.queue.writeBuffer(buffer7, 596, new DataView(new ArrayBuffer(1693)), 772, 136);
} catch {}
let commandEncoder50 = device0.createCommandEncoder({});
let computePassEncoder45 = commandEncoder49.beginComputePass({label: '\u2405\u{1fa06}\u7859\u{1f93c}'});
let sampler31 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'linear',
  mipmapFilter: 'nearest',
  lodMinClamp: 38.53,
  lodMaxClamp: 54.57,
});
try {
computePassEncoder44.setBindGroup(2, bindGroup20, new Uint32Array(2562), 292, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder20); computePassEncoder20.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder45.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder0.setBindGroup(2, bindGroup7, []);
} catch {}
try {
renderPassEncoder7.end();
} catch {}
try {
commandEncoder7.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1668 */
  offset: 1668,
  bytesPerRow: 18432,
  buffer: buffer10,
}, {
  texture: texture20,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder7.resolveQuerySet(querySet3, 112, 45, buffer23, 768);
} catch {}
let bindGroup28 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 21, resource: textureView47},
    {binding: 7, resource: textureView7},
    {binding: 227, resource: {buffer: buffer5, offset: 256, size: 300}},
  ],
});
let commandEncoder51 = device0.createCommandEncoder({});
let renderPassEncoder9 = commandEncoder50.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: -735.7, g: -903.9, b: 866.0, a: -117.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
let sampler32 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 83.54,
  lodMaxClamp: 97.32,
  compare: 'less-equal',
});
try {
computePassEncoder34.end();
} catch {}
try {
commandEncoder7.copyTextureToBuffer({
  texture: texture12,
  mipLevel: 0,
  origin: {x: 385, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 2096 widthInBlocks: 131 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 624 */
  offset: 624,
  rowsPerImage: 80,
  buffer: buffer0,
}, {width: 655, height: 0, depthOrArrayLayers: 0});
} catch {}
let textureView52 = texture11.createView({dimension: '3d', baseArrayLayer: 0});
try {
renderPassEncoder6.setBindGroup(0, bindGroup19, new Uint32Array(2862), 287, 0);
} catch {}
try {
renderPassEncoder6.beginOcclusionQuery(51);
} catch {}
document.body.prepend(img0);
let commandEncoder52 = device0.createCommandEncoder({label: '\u{1fb69}\u6660\u6a82\u{1fc69}\u099a\u{1f9c9}\u1eae\ucfd0\ub638\u067a'});
let texture63 = device0.createTexture({
  size: [190, 2, 1],
  mipLevelCount: 1,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let computePassEncoder46 = commandEncoder51.beginComputePass({});
let renderPassEncoder10 = commandEncoder38.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: -653.6, g: -206.1, b: -365.0, a: 285.0, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
renderPassEncoder3.executeBundles([renderBundle0, renderBundle0, renderBundle2]);
} catch {}
try {
renderPassEncoder0.setStencilReference(16);
} catch {}
try {
renderPassEncoder6.setViewport(50.242537214933535, 0.5705065959732831, 36.493573815747695, 0.01878778733114517, 0.6827899411204295, 0.9194659222203116);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(6, buffer20, 0, 1_322);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
try {
commandEncoder7.copyBufferToBuffer(buffer32, 64, buffer31, 1320, 692);
} catch {}
try {
computePassEncoder39.pushDebugGroup('\u0e52');
} catch {}
try {
computePassEncoder39.popDebugGroup();
} catch {}
let buffer34 = device0.createBuffer({size: 14113, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM});
let renderPassEncoder11 = commandEncoder52.beginRenderPass({
  label: '\u{1fb3c}\u788f\udbb6\u{1f8e7}\u0d68\u0118\u{1fa8d}\uf372\u0f8e\u0eba',
  colorAttachments: [{view: textureView5, loadOp: 'clear', storeOp: 'discard'}],
});
try {
{ clearResourceUsages(device0, computePassEncoder12); computePassEncoder12.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup17, new Uint32Array(83), 12, 0);
} catch {}
try {
renderPassEncoder6.endOcclusionQuery();
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer33, 'uint16', 528, 110);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(7, buffer12, 24, 2);
} catch {}
try {
commandEncoder7.copyBufferToTexture({
  /* bytesInLastRow: 71 widthInBlocks: 71 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 4152 */
  offset: 4152,
  rowsPerImage: 634,
  buffer: buffer3,
}, {
  texture: texture1,
  mipLevel: 1,
  origin: {x: 96, y: 0, z: 0},
  aspect: 'all',
}, {width: 71, height: 1, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer35 = device0.createBuffer({
  size: 23701,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let renderPassEncoder12 = commandEncoder7.beginRenderPass({colorAttachments: [{view: textureView51, loadOp: 'load', storeOp: 'store'}], maxDrawCount: 156665992});
let sampler33 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMaxClamp: 71.61,
});
try {
computePassEncoder12.setBindGroup(0, bindGroup25, new Uint32Array(24), 2, 0);
} catch {}
try {
computePassEncoder46.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer27, 'uint16', 4_992, 770);
} catch {}
let shaderModule4 = device0.createShaderModule({
  code: `
requires unrestricted_pointer_parameters;

enable f16;

diagnostic(info, xyz);

fn fn1(a0: ptr<private, T1>) -> array<T1, 3> {
  var out: array<T1, 3>;
  var vf112: u32 = firstTrailingBit(vec3u(abs(vec3h(f16(any(bool(unconst_bool(true)))))))[1]);
  (*a0).f0 += i32(pack4xU8Clamp(firstTrailingBit(vec2u(unconst_u32(103), unconst_u32(353))).xxxy));
  fn0();
  textureStore(st4, vec2i(unconst_i32(50), unconst_i32(58)), i32(unconst_i32(260)), vec4f(vec4f(faceForward(vec3h(unconst_f16(8382.4), unconst_f16(3177.2), unconst_f16(9268.2)), vec3h(unconst_f16(6106.0), unconst_f16(9030.9), unconst_f16(35322.5)), vec3h(unconst_f16(23283.2), unconst_f16(19960.2), unconst_f16(10719.2))).grgg)));
  vf112 = vec4u(textureLoad(st4, vec2i((*a0).f0), i32(unconst_i32(544)))).r;
  let vf113: i32 = dot4I8Packed(u32(unconst_u32(141)), u32(unconst_u32(84)));
  return out;
}

alias vec3b = vec3<bool>;

fn unconst_i32(v: i32) -> i32 { return v; }

fn unconst_u32(v: u32) -> u32 { return v; }

struct T1 {
  @size(8) f0: i32,
}

fn fn0() {
  var vf99: i32 = clamp(countOneBits(vec2i(extractBits(vec3u(pack4xU8Clamp(vec4u(unconst_u32(50), unconst_u32(54), unconst_u32(21), unconst_u32(123)))), u32(unconst_u32(452)), u32(unconst_u32(0))).zz))[1], bitcast<vec2i>(pow(atan(vec3f(unconst_f32(0.1379), unconst_f32(0.2724), unconst_f32(0.1197))).rb, vec2f(unconst_f32(0.2784), unconst_f32(0.2789)))).x, countOneBits(vec2i(unconst_i32(150), unconst_i32(165)))[0]);
  let vf100: vec2i = countOneBits(vec2i(unconst_i32(48), unconst_i32(90)));
  var vf101: i32 = clamp(i32(unconst_i32(295)), i32(unconst_i32(72)), i32(unconst_i32(28)));
  let vf102: i32 = vf100[u32(unconst_u32(141))];
  var vf103: u32 = extractBits(pack2x16snorm(unpack2x16snorm(u32(unconst_u32(138)))), u32(countOneBits(vec2i(vf101)).x), pack4xI8Clamp(vec4i(unconst_i32(216), unconst_i32(6), unconst_i32(596), unconst_i32(98))));
  vf103 &= bitcast<vec2u>(countOneBits(vec2i(unconst_i32(61), unconst_i32(185)))).x;
  vf103 += u32(vf99);
  vf101 = i32(vf103);
  vf103 += bitcast<u32>(transpose(mat3x4f(bitcast<f32>(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), bitcast<f32>(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), bitcast<f32>(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), bitcast<f32>(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), f32(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x)), bitcast<f32>(clamp(i32(unconst_i32(2)), i32(unconst_i32(176)), countOneBits(vec2i(unconst_i32(81), unconst_i32(9))).x))))[2][2]);
  vf101 ^= vec4i(saturate(vec4h(f16(clamp(i32(unconst_i32(154)), i32(unconst_i32(384)), i32(unconst_i32(127))))))).a;
  vf99 &= vec3i(atan(bitcast<vec3f>(extractBits(vec3u(saturate(vec4h(unconst_f16(-9084.4), unconst_f16(4540.5), unconst_f16(1834.0), unconst_f16(1227.9))).abr), u32(unconst_u32(54)), u32(unconst_u32(136)))))).g;
  let vf104: vec3f = atan(pow(vec2f(f32(vf100[1])), vec2f(unconst_f32(-0.06184), unconst_f32(0.1039))).grg);
  var vf105: vec4h = saturate(vec4h(f16(pack4xU8Clamp(vec4u(unconst_u32(4), unconst_u32(64), unconst_u32(56), unconst_u32(141))))));
  let ptr28: ptr<function, u32> = &vf103;
  var vf106: f32 = vf104[2];
  vf105 *= vec4h(f16(vf104[u32(unconst_u32(3))]));
  let vf107: u32 = pack4xU8Clamp(vec4u(unconst_u32(10), unconst_u32(119), unconst_u32(132), unconst_u32(45)));
  vf103 ^= pack2x16snorm(unpack2x16snorm(pack4xI8Clamp(vec4i(clamp(i32(vf106), i32(unconst_i32(95)), i32(unconst_i32(1)))))));
  vf103 <<= pack4x8snorm(unpack4x8snorm(u32(unconst_u32(6))));
  let vf108: u32 = extractBits(bitcast<u32>(countOneBits(bitcast<vec2i>(atan(vec3f(insertBits(countOneBits(vec2i(unconst_i32(1), unconst_i32(-30))).xxyx, vec4i(unconst_i32(20), unconst_i32(15), unconst_i32(402), unconst_i32(95)), u32(unconst_u32(369)), u32(unconst_u32(309))).gbb)).rb))[0]), u32(unconst_u32(209)), vf103);
  var vf109: vec3f = vf104;
  let vf110: i32 = vf102;
  var vf111: i32 = vf100[u32(unconst_u32(132))];
}

fn unconst_bool(v: bool) -> bool { return v; }

var<workgroup> vw15: FragmentOutput3;

fn unconst_f16(v: f16) -> f16 { return v; }

struct FragmentOutput3 {
  @location(5) @interpolate(flat, centroid) f0: vec2u,
  @location(0) f1: vec4f,
}

@group(0) @binding(182) var sam4: sampler;

@group(0) @binding(48) var st4: texture_storage_2d_array<r32float, read_write>;

var<workgroup> vw14: mat3x2f;

struct T0 {
  @size(8) f0: array<u32>,
}

var<workgroup> vw12: f16;

fn unconst_f32(v: f32) -> f32 { return v; }

var<workgroup> vw13: array<f16, 1>;

@vertex
fn vertex7() -> @builtin(position) vec4f {
  var out: vec4f;
  out = vec4f(bitcast<f32>(firstLeadingBit(i32(unconst_i32(167)))));
  var vf114: vec4i = unpack4xI8(bitcast<u32>(dot4I8Packed(u32(unconst_u32(327)), u32(unconst_u32(4)))));
  var vf115: vec3i = sign(vec3i(dot4I8Packed(u32(unconst_u32(408)), u32(unconst_u32(202)))));
  let vf116: vec3f = quantizeToF16(vec3f(unconst_f32(0.02793), unconst_f32(0.1261), unconst_f32(0.07112)));
  vf114 = bitcast<vec4i>(firstLeadingBit(vec2u(unconst_u32(128), unconst_u32(24))).xyyx);
  var vf117: vec3h = ceil(vec3h(unconst_f16(12994.8), unconst_f16(11324.1), unconst_f16(3392.4)));
  vf114 = vec4i(step(vec3h(unconst_f16(15626.1), unconst_f16(5629.7), unconst_f16(22515.9)), vec3h(unconst_f16(12870.2), unconst_f16(11698.3), unconst_f16(3034.5))).ggrg);
  var vf118: f16 = exp2(f16(unconst_f16(80.66)));
  fn0();
  let vf119: vec2u = firstLeadingBit(vec2u(unconst_u32(330), unconst_u32(28)));
  vf117 *= vec3h(firstLeadingBit(vec2u(bitcast<u32>(vf114[countTrailingZeros(vec3u(unconst_u32(2), unconst_u32(58), unconst_u32(112)))[1]]))).rrg);
  vf114 = vec4i(dot4I8Packed(u32(unconst_u32(67)), u32(unconst_u32(176))));
  vf114 = vec4i(bitcast<i32>(vf119[1]));
  fn0();
  vf114 = vec4i(ceil(vec3h(unconst_f16(14122.6), unconst_f16(9126.8), unconst_f16(9717.1))).xyxz);
  out -= vec4f(floor(vec2h(quantizeToF16(vec3f(unconst_f32(-0.8123), unconst_f32(0.00678), unconst_f32(0.1266))).zx)).ggrr);
  let vf120: f32 = vf116[2];
  fn0();
  fn0();
  fn0();
  let ptr29: ptr<function, vec4i> = &vf114;
  fn0();
  vf117 = vec3h(ceil(vec3f(unconst_f32(0.7103), unconst_f32(0.01651), unconst_f32(-0.08199))));
  out -= vec4f(bitcast<f32>((*ptr29)[2]));
  return out;
}

@fragment
fn fragment3() -> FragmentOutput3 {
  var out: FragmentOutput3;
  fn0();
  out.f0 |= vec2u(u32(dot4I8Packed(u32(unconst_u32(285)), u32(unconst_u32(430)))));
  out.f1 += asinh(vec4f(f32(textureNumLayers(st4))));
  out.f1 -= unpack4x8snorm(pack4xI8(vec4i(smoothstep(bitcast<vec4h>(textureDimensions(st4)), vec4h(unconst_f16(21168.8), unconst_f16(847.6), unconst_f16(891.9), unconst_f16(17021.3)), vec4h(unconst_f16(14801.0), unconst_f16(-4604.0), unconst_f16(8572.1), unconst_f16(4545.4))))));
  out.f0 = vec2u(unpack2x16unorm(u32(smoothstep(vec4h(f16(textureNumLayers(st4))), vec4h(unconst_f16(1606.8), unconst_f16(4491.6), unconst_f16(21264.1), unconst_f16(-356.0)), vec4h(unconst_f16(11311.6), unconst_f16(14499.8), unconst_f16(10018.0), unconst_f16(9705.5))).b)));
  out.f1 = reflect(vec2f(unconst_f32(0.2040), unconst_f32(0.1441)), vec2f(unconst_f32(0.03313), unconst_f32(0.1452))).rggg;
  discard;
  let vf121: u32 = pack4xI8(vec4i(atan(vec4h(unconst_f16(1213.6), unconst_f16(5463.7), unconst_f16(22350.8), unconst_f16(6909.4)))));
  let vf122: vec4u = countTrailingZeros(vec4u(unconst_u32(9), unconst_u32(208), unconst_u32(80), unconst_u32(62)));
  out = FragmentOutput3(bitcast<vec2u>(atan(cross(vec3h(unconst_f16(2799.3), unconst_f16(4508.2), unconst_f16(10609.8)), vec3h(vf122.gba)).grrg)), vec4f(atan(cross(vec3h(unconst_f16(2799.3), unconst_f16(4508.2), unconst_f16(10609.8)), vec3h(vf122.gba)).grrg)));
  out.f1 = vec4f(f32(acosh(f16(unconst_f16(3083.3)))));
  out.f1 = vec4f(cross(vec3h(unconst_f16(31898.0), unconst_f16(1931.4), unconst_f16(297.4)), vec3h(unconst_f16(8267.6), unconst_f16(9715.0), unconst_f16(14018.7))).yyzz);
  fn0();
  out.f1 = unpack4x8snorm(vf122[pack4xU8Clamp(bitcast<vec4u>(textureLoad(st4, vec2i(exp(vec2h(unconst_f16(13295.9), unconst_f16(7465.4)))), vec2i(textureDimensions(st4)).y)))]);
  return out;
}`,
  sourceMap: {},
});
let pipelineLayout5 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder53 = device0.createCommandEncoder({});
let textureView53 = texture39.createView({dimension: '1d'});
let textureView54 = texture55.createView({baseArrayLayer: 11, arrayLayerCount: 25});
let computePassEncoder47 = commandEncoder53.beginComputePass({});
try {
computePassEncoder45.setBindGroup(1, bindGroup8);
} catch {}
try {
computePassEncoder3.setBindGroup(1, bindGroup4, new Uint32Array(1216), 68, 0);
} catch {}
try {
computePassEncoder47.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder9.executeBundles([renderBundle5, renderBundle1, renderBundle7, renderBundle3, renderBundle2, renderBundle0]);
} catch {}
try {
renderPassEncoder12.setBindGroup(3, bindGroup10, new Uint32Array(1683), 109, 2);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(1, buffer14, 0, 2_761);
} catch {}
try {
gpuCanvasContext0.configure({device: device0, format: 'rgba16float', usage: GPUTextureUsage.RENDER_ATTACHMENT, colorSpace: 'srgb'});
} catch {}
let sampler34 = device0.createSampler({
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 6.289,
  lodMaxClamp: 86.79,
  compare: 'less-equal',
  maxAnisotropy: 15,
});
try {
computePassEncoder19.setBindGroup(2, bindGroup18, new Uint32Array(1876), 374, 0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer18, 'uint32', 888, 1_233);
} catch {}
try {
renderPassEncoder0.setPipeline(pipeline2);
} catch {}
try {
gpuCanvasContext1.configure({device: device0, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC});
} catch {}
try {
  await promise5;
} catch {}
try {
computePassEncoder8.setBindGroup(1, bindGroup21, [0, 1280]);
} catch {}
try {
renderPassEncoder11.setBindGroup(1, bindGroup18);
} catch {}
try {
renderPassEncoder4.setViewport(1007.6256775586362, 0.4211243270897065, 359.1280292782971, 0.11582465469278283, 0.789907783910484, 0.9588309465611795);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer33, 'uint32', 152, 73);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let querySet4 = device0.createQuerySet({type: 'occlusion', count: 1134});
let textureView55 = texture56.createView({
  label: '\ud0ca\u{1ff7f}\ud237\u0fd4\u2e0c\u{1f933}\ufae4',
  dimension: '2d-array',
  baseArrayLayer: 1,
  arrayLayerCount: 2,
});
try {
computePassEncoder40.setBindGroup(3, bindGroup10, [256, 512]);
} catch {}
try {
renderPassEncoder3.setBindGroup(0, bindGroup5);
} catch {}
try {
renderPassEncoder3.setPipeline(pipeline2);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let sampler35 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 22.30,
  compare: 'always',
});
try {
renderPassEncoder6.setBindGroup(2, bindGroup0, new Uint32Array(405), 14, 0);
} catch {}
try {
renderPassEncoder8.setBlendConstant({ r: 462.3, g: 947.8, b: 137.5, a: 51.95, });
} catch {}
let bindGroup29 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer2, offset: 2816, size: 112}}],
});
let buffer36 = device0.createBuffer({
  size: 10986,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let textureView56 = texture0.createView({dimension: '2d'});
let externalTexture6 = device0.importExternalTexture({source: videoFrame0, colorSpace: 'srgb'});
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroups(1, 1); };
} catch {}
try {
renderPassEncoder4.setBindGroup(0, bindGroup21, [0, 2304]);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: canvas0,
  origin: { x: 98, y: 2 },
  flipY: true,
}, {
  texture: texture59,
  mipLevel: 0,
  origin: {x: 30, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 25, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder54 = device0.createCommandEncoder();
let texture64 = device0.createTexture({size: [8, 8, 15], format: 'rgba32float', usage: GPUTextureUsage.COPY_DST, viewFormats: []});
let computePassEncoder48 = commandEncoder54.beginComputePass({});
let sampler36 = device0.createSampler({
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 63.27,
  lodMaxClamp: 78.86,
  compare: 'always',
  maxAnisotropy: 10,
});
let externalTexture7 = device0.importExternalTexture({source: videoFrame1});
try {
computePassEncoder40.setBindGroup(0, bindGroup19, new Uint32Array(1614), 137, 0);
} catch {}
try {
computePassEncoder48.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer32, 'uint32', 364, 949);
} catch {}
try {
  await promise4;
} catch {}
let bindGroup30 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer12, offset: 0, size: 4}},
    {binding: 329, resource: textureView18},
  ],
});
let sampler37 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 84.47,
  maxAnisotropy: 4,
});
try {
renderPassEncoder3.beginOcclusionQuery(5);
} catch {}
try {
renderPassEncoder2.setViewport(1035.0637561778217, 0.923377439147144, 1106.8860014843133, 0.07183622156933107, 0.9200132694579272, 0.9427334726157915);
} catch {}
try {
renderPassEncoder6.setIndexBuffer(buffer23, 'uint16', 828, 6_100);
} catch {}
try {
renderPassEncoder10.setVertexBuffer(0, buffer28, 0);
} catch {}
let bindGroup31 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer12, offset: 0, size: 20}}],
});
let sampler38 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 86.93,
  lodMaxClamp: 90.56,
  maxAnisotropy: 6,
});
try {
renderPassEncoder3.setBindGroup(1, bindGroup0);
} catch {}
try {
renderPassEncoder1.setIndexBuffer(buffer11, 'uint32', 36, 11);
} catch {}
let commandEncoder55 = device0.createCommandEncoder({});
let computePassEncoder49 = commandEncoder55.beginComputePass({});
try {
computePassEncoder43.setBindGroup(0, bindGroup19, new Uint32Array(1231), 69, 0);
} catch {}
try {
computePassEncoder49.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setBindGroup(2, bindGroup5, new Uint32Array(366), 31, 0);
} catch {}
try {
renderPassEncoder3.endOcclusionQuery();
} catch {}
try {
renderPassEncoder0.executeBundles([renderBundle6, renderBundle6]);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(0, buffer28, 12);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 23, height: 1, depthOrArrayLayers: 1}
*/
{
  source: canvas0,
  origin: { x: 31, y: 13 },
  flipY: true,
}, {
  texture: texture59,
  mipLevel: 3,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 12, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\u0f4a\uf2e8\ub7a6\u74c1\u{1f94a}\u265b\u54fc\u{1f9a3}\u{1f64e}\u868b';
} catch {}
let bindGroup32 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler33}, {binding: 48, resource: textureView37}],
});
let commandEncoder56 = device0.createCommandEncoder({});
let computePassEncoder50 = commandEncoder56.beginComputePass({});
let sampler39 = device0.createSampler({
  label: '\u0f68\u92c8\u602b\u{1f646}\u0142',
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 23.74,
  lodMaxClamp: 61.49,
});
try {
renderPassEncoder2.setBindGroup(0, bindGroup18, new Uint32Array(170), 24, 0);
} catch {}
try {
renderPassEncoder6.draw(0, 1, 0, 117_056_840);
} catch {}
try {
renderPassEncoder6.drawIndexedIndirect(buffer5, 860);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
document.body.prepend(canvas0);
let buffer37 = device0.createBuffer({
  label: '\u{1fcb1}\u6786\u{1fc60}\u32d5\ubb64\u02b1\ub936',
  size: 6758,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let commandEncoder57 = device0.createCommandEncoder({});
let texture65 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 90},
  mipLevelCount: 2,
  format: 'rgba32float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder13 = commandEncoder57.beginRenderPass({
  colorAttachments: [{
  view: textureView48,
  clearValue: { r: 495.2, g: 245.2, b: -891.6, a: -645.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet1,
});
let sampler40 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 64.31,
  lodMaxClamp: 69.37,
});
try {
computePassEncoder24.setBindGroup(0, bindGroup27, []);
} catch {}
try {
computePassEncoder0.setBindGroup(0, bindGroup22, new Uint32Array(8670), 369, 0);
} catch {}
try {
computePassEncoder50.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder6.setBindGroup(3, bindGroup3);
} catch {}
try {
renderPassEncoder6.draw(0, 68, 0, 416_981_263);
} catch {}
try {
renderPassEncoder6.drawIndexed(566, 84, 270, 82_286_246, 373_456_559);
} catch {}
try {
computePassEncoder26.setBindGroup(3, bindGroup13);
} catch {}
try {
renderPassEncoder10.end();
} catch {}
try {
renderPassEncoder3.beginOcclusionQuery(9);
} catch {}
try {
renderPassEncoder3.endOcclusionQuery();
} catch {}
try {
renderPassEncoder6.drawIndirect(buffer12, 32);
} catch {}
try {
renderPassEncoder9.setVertexBuffer(2, buffer18, 648, 163);
} catch {}
try {
commandEncoder38.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 192 */
  offset: 192,
  bytesPerRow: 3840,
  rowsPerImage: 44,
  buffer: buffer1,
}, {
  texture: texture53,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 2},
  aspect: 'all',
}, {width: 0, height: 1, depthOrArrayLayers: 1});
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let videoFrame2 = new VideoFrame(offscreenCanvas0, {timestamp: 0});
let bindGroup33 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler0}, {binding: 48, resource: textureView4}],
});
let texture66 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 1},
  format: 'r8sint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let textureView57 = texture25.createView({mipLevelCount: 2, baseArrayLayer: 0});
try {
renderPassEncoder4.setBindGroup(1, bindGroup18);
} catch {}
try {
renderPassEncoder13.setBindGroup(1, bindGroup2, new Uint32Array(2672), 104, 0);
} catch {}
try {
renderPassEncoder6.draw(0, 116, 0, 37_040_330);
} catch {}
try {
renderPassEncoder6.drawIndirect(buffer29, 1_184);
} catch {}
try {
device0.queue.writeBuffer(buffer32, 372, new BigUint64Array(4928), 1137, 24);
} catch {}
let texture67 = device0.createTexture({
  size: [348, 36, 19],
  format: 'astc-12x12-unorm-srgb',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let textureView58 = texture21.createView({mipLevelCount: 1, baseArrayLayer: 1, arrayLayerCount: 1});
let renderPassEncoder14 = commandEncoder38.beginRenderPass({
  label: '\u6fd9\u{1fd8f}\u39af\u{1f934}\u{1f745}\u4662\ud0f1\u337e\u0f28\ud369',
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 352.9, g: -624.4, b: -227.3, a: 600.9, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet3,
});
try {
computePassEncoder41.setBindGroup(2, bindGroup18);
} catch {}
try {
renderPassEncoder6.drawIndexed(1_099, 17, 195, 127_634_744, 138_151_199);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: videoFrame1,
  origin: { x: 1, y: 0 },
  flipY: true,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 33, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout8 = device0.createBindGroupLayout({entries: [{binding: 33, visibility: GPUShaderStage.COMPUTE, externalTexture: {}}]});
try {
renderPassEncoder6.draw(0, 105, 0, 611_008_559);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'opaque',
});
} catch {}
let videoFrame3 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt2020-ncl', primaries: 'unspecified', transfer: 'smpte170m'} });
let commandEncoder58 = device0.createCommandEncoder({});
let renderPassEncoder15 = commandEncoder58.beginRenderPass({
  label: '\u676e\u0deb\u{1fac3}\uac9d',
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: 190.3, g: 627.2, b: -439.6, a: 478.4, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
try {
{ clearResourceUsages(device0, computePassEncoder26); computePassEncoder26.dispatchWorkgroupsIndirect(buffer28, 4); };
} catch {}
try {
computePassEncoder26.end();
} catch {}
try {
renderPassEncoder9.setBindGroup(2, bindGroup8, new Uint32Array(518), 71, 0);
} catch {}
try {
renderPassEncoder6.draw(0, 500, 0, 473_700_012);
} catch {}
try {
renderPassEncoder6.drawIndexed(226, 719, 248, 653_696_471, 1_896_622_745);
} catch {}
try {
renderPassEncoder6.drawIndexedIndirect(buffer7, 384);
} catch {}
try {
renderPassEncoder6.setVertexBuffer(3, buffer8, 0, 3_973);
} catch {}
try {
device0.pushErrorScope('internal');
} catch {}
try {
commandEncoder31.copyTextureToTexture({
  texture: texture50,
  mipLevel: 0,
  origin: {x: 0, y: 2, z: 0},
  aspect: 'all',
},
{
  texture: texture64,
  mipLevel: 0,
  origin: {x: 4, y: 2, z: 0},
  aspect: 'all',
},
{width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let bindGroupLayout9 = device0.createBindGroupLayout({
  label: '\u0e4a\u6f7e\u0b83\u0654\ub20b\u9a68\u1d71\u{1fd64}\u0f1b\u00b6',
  entries: [
    {
      binding: 357,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'unfilterable-float', multisampled: false },
    },
  ],
});
try {
computePassEncoder32.setBindGroup(0, bindGroup33);
} catch {}
try {
computePassEncoder17.setBindGroup(0, bindGroup12, new Uint32Array(1154), 131, 0);
} catch {}
try {
renderPassEncoder14.setBindGroup(3, bindGroup29);
} catch {}
try {
renderPassEncoder6.end();
} catch {}
try {
renderPassEncoder9.beginOcclusionQuery(108);
} catch {}
try {
renderPassEncoder9.endOcclusionQuery();
} catch {}
try {
renderPassEncoder3.executeBundles([renderBundle3]);
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer10, 'uint32', 4_188, 342);
} catch {}
try {
renderPassEncoder1.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(5, buffer12);
} catch {}
try {
commandEncoder2.copyTextureToTexture({
  texture: texture51,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture43,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
},
{width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder31.resolveQuerySet(querySet2, 11, 9, buffer18, 768);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: canvas0,
  origin: { x: 8, y: 8 },
  flipY: false,
}, {
  texture: texture62,
  mipLevel: 0,
  origin: {x: 863, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 56, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
textureView2.label = '\u2422\u06df\ue612\u5864\u0b52\u0b43\u0fbf\u{1fb80}\u0f99\u{1f9a0}';
} catch {}
let commandEncoder59 = device0.createCommandEncoder({});
let texture68 = device0.createTexture({
  label: '\u0825\u{1f837}',
  size: [95],
  sampleCount: 1,
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder51 = commandEncoder31.beginComputePass({});
let renderPassEncoder16 = commandEncoder2.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: -852.0, g: 299.3, b: -785.1, a: -453.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet1,
  maxDrawCount: 58324926,
});
try {
computePassEncoder37.setBindGroup(1, bindGroup30);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder32); computePassEncoder32.dispatchWorkgroupsIndirect(buffer9, 0); };
} catch {}
try {
computePassEncoder51.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder13.setBindGroup(3, bindGroup13, new Uint32Array(208), 10, 0);
} catch {}
try {
renderPassEncoder13.setPipeline(pipeline2);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.writeBuffer(buffer20, 2356, new Int16Array(22631), 3331, 72);
} catch {}
let bindGroup34 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 48, resource: textureView4}, {binding: 182, resource: sampler6}],
});
let commandEncoder60 = device0.createCommandEncoder();
let textureView59 = texture29.createView({dimension: '2d', baseArrayLayer: 13});
let texture69 = device0.createTexture({
  label: '\uc01a\ua1e4\u3d05\u018a\uc6d4',
  size: [47, 1, 1],
  mipLevelCount: 3,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler41 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 23.38,
  lodMaxClamp: 40.39,
  compare: 'never',
});
try {
computePassEncoder24.setBindGroup(0, bindGroup24);
} catch {}
let sampler42 = device0.createSampler({
  label: '\u{1f83b}\u66c3\u{1fc9a}\u019e\u{1f9cf}\uec6e',
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 25.39,
  maxAnisotropy: 18,
});
try {
renderPassEncoder12.setBindGroup(3, bindGroup8, new Uint32Array(2106), 1_359, 0);
} catch {}
document.body.append(img0);
let bindGroup35 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView25}]});
let commandBuffer1 = commandEncoder59.finish();
let texture70 = device0.createTexture({
  size: {width: 495},
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder52 = commandEncoder60.beginComputePass({label: '\u01d4\u{1fdc0}\ud440\u0d07\u{1fa28}\ue390\u00c6'});
let sampler43 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  lodMinClamp: 13.11,
  lodMaxClamp: 60.43,
});
try {
computePassEncoder31.setBindGroup(1, bindGroup31);
} catch {}
try {
computePassEncoder50.setBindGroup(0, bindGroup5, new Uint32Array(3679), 171, 0);
} catch {}
try {
renderPassEncoder16.executeBundles([renderBundle3, renderBundle5]);
} catch {}
try {
device0.queue.writeBuffer(buffer25, 11400, new Int16Array(22750), 3692, 2236);
} catch {}
let commandEncoder61 = device0.createCommandEncoder();
let computePassEncoder53 = commandEncoder61.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder40); computePassEncoder40.dispatchWorkgroupsIndirect(buffer22, 6_916); };
} catch {}
try {
computePassEncoder40.end();
} catch {}
try {
computePassEncoder52.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder9.setBindGroup(1, bindGroup19);
} catch {}
try {
renderPassEncoder16.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(4, buffer33, 1_072, 56);
} catch {}
try {
adapter0.label = '\u0465\uedf2\u00d1\uc2e3\u0307';
} catch {}
let bindGroup36 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer14, offset: 3584, size: 5404}}],
});
let commandEncoder62 = device0.createCommandEncoder();
let textureView60 = texture39.createView({});
let computePassEncoder54 = commandEncoder62.beginComputePass({});
try {
computePassEncoder45.setBindGroup(2, bindGroup8, new Uint32Array(10000), 3_460, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder13); computePassEncoder13.dispatchWorkgroupsIndirect(buffer9, 0); };
} catch {}
try {
computePassEncoder13.end();
} catch {}
try {
renderPassEncoder12.executeBundles([renderBundle4, renderBundle4, renderBundle4]);
} catch {}
let commandBuffer2 = commandEncoder20.finish({});
let texture71 = device0.createTexture({size: [990, 1, 77], dimension: '3d', format: 'r8sint', usage: GPUTextureUsage.RENDER_ATTACHMENT});
let textureView61 = texture44.createView({baseArrayLayer: 2, arrayLayerCount: 5});
let renderPassEncoder17 = commandEncoder45.beginRenderPass({
  colorAttachments: [{
  view: textureView51,
  clearValue: { r: -691.9, g: 964.3, b: -468.1, a: 77.87, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder12.setBindGroup(3, bindGroup1, new Uint32Array(1842), 96, 0);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer27, 'uint16', 3_386, 482);
} catch {}
try {
device0.queue.submit([commandBuffer2]);
} catch {}
let bindGroup37 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView3}]});
let textureView62 = texture32.createView({dimension: '2d', baseArrayLayer: 27});
let textureView63 = texture41.createView({
  label: '\u12d8\u0af3\u8277\u{1ff16}\u8c89\u{1ff62}\u3e4e',
  dimension: '2d',
  baseMipLevel: 0,
  mipLevelCount: 1,
  baseArrayLayer: 0,
});
let externalTexture8 = device0.importExternalTexture({
  label: '\u{1fc66}\u5426\uf0a4\u{1f995}\u{1f63c}\u4838\u0ee2\u{1ffd3}\u8661\u8fec',
  source: videoFrame0,
  colorSpace: 'srgb',
});
try {
computePassEncoder54.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder13.setVertexBuffer(0, buffer35, 7_624);
} catch {}
let imageData7 = new ImageData(120, 12);
let buffer38 = device0.createBuffer({
  label: '\ud39d\u05cf\u{1fe78}\u0e97',
  size: 4875,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM,
});
let commandEncoder63 = device0.createCommandEncoder({});
let texture72 = device0.createTexture({
  label: '\u{1fabe}\u0fc2\u0339\u0f95\u8db1',
  size: {width: 495, height: 1, depthOrArrayLayers: 1},
  format: 'rgba32float',
  usage: GPUTextureUsage.STORAGE_BINDING,
});
let textureView64 = texture63.createView({format: 'rgba32float'});
let sampler44 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 80.23,
  lodMaxClamp: 98.94,
});
try {
computePassEncoder37.setBindGroup(2, bindGroup14, new Uint32Array(500), 216, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder21); computePassEncoder21.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder53.setPipeline(pipeline0);
} catch {}
try {
commandEncoder63.copyBufferToTexture({
  /* bytesInLastRow: 256 widthInBlocks: 16 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 2464 */
  offset: 2464,
  bytesPerRow: 40448,
  rowsPerImage: 119,
  buffer: buffer10,
}, {
  texture: texture48,
  mipLevel: 1,
  origin: {x: 50, y: 18, z: 0},
  aspect: 'all',
}, {width: 160, height: 12, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder63.copyTextureToBuffer({
  texture: texture39,
  mipLevel: 0,
  origin: {x: 8, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 2591 */
  offset: 2591,
  bytesPerRow: 16384,
  buffer: buffer27,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.submit([commandBuffer1]);
} catch {}
let pipelineLayout6 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer39 = device0.createBuffer({
  size: 1357,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder64 = device0.createCommandEncoder({});
let renderPassEncoder18 = commandEncoder64.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -439.0, g: -407.6, b: 735.3, a: -730.4, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
  maxDrawCount: 203064622,
});
try {
computePassEncoder6.setBindGroup(2, bindGroup24, new Uint32Array(1159), 135, 0);
} catch {}
try {
commandEncoder63.copyTextureToTexture({
  texture: texture50,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 0},
  aspect: 'all',
},
{
  texture: texture62,
  mipLevel: 0,
  origin: {x: 419, y: 0, z: 0},
  aspect: 'all',
},
{width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder29.pushDebugGroup('\u3f08');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData5,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture62,
  mipLevel: 0,
  origin: {x: 782, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let shaderModule5 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

requires packed_4x8_integer_dot_product;

@group(0) @binding(48) var st5: texture_storage_2d_array<r32float, read_write>;

@id(40281) override override1: bool;

fn unconst_i32(v: i32) -> i32 { return v; }

fn fn1() -> VertexOutput5 {
  var out: VertexOutput5;
  vp3.f21 += fma(vec4f(unconst_f32(0.1772), unconst_f32(0.04337), unconst_f32(-0.02837), unconst_f32(0.00586)), vec4f(unconst_f32(0.3128), unconst_f32(0.05890), unconst_f32(0.02160), unconst_f32(0.3302)), vec4f(f32(tan(f16(unconst_f16(9949.3))))));
  let vf129: f32 = log2(f32(unconst_f32(0.7127)));
  fn0();
  var vf130: vec2u = reverseBits(vec2u(unconst_u32(71), unconst_u32(54)));
  var vf131 = fn0();
  let vf132: u32 = vf130[u32(unconst_u32(87))];
  var vf133: bool = override1;
  return out;
  _ = override1;
}

var<workgroup> vw16: array<atomic<u32>, 23>;

@group(0) @binding(182) var sam5: sampler;

struct T0 {
  f0: array<u32, 1>,
}

fn unconst_bool(v: bool) -> bool { return v; }

@id(60741) override override0: u32;

fn unconst_u32(v: u32) -> u32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

fn fn2() -> mat3x3f {
  var out: mat3x3f;
  let vf134: u32 = atomicLoad(&vw16[22]);
  return out;
}

fn fn0() -> T0 {
  var out: T0;
  out = T0(array<u32, 1>(bitcast<u32>(vp3.f21[2])));
  out.f0[u32(unconst_u32(9))] = bitcast<u32>(tanh(f32(unconst_f32(0.01237))));
  out.f0[vp3.f20[u32(unconst_u32(103))]] = u32(vp3.f21[2]);
  var vf123: i32 = dot(vec4i(sign(vec3f(unconst_f32(0.3321), unconst_f32(0.4212), unconst_f32(-0.00362))).bbgr), vec4i(unconst_i32(25), unconst_i32(34), unconst_i32(263), unconst_i32(68)));
  var vf124: f32 = tanh(f32(unconst_f32(0.07908)));
  out.f0[bitcast<vec3u>(atan2(vec3f(unconst_f32(0.1230), unconst_f32(0.06584), unconst_f32(0.1969)), vec3f(unconst_f32(0.1187), unconst_f32(0.1827), unconst_f32(0.4877)))).r] |= pack4xU8(vp3.f20);
  vf123 *= bitcast<i32>(sqrt(sqrt(vec3f(unconst_f32(0.1259), unconst_f32(0.1364), unconst_f32(0.2537)))).z);
  let vf125: vec3f = step(vp3.f21.arr, vec3f(unconst_f32(-0.2666), unconst_f32(0.1920), unconst_f32(0.1641)));
  vp3.f20 += bitcast<vec4u>(sqrt(sqrt(vec3f(unconst_f32(0.00558), unconst_f32(-0.09827), unconst_f32(0.04125)))).yyxz);
  var vf126: i32 = dot(vec4i(unconst_i32(112), unconst_i32(96), unconst_i32(330), unconst_i32(8)), vec4i(unconst_i32(170), unconst_i32(-271), unconst_i32(162), unconst_i32(29)));
  let vf127: i32 = dot(vec4i(unconst_i32(154), unconst_i32(55), unconst_i32(67), unconst_i32(85)), vec4i(unconst_i32(87), unconst_i32(594), unconst_i32(239), unconst_i32(135)));
  var vf128: f32 = vf125[u32(unconst_u32(547))];
  return out;
}

var<private> vp3: VertexOutput5 = VertexOutput5(vec4u(), vec4f());

struct FragmentOutput4 {
  @location(0) @interpolate(linear, center) f0: vec4f,
  @location(6) @interpolate(flat, center) f1: vec4f,
}

fn unconst_f32(v: f32) -> f32 { return v; }

struct VertexOutput5 {
  @location(9) @interpolate(flat) f20: vec4u,
  @builtin(position) f21: vec4f,
}

@vertex @must_use
fn vertex8() -> VertexOutput5 {
  var out: VertexOutput5;
  fn0();
  out = VertexOutput5(vec4u(u32(vp3.f21[0])), vec4f(vp3.f21[0]));
  let ptr30: ptr<private, vec4u> = &vp3.f20;
  out.f20 = unpack4xU8(pack2x16unorm(vec2f(unconst_f32(0.04924), unconst_f32(0.01529))));
  out.f20 &= vec4u(pack4x8snorm(vec4f(unconst_f32(0.08102), unconst_f32(0.00053), unconst_f32(0.02696), unconst_f32(0.02466))));
  out.f20 -= vec4u(bitcast<u32>(fma(f32(unconst_f32(0.02250)), fract(vec4f(unconst_f32(0.3066), unconst_f32(0.09223), unconst_f32(-0.06427), unconst_f32(0.1816)))[1], vp3.f21[3])));
  let vf135: vec2h = radians(vec2h(unconst_f16(10392.5), unconst_f16(23764.0)));
  out.f21 += vec4f(f32(pack2x16unorm(vec2f(unconst_f32(0.2479), unconst_f32(0.01282)))));
  var vf136: f16 = vf135[0];
  out.f20 = vec4u(radians(vec2h(vp3.f20.rr)).rgrr);
  var vf137: f32 = vp3.f21[u32(unconst_u32(18))];
  vp3.f20 |= unpack4xU8(u32(tanh(ceil(vp3.f21.wxy).x)));
  let vf138: u32 = (*ptr30)[2];
  fn0();
  out.f20 = unpack4xU8(u32(atanh(f16(unconst_f16(1551.3)))));
  out.f21 = unpack4x8unorm(abs(u32(unconst_u32(175))));
  let ptr31: ptr<private, VertexOutput5> = &vp3;
  let ptr32: ptr<private, vec4f> = &(*ptr31).f21;
  fn0();
  vp3 = VertexOutput5(unpack4xU8(pack4x8snorm(vec4f(unconst_f32(0.02573), unconst_f32(0.04529), unconst_f32(0.2938), unconst_f32(0.1209)))), unpack4x8snorm(pack4x8snorm(vec4f(unconst_f32(0.02573), unconst_f32(0.04529), unconst_f32(0.2938), unconst_f32(0.1209)))));
  vp3 = VertexOutput5(vec4u(ceil(vec3f(f32(vf135[bitcast<u32>(radians(vec2h(unconst_f16(11664.9), unconst_f16(18416.8))))]))).yyzy), ceil(vec3f(f32(vf135[bitcast<u32>(radians(vec2h(unconst_f16(11664.9), unconst_f16(18416.8))))]))).bbrr);
  fn0();
  fn0();
  out.f20 *= (*ptr30);
  return out;
}

@fragment
fn fragment4() -> FragmentOutput4 {
  var out: FragmentOutput4;
  vp3.f21 = ceil(vec4f(unconst_f32(0.1277), unconst_f32(0.1637), unconst_f32(-0.00697), unconst_f32(0.08189)));
  let vf139: f32 = tan(f32(unconst_f32(0.1419)));
  var vf140 = fn0();
  var vf141: vec2f = smoothstep(vec2f(unconst_f32(0.2967), unconst_f32(0.1747)), vec2f(unconst_f32(0.03073), unconst_f32(0.1871)), vec2f(unconst_f32(0.3293), unconst_f32(0.1081)));
  out.f1 += vec4f(f32(override1));
  vf141 -= vp3.f21.yy;
  textureStore(st5, vec2i(unconst_i32(23), unconst_i32(503)), i32(unconst_i32(30)), vec4f(vec4f(unconst_f32(0.1340), unconst_f32(-0.00581), unconst_f32(0.1544), unconst_f32(0.1612))));
  var vf142: vec2h = pow(vec2h(unconst_f16(13543.2), unconst_f16(8575.5)), bitcast<vec2h>(textureNumLayers(st5)));
  var vf143 = fn1();
  out.f0 = vec4f(vf141[u32(unconst_u32(166))]);
  let vf144: vec2h = pow(bitcast<vec2h>(textureNumLayers(st5)), vec2h(unconst_f16(13893.7), unconst_f16(19201.7)));
  var vf145 = fn0();
  let ptr33: ptr<function, array<u32, 1>> = &vf140.f0;
  out.f0 -= vec4f(vf143.f21[vec3u(step(vec3f(unconst_f32(0.03529), unconst_f32(0.4385), unconst_f32(0.03584)), vec3f(firstLeadingBit(vec4i(vf144.gggr)).zwx)))[1]]);
  vf142 = bitcast<vec2h>(vf143.f20[2]);
  vf140.f0[u32(unconst_u32(90))] *= vf145.f0[0];
  let vf146: f16 = vf142[0];
  var vf147 = fn1();
  var vf148 = fn1();
  let ptr34: ptr<function, u32> = &vf140.f0[0];
  fn0();
  var vf149 = fn1();
  var vf150 = fn0();
  vf149 = VertexOutput5(unpack4xU8(u32(vf144[u32(unconst_u32(219))])), vec4f(f32(vf144[u32(unconst_u32(219))])));
  let ptr35: ptr<function, u32> = &vf150.f0[0];
  return out;
  _ = override1;
}

@compute @workgroup_size(1, 1, 1)
fn compute6() {
  let vf151: vec3h = refract(vec3h(unconst_f16(2991.7), unconst_f16(1879.1), unconst_f16(23728.3)), sinh(ldexp(vec4h(unconst_f16(18800.5), unconst_f16(19537.6), unconst_f16(1662.9), unconst_f16(5548.6)), vec4i(unconst_i32(58), unconst_i32(249), unconst_i32(-246), unconst_i32(141)))).www, f16(unconst_f16(-1330.9)));
  fn2();
  let vf152: bool = override1;
  fn2();
  fn2();
  _ = override1;
}`,
  sourceMap: {},
});
let buffer40 = device0.createBuffer({
  size: 2792,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
  mappedAtCreation: true,
});
let commandEncoder65 = device0.createCommandEncoder();
let renderPassEncoder19 = commandEncoder65.beginRenderPass({colorAttachments: [{view: textureView64, loadOp: 'clear', storeOp: 'store'}]});
try {
renderPassEncoder16.setBindGroup(2, bindGroup28, new Uint32Array(4648), 29, 0);
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle3, renderBundle2, renderBundle7]);
} catch {}
try {
renderPassEncoder13.setIndexBuffer(buffer2, 'uint32', 128, 2_272);
} catch {}
try {
buffer5.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer16, 4020, new DataView(new ArrayBuffer(42659)), 6814, 252);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture8,
  mipLevel: 0,
  origin: {x: 348, y: 0, z: 9},
  aspect: 'all',
}, new Uint8Array(19_874).fill(188), /* required buffer size: 19_874 */
{offset: 188, bytesPerRow: 579, rowsPerImage: 17}, {width: 62, height: 0, depthOrArrayLayers: 3});
} catch {}
let texture73 = device0.createTexture({
  label: '\u0e82\u0210\u0209\u3b47\u0bda\uc3be',
  size: [8, 8, 15],
  mipLevelCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView65 = texture70.createView({baseMipLevel: 0});
let computePassEncoder55 = commandEncoder63.beginComputePass({});
let renderBundleEncoder8 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true});
let sampler45 = device0.createSampler({
  label: '\u0e57\u03c9\u6d66\u0209',
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 72.38,
  maxAnisotropy: 9,
});
try {
computePassEncoder35.setBindGroup(1, bindGroup35, new Uint32Array(699), 19, 0);
} catch {}
try {
computePassEncoder55.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder19.executeBundles([renderBundle4]);
} catch {}
try {
renderBundleEncoder8.setBindGroup(2, bindGroup7);
} catch {}
try {
renderBundleEncoder8.setIndexBuffer(buffer11, 'uint32', 4, 3);
} catch {}
try {
renderBundleEncoder8.setVertexBuffer(5, buffer35, 0, 3_017);
} catch {}
let pipeline3 = await device0.createComputePipelineAsync({layout: pipelineLayout0, compute: {module: shaderModule1, entryPoint: 'compute3', constants: {}}});
let commandEncoder66 = device0.createCommandEncoder({});
let texture74 = device0.createTexture({
  size: [1980],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler46 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 84.24,
  lodMaxClamp: 85.10,
  maxAnisotropy: 2,
});
try {
commandEncoder66.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 1520 */
  offset: 1520,
  buffer: buffer35,
}, {
  texture: texture69,
  mipLevel: 2,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture45,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(177_841).fill(98), /* required buffer size: 177_841 */
{offset: 586, bytesPerRow: 909, rowsPerImage: 65}, {width: 162, height: 0, depthOrArrayLayers: 4});
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let computePassEncoder56 = commandEncoder66.beginComputePass({});
let renderBundle8 = renderBundleEncoder8.finish({label: '\u01e2\u0a06\uf4b5\u{1fd54}\u0a14\u{1fc56}\u03fc'});
try {
computePassEncoder18.setBindGroup(0, bindGroup19);
} catch {}
try {
renderPassEncoder14.setViewport(3898.119865415148, 0.7352501082661067, 1.3095257155180968, 0.07238906927614945, 0.21250811456722762, 0.9362763586338215);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(3, buffer30, 0, 389);
} catch {}
try {
renderPassEncoder8.insertDebugMarker('\u2a47');
} catch {}
let buffer41 = device0.createBuffer({
  size: 979,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
try {
computePassEncoder41.setBindGroup(1, bindGroup3, []);
} catch {}
try {
computePassEncoder21.end();
} catch {}
try {
renderPassEncoder8.setScissorRect(1, 0, 24, 0);
} catch {}
try {
renderPassEncoder18.setPipeline(pipeline2);
} catch {}
await gc();
let commandEncoder67 = device0.createCommandEncoder({});
let computePassEncoder57 = commandEncoder67.beginComputePass({});
let renderPassEncoder20 = commandEncoder27.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -622.4, g: -651.7, b: 89.33, a: -436.1, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder18.setBindGroup(2, bindGroup37);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder32); computePassEncoder32.dispatchWorkgroupsIndirect(buffer23, 4_744); };
} catch {}
try {
renderPassEncoder2.setBindGroup(0, bindGroup37);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(2, buffer27, 0, 1_663);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let bindGroup38 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 50, resource: textureView15}, {binding: 276, resource: textureView13}],
});
let commandEncoder68 = device0.createCommandEncoder({});
let computePassEncoder58 = commandEncoder68.beginComputePass();
let externalTexture9 = device0.importExternalTexture({source: videoFrame3});
try {
computePassEncoder56.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder17.executeBundles([renderBundle4, renderBundle4, renderBundle4]);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer14, 'uint32', 336, 5_815);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(1, buffer35, 0);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
let textureView66 = texture60.createView({aspect: 'all', baseMipLevel: 0, mipLevelCount: 1});
try {
computePassEncoder53.setBindGroup(0, bindGroup9);
} catch {}
try {
computePassEncoder8.setBindGroup(1, bindGroup15, new Uint32Array(4021), 568, 0);
} catch {}
try {
renderPassEncoder15.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder13.setVertexBuffer(6, buffer12, 56);
} catch {}
try {
computePassEncoder29.popDebugGroup();
} catch {}
let bindGroup39 = device0.createBindGroup({
  label: '\ua2da\u9ee3\u7d46\u0db6\u235b\ufcec\u{1f603}\u0143\u75a6',
  layout: bindGroupLayout4,
  entries: [
    {binding: 569, resource: textureView31},
    {binding: 7, resource: {buffer: buffer40, offset: 0}},
    {binding: 171, resource: textureView11},
  ],
});
let textureView67 = texture16.createView({dimension: 'cube', mipLevelCount: 1, baseArrayLayer: 3});
try {
{ clearResourceUsages(device0, computePassEncoder32); computePassEncoder32.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder2.setBindGroup(3, bindGroup30, []);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer30, 'uint32', 652, 100);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
await gc();
let bindGroup40 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer32, offset: 0, size: 408}},
    {binding: 329, resource: textureView21},
  ],
});
let textureView68 = texture29.createView({baseArrayLayer: 3, arrayLayerCount: 2});
try {
renderPassEncoder0.setIndexBuffer(buffer2, 'uint32', 1_024, 163);
} catch {}
let bindGroup41 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 329, resource: textureView21},
    {binding: 267, resource: {buffer: buffer28, offset: 0, size: 124}},
  ],
});
let commandEncoder69 = device0.createCommandEncoder({});
let textureView69 = texture61.createView({dimension: '2d-array', mipLevelCount: 1});
let computePassEncoder59 = commandEncoder69.beginComputePass();
let sampler47 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 52.03,
  lodMaxClamp: 64.21,
  maxAnisotropy: 10,
});
try {
renderPassEncoder19.setBindGroup(0, bindGroup6);
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup27, new Uint32Array(1389), 29, 0);
} catch {}
try {
renderPassEncoder0.setVertexBuffer(6, buffer37, 0, 198);
} catch {}
let texture75 = device0.createTexture({
  size: [95, 1, 27],
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder25.setBindGroup(3, bindGroup39, new Uint32Array(699), 99, 0);
} catch {}
try {
renderPassEncoder12.setPipeline(pipeline1);
} catch {}
try {
device0.queue.writeBuffer(buffer4, 4972, new Int16Array(19100), 1233, 524);
} catch {}
let textureView70 = texture59.createView({dimension: '2d-array', mipLevelCount: 1});
try {
computePassEncoder32.setBindGroup(1, bindGroup36);
} catch {}
try {
computePassEncoder33.setBindGroup(0, bindGroup17, new Uint32Array(390), 17, 0);
} catch {}
try {
computePassEncoder57.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder11.setBindGroup(0, bindGroup37, []);
} catch {}
try {
renderPassEncoder1.setBindGroup(2, bindGroup41, new Uint32Array(813), 17, 0);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer33, 'uint32', 1_252, 146);
} catch {}
try {
sampler6.label = '\u{1f7b1}\u{1f703}\u7fe4\ueeaf\u23ca';
} catch {}
let querySet5 = device0.createQuerySet({type: 'occlusion', count: 443});
try {
computePassEncoder59.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup35);
} catch {}
try {
textureView31.label = '\u0235\u{1f890}';
} catch {}
let textureView71 = texture54.createView({format: 'rgba32float', baseMipLevel: 0, mipLevelCount: 1});
try {
computePassEncoder58.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder4.executeBundles([renderBundle7, renderBundle7]);
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer23, 'uint32', 168, 3_823);
} catch {}
try {
buffer35.unmap();
} catch {}
try {
globalThis.someLabel = bindGroup15.label;
} catch {}
let textureView72 = texture35.createView({format: 'r32float', baseArrayLayer: 0});
try {
adapter0.label = '\u07f0\u38ad\ud32c\uc8e2\u6b0b\u074d\uc3fe\u{1f790}\u{1fb1e}\u0159\ufe0f';
} catch {}
try {
computePassEncoder20.end();
} catch {}
try {
renderPassEncoder0.setIndexBuffer(buffer5, 'uint16', 722, 535);
} catch {}
let buffer42 = device0.createBuffer({
  label: '\u4ef0\u{1fe4b}\u0722\u09ed\u07c3\u{1fa91}\u62dc\u{1f901}\u0eca\u{1fb8f}\u{1fa12}',
  size: 12996,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,
});
let textureView73 = texture62.createView({dimension: '2d-array', aspect: 'all', arrayLayerCount: 1});
let computePassEncoder60 = commandEncoder25.beginComputePass({});
try {
computePassEncoder30.setBindGroup(1, bindGroup27);
} catch {}
try {
computePassEncoder3.setBindGroup(2, bindGroup3, new Uint32Array(408), 35, 0);
} catch {}
try {
renderPassEncoder18.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder18.setViewport(0.763593246826324, 0.7304529410315369, 7.20917734654011, 0.09870075448172547, 0.45188825328331506, 0.774897216138948);
} catch {}
let bindGroupLayout10 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 57,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '2d' },
    },
  ],
});
let querySet6 = device0.createQuerySet({type: 'occlusion', count: 1});
try {
computePassEncoder60.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder2.setBindGroup(2, bindGroup8);
} catch {}
try {
renderPassEncoder16.setStencilReference(787);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer33, 'uint16', 150, 133);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(4, buffer21, 1_356);
} catch {}
try {
computePassEncoder32.end();
} catch {}
try {
renderPassEncoder9.setBindGroup(3, bindGroup23);
} catch {}
try {
renderPassEncoder0.setBindGroup(0, bindGroup6, new Uint32Array(4472), 2_451, 0);
} catch {}
try {
commandEncoder36.clearBuffer(buffer2);
} catch {}
let bindGroup42 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView0}]});
let textureView74 = texture67.createView({
  label: '\u389d\u{1fad1}\ua8c3\u6c1e\u622f\u079b\u{1fc89}',
  dimension: '2d',
  aspect: 'all',
  mipLevelCount: 1,
  baseArrayLayer: 3,
});
let renderPassEncoder21 = commandEncoder36.beginRenderPass({
  colorAttachments: [{
  view: textureView70,
  clearValue: { r: -498.9, g: -635.7, b: 384.3, a: 889.4, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler48 = device0.createSampler({
  label: '\u8736\ub48f\u{1f71f}\uc07b\u{1fd53}\u03cb\u3f1b\u{1fce6}\u7ff6\u0cf5\u8ac9',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 2.152,
  lodMaxClamp: 89.67,
});
try {
{ clearResourceUsages(device0, computePassEncoder17); computePassEncoder17.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder20.setIndexBuffer(buffer23, 'uint32', 7_444, 2_435);
} catch {}
try {
renderPassEncoder18.setPipeline(pipeline2);
} catch {}
let texture76 = device0.createTexture({
  size: [495],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let renderBundleEncoder9 = device0.createRenderBundleEncoder({label: '\ud4f5\u0440\u0242\u0c2d', colorFormats: ['rgba32float'], depthReadOnly: true});
try {
computePassEncoder56.setBindGroup(2, bindGroup13);
} catch {}
try {
computePassEncoder17.end();
} catch {}
try {
renderPassEncoder0.drawIndexedIndirect(buffer9, 4);
} catch {}
try {
renderBundleEncoder9.setIndexBuffer(buffer29, 'uint16', 704, 811);
} catch {}
try {
renderBundleEncoder9.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder38.setBindGroup(2, bindGroup5, new Uint32Array(1012), 635, 0);
} catch {}
try {
computePassEncoder14.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder19.setBindGroup(2, bindGroup0);
} catch {}
try {
renderPassEncoder0.draw(0, 106, 2, 351_250_318);
} catch {}
try {
renderPassEncoder0.drawIndexedIndirect(buffer41, 276);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder9.setBindGroup(1, bindGroup39, new Uint32Array(4351), 193, 0);
} catch {}
try {
renderBundleEncoder9.setIndexBuffer(buffer28, 'uint32', 40, 40);
} catch {}
try {
renderBundleEncoder9.setVertexBuffer(5, buffer28, 56, 10);
} catch {}
await gc();
let renderPassEncoder22 = commandEncoder23.beginRenderPass({
  label: '\ueed4\u7f8f\uc3bb\u{1f664}\u695e\u25e0\ue92b\u3284\ue89c',
  colorAttachments: [{view: textureView70, loadOp: 'clear', storeOp: 'discard'}],
  maxDrawCount: 123594976,
});
let sampler49 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMinClamp: 47.40,
  lodMaxClamp: 56.57,
});
try {
renderPassEncoder3.setBindGroup(0, bindGroup12, new Uint32Array(160), 1, 0);
} catch {}
try {
renderPassEncoder13.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder0.draw(3, 280, 3, 1_658_075_463);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture67,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(6_910).fill(146), /* required buffer size: 6_910 */
{offset: 956, bytesPerRow: 63, rowsPerImage: 47}, {width: 24, height: 12, depthOrArrayLayers: 3});
} catch {}
let bindGroupLayout11 = device0.createBindGroupLayout({
  label: '\u0e72\u022e\u4dc3\ub18e\u1d8b\u0369\uc60c',
  entries: [
    {
      binding: 76,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32uint', access: 'read-write', viewDimension: '2d' },
    },
    {
      binding: 295,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d-array', sampleType: 'sint', multisampled: false },
    },
  ],
});
let bindGroup43 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 21, resource: textureView1},
    {binding: 7, resource: textureView7},
    {binding: 227, resource: {buffer: buffer4, offset: 2560, size: 3580}},
  ],
});
let texture77 = device0.createTexture({
  label: '\ued27\ua641',
  size: {width: 190, height: 2, depthOrArrayLayers: 1},
  format: 'r32uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let renderBundle9 = renderBundleEncoder9.finish({});
let externalTexture10 = device0.importExternalTexture({source: videoFrame0, colorSpace: 'display-p3'});
try {
renderPassEncoder17.setScissorRect(23, 0, 0, 1);
} catch {}
try {
renderPassEncoder0.draw(3, 197, 1, 370_696_514);
} catch {}
try {
renderPassEncoder0.drawIndexedIndirect(buffer20, 756);
} catch {}
try {
renderPassEncoder0.drawIndirect(buffer12, 44);
} catch {}
try {
renderPassEncoder2.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder8.setVertexBuffer(0, buffer12, 40);
} catch {}
try {
gpuCanvasContext1.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_SRC, colorSpace: 'display-p3'});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture4,
  mipLevel: 3,
  origin: {x: 74, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(121).fill(195), /* required buffer size: 121 */
{offset: 121, rowsPerImage: 104}, {width: 22, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder70 = device0.createCommandEncoder({});
let textureView75 = texture77.createView({aspect: 'all'});
let texture78 = device0.createTexture({
  size: [990, 1, 1],
  sampleCount: 1,
  format: 'rgba32float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder61 = commandEncoder70.beginComputePass({label: '\u37cc\u01d1\u{1fdc3}\u028f\uf2df\u{1fa3c}\ua598\ucde0\u0e09\u55e2\u5d8e'});
let renderBundleEncoder10 = device0.createRenderBundleEncoder({colorFormats: ['rgba32float'], depthReadOnly: true});
try {
renderPassEncoder18.executeBundles([renderBundle3, renderBundle1, renderBundle6, renderBundle3, renderBundle0]);
} catch {}
try {
renderPassEncoder0.drawIndexed(9, 76, 7, 382_419_734, 702_226_353);
} catch {}
try {
renderPassEncoder0.drawIndexedIndirect(buffer7, 108);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer35, 'uint32', 8_024, 37);
} catch {}
try {
renderPassEncoder14.setPipeline(pipeline2);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let renderBundle10 = renderBundleEncoder10.finish();
try {
{ clearResourceUsages(device0, computePassEncoder18); computePassEncoder18.dispatchWorkgroups(4); };
} catch {}
try {
renderPassEncoder8.setBindGroup(3, bindGroup40, new Uint32Array(4786), 134, 0);
} catch {}
try {
renderPassEncoder0.draw(8, 737, 0, 22_328_213);
} catch {}
try {
renderPassEncoder0.drawIndexed(125, 43, 0, 632_493_332, 553_120_180);
} catch {}
try {
buffer18.unmap();
} catch {}
let textureView76 = texture62.createView({});
let sampler50 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 5.120,
  lodMaxClamp: 24.94,
  compare: 'equal',
});
try {
computePassEncoder61.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder9.setBindGroup(0, bindGroup28);
} catch {}
try {
renderPassEncoder0.draw(1, 104, 0, 179_919_276);
} catch {}
try {
renderPassEncoder0.drawIndexedIndirect(buffer28, 48);
} catch {}
try {
renderPassEncoder0.drawIndirect(buffer28, 120);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
let texture79 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 27},
  mipLevelCount: 4,
  dimension: '3d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder29.setBindGroup(0, bindGroup32);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder18); computePassEncoder18.dispatchWorkgroupsIndirect(buffer30, 900); };
} catch {}
try {
renderPassEncoder17.executeBundles([renderBundle10]);
} catch {}
try {
renderPassEncoder0.draw(4, 167, 1, 63_370_513);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let textureView77 = texture2.createView({dimension: '2d', baseArrayLayer: 23});
try {
computePassEncoder0.setBindGroup(0, bindGroup30, new Uint32Array(38), 1, 0);
} catch {}
try {
renderPassEncoder0.end();
} catch {}
try {
commandEncoder4.copyBufferToBuffer(buffer10, 184, buffer17, 3020, 396);
} catch {}
try {
device0.queue.writeBuffer(buffer16, 1896, new Int16Array(1234), 156, 116);
} catch {}
let img1 = await imageWithData(88, 46, '#10101010', '#20202020');
let renderPassEncoder23 = commandEncoder4.beginRenderPass({
  colorAttachments: [{
  view: textureView70,
  clearValue: { r: -617.2, g: -470.5, b: 201.2, a: -185.7, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder12.end();
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer2, 'uint16', 1_216, 69);
} catch {}
try {
commandEncoder18.clearBuffer(buffer21, 10400, 96);
} catch {}
let imageData8 = new ImageData(44, 36);
try {
renderPassEncoder9.beginOcclusionQuery(83);
} catch {}
try {
renderPassEncoder13.executeBundles([renderBundle1, renderBundle1]);
} catch {}
try {
renderPassEncoder16.setPipeline(pipeline2);
} catch {}
try {
commandEncoder18.copyBufferToTexture({
  /* bytesInLastRow: 64 widthInBlocks: 16 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 5400 */
  offset: 5400,
  bytesPerRow: 4096,
  buffer: buffer26,
}, {
  texture: texture58,
  mipLevel: 0,
  origin: {x: 3, y: 54, z: 0},
  aspect: 'all',
}, {width: 16, height: 26, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder18.copyTextureToBuffer({
  texture: texture38,
  mipLevel: 0,
  origin: {x: 326, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 51 widthInBlocks: 51 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 864 */
  offset: 864,
  buffer: buffer15,
}, {width: 51, height: 0, depthOrArrayLayers: 1});
} catch {}
let commandEncoder71 = device0.createCommandEncoder();
let sampler51 = device0.createSampler({label: '\u7c1f\u0f38\u09c6', addressModeV: 'clamp-to-edge', lodMinClamp: 1.440});
try {
renderPassEncoder9.endOcclusionQuery();
} catch {}
try {
renderPassEncoder16.setScissorRect(359, 0, 100, 0);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer11, 'uint16', 176, 73);
} catch {}
let videoFrame4 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt709', primaries: 'jedecP22Phosphors', transfer: 'smpte240m'} });
let texture80 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 28},
  format: 'rgba32float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder62 = commandEncoder71.beginComputePass();
let externalTexture11 = device0.importExternalTexture({source: videoFrame3});
try {
renderPassEncoder11.setIndexBuffer(buffer28, 'uint16', 96, 75);
} catch {}
try {
renderPassEncoder14.setVertexBuffer(2, buffer32, 72);
} catch {}
try {
commandEncoder18.copyBufferToBuffer(buffer19, 2076, buffer7, 308, 264);
} catch {}
try {
commandEncoder18.copyTextureToTexture({
  texture: texture13,
  mipLevel: 0,
  origin: {x: 26, y: 0, z: 3},
  aspect: 'all',
},
{
  texture: texture61,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 0},
  aspect: 'all',
},
{width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let buffer43 = device0.createBuffer({size: 16909, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX});
let texture81 = device0.createTexture({
  size: [47],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder24 = commandEncoder18.beginRenderPass({
  colorAttachments: [{
  view: textureView70,
  clearValue: { r: -518.7, g: -763.3, b: 409.5, a: -620.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder18.setBindGroup(3, bindGroup5, []);
} catch {}
try {
renderPassEncoder18.setPipeline(pipeline2);
} catch {}
let imageData9 = new ImageData(32, 44);
let buffer44 = device0.createBuffer({
  size: 1713,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder72 = device0.createCommandEncoder({});
let texture82 = device0.createTexture({
  size: {width: 190, height: 2, depthOrArrayLayers: 55},
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder63 = commandEncoder72.beginComputePass({});
try {
computePassEncoder37.setBindGroup(1, bindGroup30);
} catch {}
try {
computePassEncoder46.setBindGroup(0, bindGroup10, new Uint32Array(1034), 239, 2);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer14, 'uint32', 3_096, 2_127);
} catch {}
let arrayBuffer2 = buffer40.getMappedRange(0, 1344);
try {
device0.queue.writeTexture({
  texture: texture59,
  mipLevel: 0,
  origin: {x: 16, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(204).fill(36), /* required buffer size: 204 */
{offset: 204, bytesPerRow: 335}, {width: 20, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let commandEncoder73 = device0.createCommandEncoder({});
let textureView78 = texture29.createView({
  label: '\u0cce\u{1fb84}\u7b82\u0f7a\u{1f749}\u01d6\udb8d\u{1ffb7}',
  mipLevelCount: 1,
  baseArrayLayer: 9,
  arrayLayerCount: 19,
});
let computePassEncoder64 = commandEncoder73.beginComputePass({});
let sampler52 = device0.createSampler({
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 25.16,
  lodMaxClamp: 99.22,
  compare: 'less-equal',
  maxAnisotropy: 10,
});
try {
computePassEncoder43.setBindGroup(2, bindGroup13);
} catch {}
try {
computePassEncoder64.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder21.setBindGroup(3, bindGroup0);
} catch {}
try {
renderPassEncoder24.setBindGroup(0, bindGroup6, new Uint32Array(909), 47, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture64,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 2},
  aspect: 'all',
}, new Uint8Array(13).fill(216), /* required buffer size: 13 */
{offset: 13}, {width: 1, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup44 = device0.createBindGroup({
  layout: bindGroupLayout11,
  entries: [{binding: 76, resource: textureView75}, {binding: 295, resource: textureView28}],
});
let commandEncoder74 = device0.createCommandEncoder({});
let texture83 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 5},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder65 = commandEncoder74.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder53); computePassEncoder53.dispatchWorkgroupsIndirect(buffer41, 176); };
} catch {}
try {
computePassEncoder65.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer30, 'uint16', 196, 395);
} catch {}
try {
renderPassEncoder21.setPipeline(pipeline1);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let videoFrame5 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'yCgCo', primaries: 'film', transfer: 'iec6196624'} });
let bindGroup45 = device0.createBindGroup({
  label: '\u{1f84f}\uf879\u07f7\u2a4b\u5531\u46fb\u03e5\u67dc\u5481\u{1fc16}',
  layout: bindGroupLayout3,
  entries: [{binding: 433, resource: textureView25}],
});
let buffer45 = device0.createBuffer({
  size: 4592,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder75 = device0.createCommandEncoder({});
let computePassEncoder66 = commandEncoder75.beginComputePass({label: '\u{1fdf5}\u{1fa45}\u0887\u1ebe\u0be7\ud412\u1a77'});
let sampler53 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  lodMinClamp: 58.16,
  lodMaxClamp: 64.49,
});
try {
computePassEncoder54.end();
} catch {}
try {
computePassEncoder18.end();
} catch {}
try {
computePassEncoder66.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup20);
} catch {}
try {
renderPassEncoder24.setPipeline(pipeline1);
} catch {}
try {
commandEncoder24.copyBufferToTexture({
  /* bytesInLastRow: 265 widthInBlocks: 265 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1026 */
  offset: 1026,
  buffer: buffer23,
}, {
  texture: texture83,
  mipLevel: 0,
  origin: {x: 699, y: 0, z: 0},
  aspect: 'all',
}, {width: 265, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer2.detached) { new Uint8Array(arrayBuffer2).fill(0x55); };
} catch {}
let imageBitmap0 = await createImageBitmap(imageData0);
let bindGroup46 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView42}]});
let texture84 = device0.createTexture({
  size: [47, 1, 11],
  mipLevelCount: 3,
  dimension: '2d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
try {
computePassEncoder60.setBindGroup(0, bindGroup2, new Uint32Array(3894), 495, 0);
} catch {}
try {
computePassEncoder53.end();
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer32, 'uint16', 428, 500);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1980, height: 1, depthOrArrayLayers: 154}
*/
{
  source: canvas0,
  origin: { x: 50, y: 7 },
  flipY: false,
}, {
  texture: texture2,
  mipLevel: 0,
  origin: {x: 146, y: 0, z: 5},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 15, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup47 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 329, resource: textureView21},
    {binding: 267, resource: {buffer: buffer5, offset: 2048, size: 288}},
  ],
});
let computePassEncoder67 = commandEncoder61.beginComputePass({});
let renderPassEncoder25 = commandEncoder62.beginRenderPass({
  colorAttachments: [{
  view: textureView73,
  clearValue: { r: -779.5, g: 984.5, b: 52.03, a: 682.7, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet4,
});
let sampler54 = device0.createSampler({
  label: '\udd97\u08b0\u1592',
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 75.64,
  lodMaxClamp: 80.59,
});
try {
computePassEncoder63.setPipeline(pipeline0);
} catch {}
try {
buffer9.unmap();
} catch {}
let bindGroup48 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView25}]});
let commandEncoder76 = device0.createCommandEncoder({});
let texture85 = device0.createTexture({
  size: [190, 2, 55],
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView79 = texture2.createView({mipLevelCount: 1, baseArrayLayer: 1, arrayLayerCount: 16});
let externalTexture12 = device0.importExternalTexture({source: videoFrame0});
try {
renderPassEncoder3.setBindGroup(1, bindGroup46);
} catch {}
try {
renderPassEncoder24.draw(350, 414, 214_186_515, 623_308_471);
} catch {}
try {
renderPassEncoder24.drawIndirect(buffer28, 0);
} catch {}
try {
renderPassEncoder17.setIndexBuffer(buffer35, 'uint16', 15_240, 98);
} catch {}
try {
renderPassEncoder21.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(0, buffer27, 4, 186);
} catch {}
try {
commandEncoder76.resolveQuerySet(querySet3, 65, 11, buffer11, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture62,
  mipLevel: 0,
  origin: {x: 710, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(19).fill(73), /* required buffer size: 19 */
{offset: 19, rowsPerImage: 6}, {width: 1325, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer46 = device0.createBuffer({size: 23843, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE});
let commandEncoder77 = device0.createCommandEncoder({});
let texture86 = device0.createTexture({
  size: {width: 3960, height: 1, depthOrArrayLayers: 31},
  sampleCount: 1,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder68 = commandEncoder24.beginComputePass({});
try {
renderPassEncoder25.beginOcclusionQuery(238);
} catch {}
try {
renderPassEncoder24.draw(19, 63, 70_094_139, 204_142_259);
} catch {}
try {
buffer29.unmap();
} catch {}
try {
commandEncoder76.copyTextureToTexture({
  texture: texture84,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture46,
  mipLevel: 6,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup49 = device0.createBindGroup({
  label: '\u0eb9\u{1f6fc}\u09a1\udf4f\uec17\u{1fb5c}\u8ba8\u{1fb06}\u0e94\u4e21',
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer9, offset: 0, size: 8}}],
});
let computePassEncoder69 = commandEncoder76.beginComputePass({});
try {
computePassEncoder67.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder17.setBindGroup(2, bindGroup23, new Uint32Array(123), 14, 0);
} catch {}
try {
renderPassEncoder25.endOcclusionQuery();
} catch {}
try {
renderPassEncoder20.executeBundles([renderBundle2, renderBundle3, renderBundle6]);
} catch {}
try {
buffer46.unmap();
} catch {}
try {
commandEncoder77.copyBufferToTexture({
  /* bytesInLastRow: 32 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 1792 */
  offset: 1792,
  buffer: buffer3,
}, {
  texture: texture59,
  mipLevel: 3,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
let shaderModule6 = device0.createShaderModule({
  code: `
diagnostic(info, xyz);

enable f16;

requires readonly_and_readwrite_storage_textures;

struct T0 {
  f0: array<u32>,
}

fn fn1() -> mat3x4f {
  var out: mat3x4f;
  let vf156: vec4h = fract(vec4h(unconst_f16(3089.7), unconst_f16(35736.3), unconst_f16(3358.2), unconst_f16(23269.3)));
  let vf157: vec2h = log2(acosh(vec2h(faceForward(vec3f(unconst_f32(0.01970), unconst_f32(0.1143), unconst_f32(0.1150)), vec3f(unconst_f32(0.1031), unconst_f32(-0.1921), unconst_f32(0.07971)), vec3f(unconst_f32(0.00094), unconst_f32(0.05059), unconst_f32(0.1191))).xx)));
  out = mat3x4f(f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), bitcast<f32>(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), bitcast<f32>(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), bitcast<f32>(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), bitcast<f32>(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))), f32(pack2x16unorm(vec2f(fma(vec2h(unconst_f16(6171.7), unconst_f16(5699.6)), vec2h(unconst_f16(-7750.8), unconst_f16(-14480.1)), vec2h(mix(vec2f(unconst_f32(0.1654), unconst_f32(0.1460)), vec2f(unconst_f32(0.1781), unconst_f32(0.1702)), f32(unconst_f32(0.1472)))))))));
  var vf158: vec4f = unpack4x8snorm(u32(unconst_u32(3)));
  let vf159: vec2h = exp(bitcast<vec2h>(pack4xI8Clamp(vec4i(bitcast<i32>(override2)))));
  out = mat3x4f(f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]), f32(vf156[2]));
  var vf160: f32 = override2;
  var vf161: vec4h = vf156;
  let vf162: f16 = vf161[pack4xU8(vec4u(vf156))];
  var vf163: f32 = vf158[u32(unconst_u32(121))];
  let vf164: f16 = vf157[1];
  vf158 += vec4f(fma(vec2h(unconst_f16(8669.4), unconst_f16(1338.5)), vec2h(unconst_f16(16448.5), unconst_f16(557.3)), vec2h(unconst_f16(5216.4), unconst_f16(8786.4))).yxxy);
  return out;
  _ = override2;
}

override override2 = 0.1553;

fn unconst_u32(v: u32) -> u32 { return v; }

alias vec3b = vec3<bool>;

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(48) var st6: texture_storage_2d_array<r32float, read_write>;

fn fn0() -> array<mat2x2f, 6> {
  var out: array<mat2x2f, 6>;
  vw18.f0 *= (*&vw19)[13].f0;
  let ptr36: ptr<workgroup, array<FragmentOutput5, 14>> = &(*&vw19);
  let ptr37: ptr<workgroup, vec4i> = &(*&vw18).f0;
  out[u32(unconst_u32(103))] = mat2x2f(f32((*&vw19)[13].f0[pack4xI8((*&vw17).f0)]), f32((*&vw19)[13].f0[pack4xI8((*&vw17).f0)]), bitcast<f32>((*&vw19)[13].f0[pack4xI8((*&vw17).f0)]), f32((*&vw19)[13].f0[pack4xI8((*&vw17).f0)]));
  out[u32((*&vw18).f0.r)] = mat2x2f(vec2f((*&vw19)[13].f0.ag), vec2f((*&vw19)[13].f0.zz));
  let ptr38: ptr<workgroup, FragmentOutput5> = &vw17;
  var vf153: i32 = vw19[13].f0[u32(unconst_u32(69))];
  let ptr39: ptr<workgroup, FragmentOutput5> = &(*ptr36)[u32(unconst_u32(283))];
  vw18.f0 = vw17.f0;
  let ptr40: ptr<workgroup, FragmentOutput5> = &(*&vw19)[13];
  let ptr41: ptr<workgroup, vec4i> = &(*ptr36)[13].f0;
  let ptr42: ptr<workgroup, vec4i> = &(*&vw17).f0;
  let ptr43: ptr<workgroup, array<FragmentOutput5, 14>> = &(*ptr36);
  let ptr44: ptr<workgroup, vec4i> = &(*ptr36)[13].f0;
  var vf154: i32 = vw19[13].f0[vec3u(exp(vec3f(bitcast<f32>(vw18.f0[pack4xI8Clamp((*ptr36)[13].f0)])))).b];
  vf153 = (*&vw19)[13].f0[2];
  let ptr45: ptr<workgroup, vec4i> = &vw18.f0;
  let ptr46: ptr<workgroup, vec4i> = &(*ptr41);
  let ptr47: ptr<workgroup, vec4i> = &(*&vw18).f0;
  var vf155: i32 = vw18.f0[bitcast<u32>((*&vw19)[13].f0.w)];
  let ptr48: ptr<workgroup, vec4i> = &(*&vw19)[13].f0;
  return out;
}

var<workgroup> vw19: array<FragmentOutput5, 14>;

fn unconst_i32(v: i32) -> i32 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

@group(0) @binding(182) var sam6: sampler;

struct FragmentOutput5 {
  @location(0) @interpolate(flat) f0: vec4i,
}

var<workgroup> vw17: FragmentOutput5;

var<workgroup> vw18: FragmentOutput5;

fn unconst_f32(v: f32) -> f32 { return v; }

@vertex @must_use
fn vertex9(@location(1) a0: vec2u, @location(6) @interpolate(flat, centroid) a1: vec4u) -> @builtin(position) vec4f {
  var out: vec4f;
  fn1();
  var vf165: u32 = a1[u32(unconst_u32(0))];
  fn1();
  out = unpack4x8snorm(a0[u32(unconst_u32(14))]);
  out += unpack4x8unorm(a1[u32(unconst_u32(104))]);
  var vf166 = fn1();
  vf165 &= a1[1];
  vf165 <<= pack4xU8(a1);
  out += vec4f(f32(insertBits(a1[1], a0[u32(unconst_u32(414))], u32(override2), u32(unconst_u32(57)))));
  fn1();
  fn1();
  vf166 += mat3x4f(f32(a0[0]), bitcast<f32>(a0[0]), bitcast<f32>(a0[0]), bitcast<f32>(a0[0]), f32(a0[0]), f32(a0[0]), bitcast<f32>(a0[0]), bitcast<f32>(a0[0]), f32(a0[0]), f32(a0[0]), bitcast<f32>(a0[0]), bitcast<f32>(a0[0]));
  out = vec4f(reverseBits(vec3u(insertBits(u32(unconst_u32(277)), u32(unconst_u32(146)), u32(unconst_u32(6)), u32(unconst_u32(89))))).xxzx);
  var vf167 = fn1();
  var vf168: u32 = a1[1];
  var vf169 = fn1();
  var vf170 = fn1();
  return out;
  _ = override2;
}

@fragment
fn fragment5() -> FragmentOutput5 {
  var out: FragmentOutput5;
  var vf171 = fn1();
  fn1();
  vf171 = mat3x4f(textureLoad(st6, vec2i(countTrailingZeros(vec2u(unconst_u32(52), unconst_u32(13)))), i32(unconst_i32(77))), textureLoad(st6, vec2i(countTrailingZeros(vec2u(unconst_u32(52), unconst_u32(13)))), i32(unconst_i32(77))), textureLoad(st6, vec2i(countTrailingZeros(vec2u(unconst_u32(52), unconst_u32(13)))), i32(unconst_i32(77))));
  var vf172: u32 = pack4x8snorm(vec4f(vf171[2][u32(unconst_u32(399))]));
  fn1();
  vf172 = u32(vf171[u32(unconst_u32(88))][u32(unconst_u32(30))]);
  vf172 &= countTrailingZeros(vec2u(unconst_u32(14), unconst_u32(678)))[1];
  let vf173: f32 = vf171[u32(unconst_u32(80))][u32(unconst_u32(426))];
  fn1();
  out.f0 ^= vec4i(bitcast<i32>(override2));
  var vf174 = fn1();
  out.f0 = unpack4xI8(textureNumLayers(st6));
  var vf175 = fn1();
  vf175 = mat3x4f(vf173, vf173, vf173, vf173, vf173, vf173, vf173, vf173, vf173, vf173, vf173, vf173);
  return out;
  _ = override2;
}

@compute @workgroup_size(3, 1, 1)
fn compute7(@builtin(workgroup_id) a0: vec3u) {
  fn0();
  let ptr49: ptr<workgroup, array<FragmentOutput5, 14>> = &(*&vw19);
  vw19[u32(unconst_u32(119))] = FragmentOutput5(vec4i(bitcast<i32>(tanh(f32(unconst_f32(-0.08249))))));
  vw19[u32(unconst_u32(308))] = FragmentOutput5(vec4i((*&vw17).f0[u32(unconst_u32(474))]));
  fn0();
  var vf176 = fn0();
  var vf177 = fn0();
  vw17.f0 = vec4i(vf176[5][0].yxxx);
  fn0();
  fn0();
  fn0();
  let ptr50: ptr<workgroup, FragmentOutput5> = &vw19[13];
  vf177[u32(unconst_u32(126))] = mat2x2f(bitcast<vec2f>((*&vw19)[13].f0.br), bitcast<vec2f>((*&vw19)[13].f0.yw));
  let vf178: f32 = vf177[5][0][u32(vw19[13].f0[2])];
  let vf179: i32 = (*&vw17).f0[u32(unconst_u32(38))];
  vw17 = FragmentOutput5(vec4i((*&vw18).f0[u32(countLeadingZeros(vec3i(bitcast<i32>(a0[2]))).z)]));
  fn0();
  vw19[u32(unconst_u32(159))].f0 += (*&vw17).f0;
  vf177[u32(unconst_u32(143))] = mat2x2f(vec2f(unpack4xI8(pack4xI8((*&vw18).f0)).xz), vec2f(unpack4xI8(pack4xI8((*&vw18).f0)).yx));
  vw19[u32(unconst_u32(1))].f0 = vec4i((*ptr50).f0[3]);
  let ptr51: ptr<workgroup, vec4i> = &(*&vw17).f0;
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup50 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer39, offset: 0, size: 492}},
    {binding: 329, resource: textureView63},
  ],
});
try {
{ clearResourceUsages(device0, computePassEncoder29); computePassEncoder29.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder68.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder20.setVertexBuffer(2, buffer14, 0, 3_491);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
let shaderModule7 = device0.createShaderModule({
  code: `
enable f16;

requires packed_4x8_integer_dot_product;

diagnostic(info, xyz);

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_bool(v: bool) -> bool { return v; }

override override4 = 0.5449;

struct T0 {
  @size(76) f0: array<u32>,
}

var<workgroup> vw20: atomic<i32>;

fn unconst_f16(v: f16) -> f16 { return v; }

@id(28746) override override3: f16;

fn unconst_u32(v: u32) -> u32 { return v; }

fn fn0() -> vec2i {
  var out: vec2i;
  out ^= vec2i(bitcast<i32>(pack2x16float(vec2f(unconst_f32(0.3194), unconst_f32(0.2300)))));
  var vf180: f16 = override3;
  var vf181: f32 = acosh(f32(unconst_f32(0.2461)));
  let ptr52: ptr<function, f16> = &vf180;
  vf180 = exp2(vec2h(exp(vec3f(vf181)).rr))[0];
  var vf182: f16 = degrees(f16(unconst_f16(2916.5)));
  var vf183: vec3h = sinh(vec3h(unconst_f16(2204.5), unconst_f16(20846.8), unconst_f16(64.88)));
  let ptr53: ptr<function, f16> = &(*ptr52);
  vf180 -= vec4h(firstLeadingBit(vec4i(unconst_i32(506), unconst_i32(-71), unconst_i32(213), unconst_i32(242))))[3];
  var vf184: u32 = pack4x8unorm(vec4f(unconst_f32(0.1252), unconst_f32(0.1312), unconst_f32(0.4713), unconst_f32(0.07111)));
  let vf185: f16 = vf183[2];
  let vf186: vec4h = asinh(vec4h(unconst_f16(36116.0), unconst_f16(2717.9), unconst_f16(8724.2), unconst_f16(3687.2)));
  let ptr54: ptr<function, f16> = &(*ptr52);
  vf180 -= f16(acosh(unpack4x8snorm(pack2x16float(vec2f(unconst_f32(0.00143), unconst_f32(0.1620))))[3]));
  let ptr55: ptr<function, f16> = &(*ptr53);
  vf182 = f16(unpack4x8snorm(u32(unconst_u32(71))).y);
  vf180 = (*ptr53);
  var vf187: vec4h = asin(vec4h(unconst_f16(2172.9), unconst_f16(-13425.5), unconst_f16(263.7), unconst_f16(14922.3)));
  return out;
  _ = override3;
}

@group(0) @binding(182) var sam7: sampler;

fn unconst_i32(v: i32) -> i32 { return v; }

@group(0) @binding(48) var st7: texture_storage_2d_array<r32float, read_write>;

var<workgroup> vw21: atomic<i32>;

alias vec3b = vec3<bool>;

@vertex
fn vertex10(@location(4) a0: i32) -> @builtin(position) vec4f {
  var out: vec4f;
  var vf188: u32 = pack2x16snorm(vec2f(unconst_f32(0.02627), unconst_f32(0.08246)));
  vf188 += pack4xU8(unpack4xU8(u32(unconst_u32(73))));
  vf188 ^= bitcast<u32>(fma(vec2f(unconst_f32(0.2788), unconst_f32(0.3932)), bitcast<vec2f>(mix(vec4h(f16(pack4xU8(vec4u(unconst_u32(349), unconst_u32(37), unconst_u32(41), unconst_u32(240))))), vec4h(f16(any(vec2<bool>(unconst_bool(true), unconst_bool(false))))), f16(unconst_f16(1926.0)))), vec2f(unpack4xU8(u32(length(vec3h(unconst_f16(8960.9), unconst_f16(3436.6), unconst_f16(1862.6))))).gb)).r);
  let vf189: vec4u = unpack4xU8(u32(unconst_u32(290)));
  let vf190: f32 = override4;
  var vf191: i32 = a0;
  out = vec4f(bitcast<f32>(a0));
  vf191 = i32(clamp(vec3h(f16(vf188)), vec3h(unconst_f16(7945.1), unconst_f16(7066.5), unconst_f16(-15139.6)), vec3h(unconst_f16(18626.6), unconst_f16(11794.9), unconst_f16(-8451.8))).y);
  let vf192: vec4f = radians(vec4f(unconst_f32(0.3514), unconst_f32(0.3656), unconst_f32(0.06215), unconst_f32(0.05899)));
  out *= vec4f(override4);
  var vf193: vec3f = tanh(vec3f(unconst_f32(0.2427), unconst_f32(0.07402), unconst_f32(0.2734)));
  var vf194: f16 = radians(f16(a0));
  return out;
  _ = override4;
}

@compute @workgroup_size(1, 1, 1)
fn compute8() {
  var vf195: i32 = atomicLoad(&(*&vw20));
  var vf196 = fn0();
  vf196 -= vec2i(atomicLoad(&(*&vw20)));
  var vf197: i32 = atomicLoad(&vw20);
  let vf198: i32 = vf196[pack4xU8Clamp(vec4u(unconst_u32(0), unconst_u32(360), unconst_u32(18), unconst_u32(82)))];
  let vf199: f32 = cosh(bitcast<f32>(pack4xU8(firstTrailingBit(vec4u(unconst_u32(137), unconst_u32(39), unconst_u32(19), unconst_u32(317))))));
  atomicMax(&vw21, i32(unconst_i32(558)));
  var vf200: i32 = atomicExchange(&(*&vw21), i32(unconst_i32(151)));
  let vf201: vec3f = ldexp(vec3f(unconst_f32(0.2447), unconst_f32(0.1676), unconst_f32(0.04897)), vec3i(vf195));
  var vf202: vec3f = cross(vec3f(unconst_f32(-0.07328), unconst_f32(0.6170), unconst_f32(0.3684)), vec3f(unconst_f32(0.07321), unconst_f32(0.02432), unconst_f32(-0.5218)));
  let vf203: u32 = pack4xU8Clamp(firstTrailingBit(unpack4xU8(pack4xU8(vec4u(unconst_u32(84), unconst_u32(127), unconst_u32(132), unconst_u32(303))))));
  atomicStore(&vw21, i32(unconst_i32(157)));
  fn0();
  atomicAdd(&vw20, i32(vf201[u32(unconst_u32(422))]));
  fn0();
  var vf204: u32 = pack4xU8Clamp(vec4u(unconst_u32(237), unconst_u32(213), unconst_u32(60), unconst_u32(606)));
  let vf205: i32 = atomicExchange(&vw21, i32(unconst_i32(41)));
  atomicAdd(&vw20, i32(unconst_i32(-12)));
  vf197 += vec2i(countTrailingZeros(vec2u(unconst_u32(51), unconst_u32(168)))).r;
  atomicExchange(&vw21, i32(unconst_i32(5)));
  vf204 -= u32(vf202[u32(unconst_u32(7))]);
  var vf206: i32 = atomicExchange(&(*&vw21), countLeadingZeros(i32(log2(vec3f(vf196.xxy))[0])));
  var vf207 = fn0();
  _ = override3;
}`,
  sourceMap: {},
  hints: {},
});
let renderPassEncoder26 = commandEncoder77.beginRenderPass({
  colorAttachments: [{
  view: textureView51,
  clearValue: { r: 749.8, g: 801.6, b: 466.5, a: -406.0, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 547205551,
});
let renderBundleEncoder11 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true, stencilReadOnly: true});
let renderBundle11 = renderBundleEncoder11.finish({});
try {
computePassEncoder69.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder11.setBindGroup(1, bindGroup18);
} catch {}
try {
renderPassEncoder24.end();
} catch {}
try {
renderPassEncoder23.setVertexBuffer(5, buffer45, 508);
} catch {}
try {
commandEncoder18.copyBufferToTexture({
  /* bytesInLastRow: 1 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 2859 */
  offset: 2859,
  bytesPerRow: 4608,
  buffer: buffer36,
}, {
  texture: texture20,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder18.copyTextureToTexture({
  texture: texture20,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture46,
  mipLevel: 2,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture42,
  mipLevel: 0,
  origin: {x: 35, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(726).fill(1), /* required buffer size: 726 */
{offset: 726}, {width: 51, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer47 = device0.createBuffer({
  label: '\uf21f\ua59d\u50a4\u0e4d\u{1fff7}\u2478',
  size: 15646,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE,
});
let commandEncoder78 = device0.createCommandEncoder();
let textureView80 = texture35.createView({});
let computePassEncoder70 = commandEncoder78.beginComputePass({label: '\u07db\ub7b3\u8c4a\u55ae'});
let textureView81 = texture77.createView({arrayLayerCount: 1});
try {
computePassEncoder65.setBindGroup(3, bindGroup39, new Uint32Array(615), 89, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder43); computePassEncoder43.dispatchWorkgroups(3, 1); };
} catch {}
try {
computePassEncoder29.end();
} catch {}
try {
computePassEncoder62.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder2.setViewport(877.8892938175005, 0.8392464421581662, 471.70166476419223, 0.09593899425157223, 0.5576032716540281, 0.6655390375484764);
} catch {}
try {
renderPassEncoder3.setIndexBuffer(buffer22, 'uint32', 368, 3_759);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture51,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(40).fill(98), /* required buffer size: 40 */
{offset: 40, bytesPerRow: 13}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer2.detached) { new Uint8Array(arrayBuffer2).fill(0x55); };
} catch {}
let videoFrame6 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt470bg', primaries: 'smpte240m', transfer: 'bt2020_10bit'} });
let buffer48 = device0.createBuffer({size: 8524, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX});
let commandEncoder79 = device0.createCommandEncoder({});
let computePassEncoder71 = commandEncoder33.beginComputePass({label: '\u0e6e\u04b2\u499f'});
let renderPassEncoder27 = commandEncoder18.beginRenderPass({
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: 633.7, g: -168.4, b: 111.3, a: -426.3, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 84287121,
});
try {
computePassEncoder23.setBindGroup(3, bindGroup15);
} catch {}
try {
renderPassEncoder11.setBindGroup(1, bindGroup7);
} catch {}
try {
renderPassEncoder21.setPipeline(pipeline1);
} catch {}
try {
commandEncoder79.resolveQuerySet(querySet0, 2, 2, buffer43, 10240);
} catch {}
document.body.append(img1);
let texture87 = device0.createTexture({
  size: [380, 5, 110],
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder56.setBindGroup(0, bindGroup16);
} catch {}
try {
computePassEncoder71.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.beginOcclusionQuery(219);
} catch {}
try {
renderPassEncoder27.setIndexBuffer(buffer45, 'uint16', 14, 1_410);
} catch {}
try {
renderPassEncoder27.setPipeline(pipeline2);
} catch {}
try {
commandEncoder79.copyBufferToTexture({
  /* bytesInLastRow: 128 widthInBlocks: 8 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 1968 */
  offset: 1968,
  buffer: buffer36,
}, {
  texture: texture69,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 8, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder79.resolveQuerySet(querySet2, 6, 77, buffer40, 512);
} catch {}
try {
device0.queue.writeBuffer(buffer0, 1280, new DataView(new ArrayBuffer(7139)), 1276, 4);
} catch {}
let videoFrame7 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt2020-cl', primaries: 'bt470m', transfer: 'smpte170m'} });
let bindGroup51 = device0.createBindGroup({
  label: '\u{1facf}\u5723\u002f',
  layout: bindGroupLayout5,
  entries: [
    {binding: 89, resource: sampler46},
    {binding: 140, resource: textureView28},
    {binding: 150, resource: textureView20},
    {binding: 487, resource: textureView44},
    {binding: 359, resource: {buffer: buffer44, offset: 512, size: 549}},
    {binding: 29, resource: textureView27},
    {binding: 173, resource: {buffer: buffer40, offset: 512, size: 40}},
    {binding: 298, resource: {buffer: buffer12, offset: 0, size: 40}},
    {binding: 313, resource: textureView56},
  ],
});
let commandEncoder80 = device0.createCommandEncoder({});
let textureView82 = texture86.createView({dimension: '2d'});
let texture88 = device0.createTexture({
  size: [1980, 1, 22],
  mipLevelCount: 4,
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder67.setBindGroup(1, bindGroup18);
} catch {}
try {
computePassEncoder28.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder70.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder20.setViewport(94.09205470756946, 0.7237613195170575, 0.24153152948038886, 0.20415675901299396, 0.9592608547418299, 0.9900652365211392);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer15, 'uint32', 56, 279);
} catch {}
try {
renderPassEncoder22.setVertexBuffer(1, buffer41, 68, 201);
} catch {}
try {
commandEncoder80.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 4816 */
  offset: 4816,
  bytesPerRow: 0,
  rowsPerImage: 329,
  buffer: buffer23,
}, {
  texture: texture49,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 0},
  aspect: 'all',
}, {width: 0, height: 1, depthOrArrayLayers: 4});
} catch {}
let bindGroup52 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 173, resource: {buffer: buffer21, offset: 13056, size: 932}},
    {binding: 29, resource: textureView27},
    {binding: 313, resource: textureView23},
    {binding: 298, resource: {buffer: buffer20, offset: 0, size: 4260}},
    {binding: 487, resource: textureView80},
    {binding: 89, resource: sampler6},
    {binding: 359, resource: {buffer: buffer4, offset: 1024, size: 3983}},
    {binding: 140, resource: textureView43},
    {binding: 150, resource: textureView47},
  ],
});
let texture89 = device0.createTexture({
  label: '\u{1f92e}\u0d4e\u8f0a\u040f',
  size: {width: 190, height: 2, depthOrArrayLayers: 55},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder72 = commandEncoder79.beginComputePass({});
let renderPassEncoder28 = commandEncoder80.beginRenderPass({
  label: '\u{1fb56}\uef57\u05bd\u0351\u394d\u05d5\u27bf\u393b',
  colorAttachments: [{
  view: textureView73,
  clearValue: { r: 679.3, g: -501.1, b: 331.2, a: 112.3, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 20268389,
});
try {
computePassEncoder28.setBindGroup(2, bindGroup7);
} catch {}
try {
computePassEncoder70.setBindGroup(3, bindGroup7, new Uint32Array(30), 3, 0);
} catch {}
try {
renderPassEncoder26.executeBundles([renderBundle4]);
} catch {}
try {
renderPassEncoder9.setStencilReference(1164);
} catch {}
try {
renderPassEncoder3.setViewport(3647.122420055259, 0.05107223270031214, 193.52796188473224, 0.8044820307872667, 0.9299030644492003, 0.9363337949932335);
} catch {}
let commandEncoder81 = device0.createCommandEncoder();
let texture90 = device0.createTexture({
  label: '\u{1ff81}\u79a5\uc33f\udedc\u26e3\u0a45\uf908\u9108\u0833\udc50\u0864',
  size: {width: 95, height: 1, depthOrArrayLayers: 27},
  mipLevelCount: 3,
  dimension: '3d',
  format: 'rgba16sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture91 = device0.createTexture({
  label: '\u00bb\u81c0\u5a53\u{1f7f9}\ud796\u{1ff44}\u3ada\u7ae6\u{1f64c}\ua7dd\ue835',
  size: {width: 380},
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
try {
commandEncoder81.copyTextureToTexture({
  texture: texture43,
  mipLevel: 0,
  origin: {x: 19, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture70,
  mipLevel: 0,
  origin: {x: 133, y: 0, z: 0},
  aspect: 'all',
},
{width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer34, 2440, new Float32Array(26658), 2619, 620);
} catch {}
let buffer49 = device0.createBuffer({
  size: 1409,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let sampler55 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 86.63,
  maxAnisotropy: 8,
});
try {
computePassEncoder23.setBindGroup(0, bindGroup22);
} catch {}
try {
computePassEncoder72.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder18.endOcclusionQuery();
} catch {}
try {
renderPassEncoder1.executeBundles([renderBundle6]);
} catch {}
try {
renderPassEncoder8.setStencilReference(316);
} catch {}
try {
renderPassEncoder28.setViewport(279.5387825674681, 0.316008449286309, 966.833984892122, 0.40685557627147084, 0.7286654042284451, 0.9343400296406343);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer10, 'uint16', 2_892, 177);
} catch {}
try {
renderPassEncoder25.setVertexBuffer(1, buffer48);
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let textureView83 = texture23.createView({});
let renderPassEncoder29 = commandEncoder81.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -811.7, g: -654.2, b: -441.5, a: -762.8, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder21.setBindGroup(0, bindGroup29);
} catch {}
try {
renderPassEncoder27.setIndexBuffer(buffer33, 'uint16', 178, 45);
} catch {}
let promise6 = device0.queue.onSubmittedWorkDone();
let canvas1 = document.createElement('canvas');
let bindGroup53 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView13}, {binding: 50, resource: textureView67}],
});
let texture92 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  mipLevelCount: 2,
  format: 'r8sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
try {
computePassEncoder49.setBindGroup(1, bindGroup22, new Uint32Array(465), 88, 0);
} catch {}
try {
renderPassEncoder22.setPipeline(pipeline1);
} catch {}
let buffer50 = device0.createBuffer({
  label: '\u{1f70f}\u0215\u3634\u{1f62b}\u9a2c\u905f\udccd',
  size: 1852,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let textureView84 = texture62.createView({dimension: '2d-array', baseMipLevel: 0});
try {
renderPassEncoder15.setBindGroup(2, bindGroup36);
} catch {}
try {
renderPassEncoder25.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder19.setVertexBuffer(7, buffer8, 6_168, 229);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
try {
computePassEncoder66.setBindGroup(3, bindGroup13, new Uint32Array(1592), 212, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder60); computePassEncoder60.dispatchWorkgroupsIndirect(buffer28, 8); };
} catch {}
try {
computePassEncoder25.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder4.setBindGroup(2, bindGroup26);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer28, 'uint16', 22, 28);
} catch {}
try {
renderPassEncoder26.setPipeline(pipeline1);
} catch {}
let arrayBuffer3 = buffer40.getMappedRange(1344, 568);
await gc();
let bindGroup54 = device0.createBindGroup({
  layout: bindGroupLayout4,
  entries: [
    {binding: 569, resource: textureView22},
    {binding: 171, resource: textureView11},
    {binding: 7, resource: {buffer: buffer39, offset: 0, size: 246}},
  ],
});
let buffer51 = device0.createBuffer({
  size: 1685,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE,
});
let commandEncoder82 = device0.createCommandEncoder({});
let querySet7 = device0.createQuerySet({type: 'occlusion', count: 468});
let computePassEncoder73 = commandEncoder82.beginComputePass({label: '\u235e\u{1fd9b}\ue5a6\u1a4a\u0672\u{1fdde}\u1527'});
try {
renderPassEncoder15.setPipeline(pipeline1);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
try {
renderPassEncoder28.insertDebugMarker('\u0473');
} catch {}
try {
device0.queue.writeTexture({
  texture: texture54,
  mipLevel: 1,
  origin: {x: 9, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(304).fill(200), /* required buffer size: 304 */
{offset: 304}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.prepend(img1);
let commandEncoder83 = device0.createCommandEncoder();
let computePassEncoder74 = commandEncoder83.beginComputePass();
try {
computePassEncoder57.setBindGroup(2, bindGroup13);
} catch {}
try {
renderPassEncoder8.setIndexBuffer(buffer30, 'uint32', 532, 11);
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(5, buffer20, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture67,
  mipLevel: 0,
  origin: {x: 48, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(2_824).fill(254), /* required buffer size: 2_824 */
{offset: 340, bytesPerRow: 92, rowsPerImage: 9}, {width: 36, height: 0, depthOrArrayLayers: 4});
} catch {}
let promise7 = device0.queue.onSubmittedWorkDone();
try {
  await promise7;
} catch {}
let imageData10 = new ImageData(84, 140);
try {
canvas1.getContext('2d');
} catch {}
let bindGroupLayout12 = device0.createBindGroupLayout({
  label: '\uae98\u05b8\u022e\u5e65\u9cf8\u3ae0\u9cea',
  entries: [
    {
      binding: 100,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 92,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '1d' },
    },
    {
      binding: 187,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', minBindingSize: 0, hasDynamicOffset: false },
    },
    {
      binding: 146,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '1d', sampleType: 'float', multisampled: false },
    },
    {binding: 4, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'storage', hasDynamicOffset: false }},
  ],
});
let pipelineLayout7 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture93 = device0.createTexture({
  size: [95],
  sampleCount: 1,
  dimension: '1d',
  format: 'r32float',
  usage: GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture94 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 27},
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let renderBundleEncoder12 = device0.createRenderBundleEncoder({colorFormats: ['rg11b10ufloat'], depthReadOnly: true});
try {
computePassEncoder10.setBindGroup(2, bindGroup18, []);
} catch {}
try {
computePassEncoder30.setBindGroup(0, bindGroup52, new Uint32Array(1567), 951, 2);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder43); computePassEncoder43.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder73.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder15.setBindGroup(2, bindGroup0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer40, 'uint16', 1_216, 322);
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
let bindGroup55 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 329, resource: textureView18},
    {binding: 267, resource: {buffer: buffer4, offset: 5888, size: 1700}},
  ],
});
let texture95 = device0.createTexture({
  size: {width: 95},
  dimension: '1d',
  format: 'r32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderBundle12 = renderBundleEncoder12.finish({});
try {
computePassEncoder25.setBindGroup(2, bindGroup54);
} catch {}
try {
renderPassEncoder4.executeBundles([renderBundle11]);
} catch {}
try {
renderPassEncoder19.setStencilReference(377);
} catch {}
try {
renderPassEncoder12.setVertexBuffer(1, buffer18, 0, 905);
} catch {}
try {
  await promise6;
} catch {}
let bindGroup56 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView42}]});
let buffer52 = device0.createBuffer({
  size: 2345,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let textureView85 = texture95.createView({label: '\ua8f8\uaa09\u07e7', baseArrayLayer: 0, arrayLayerCount: 1});
let textureView86 = texture87.createView({});
let externalTexture13 = device0.importExternalTexture({label: '\u0b75\ub3a5', source: videoFrame3});
try {
renderPassEncoder27.setBindGroup(0, bindGroup21, new Uint32Array(557), 32, 2);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(2, buffer50, 980);
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let buffer53 = device0.createBuffer({size: 17304, usage: GPUBufferUsage.COPY_DST, mappedAtCreation: false});
let commandEncoder84 = device0.createCommandEncoder({});
let computePassEncoder75 = commandEncoder84.beginComputePass({});
try {
computePassEncoder28.setBindGroup(0, bindGroup6, new Uint32Array(2553), 16, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder28); computePassEncoder28.dispatchWorkgroupsIndirect(buffer35, 2_868); };
} catch {}
try {
computePassEncoder75.setPipeline(pipeline0);
} catch {}
let bindGroup57 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler0}, {binding: 48, resource: textureView4}],
});
try {
computePassEncoder57.setBindGroup(3, bindGroup40, new Uint32Array(3157), 894, 0);
} catch {}
try {
computePassEncoder74.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder9.setBindGroup(3, bindGroup0, new Uint32Array(904), 42, 0);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(4_294_967_294, undefined, 0, 1_414_978_312);
} catch {}
document.body.append(canvas1);
let commandEncoder85 = device0.createCommandEncoder({});
let textureView87 = texture11.createView({});
let computePassEncoder76 = commandEncoder85.beginComputePass({});
let sampler56 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 34.38,
  lodMaxClamp: 98.97,
  compare: 'greater',
});
try {
computePassEncoder70.setBindGroup(0, bindGroup33, new Uint32Array(2164), 417, 0);
} catch {}
try {
computePassEncoder76.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder17.setBindGroup(1, bindGroup35, new Uint32Array(751), 520, 0);
} catch {}
let buffer54 = device0.createBuffer({size: 1488, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT});
let commandEncoder86 = device0.createCommandEncoder({});
let textureView88 = texture36.createView({mipLevelCount: 1, baseArrayLayer: 4, arrayLayerCount: 18});
let computePassEncoder77 = commandEncoder86.beginComputePass({});
try {
computePassEncoder60.end();
} catch {}
try {
renderPassEncoder16.setBindGroup(0, bindGroup44);
} catch {}
try {
renderPassEncoder26.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder1.setVertexBuffer(5, buffer12, 56);
} catch {}
try {
buffer29.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture83,
  mipLevel: 0,
  origin: {x: 673, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(17).fill(32), /* required buffer size: 17 */
{offset: 17, bytesPerRow: 635}, {width: 588, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.label = '\u3cf8\u0348\u5e03\ua783\u1f4b\ub8a7\u{1fdc5}';
} catch {}
let pipelineLayout8 = device0.createPipelineLayout({bindGroupLayouts: []});
let renderPassEncoder30 = commandEncoder25.beginRenderPass({
  label: '\ue7a1\u9662\u0537\udd5a\u08dc\u0839\uf63e\u29a2\u69cc\u0fe3',
  colorAttachments: [{view: textureView16, loadOp: 'clear', storeOp: 'discard'}],
});
let externalTexture14 = device0.importExternalTexture({source: videoFrame3});
try {
renderPassEncoder13.beginOcclusionQuery(425);
} catch {}
try {
renderPassEncoder19.setPipeline(pipeline1);
} catch {}
let videoFrame8 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-cl', primaries: 'bt709', transfer: 'log'} });
let buffer55 = device0.createBuffer({size: 13318, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder87 = device0.createCommandEncoder({});
let querySet8 = device0.createQuerySet({type: 'occlusion', count: 1235});
let computePassEncoder78 = commandEncoder87.beginComputePass();
try {
computePassEncoder77.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder30.setBindGroup(1, bindGroup35);
} catch {}
try {
renderPassEncoder22.setBindGroup(3, bindGroup16, new Uint32Array(3123), 182, 0);
} catch {}
try {
renderPassEncoder4.setVertexBuffer(2, buffer27, 1_344);
} catch {}
try {
buffer53.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer2, 748, new Float32Array(18817), 3348, 2480);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let buffer56 = device0.createBuffer({
  size: 10058,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE,
});
let commandEncoder88 = device0.createCommandEncoder();
let computePassEncoder79 = commandEncoder88.beginComputePass({});
try {
computePassEncoder36.setBindGroup(0, bindGroup33);
} catch {}
try {
computePassEncoder43.end();
} catch {}
try {
computePassEncoder78.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder16.setPipeline(pipeline2);
} catch {}
try {
commandEncoder46.copyBufferToBuffer(buffer47, 100, buffer16, 8, 236);
} catch {}
try {
commandEncoder46.resolveQuerySet(querySet4, 34, 170, buffer48, 1024);
} catch {}
try {
renderPassEncoder18.insertDebugMarker('\u7611');
} catch {}
let bindGroupLayout13 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 28,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
  ],
});
let texture96 = device0.createTexture({
  size: [3960, 1, 21],
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView89 = texture30.createView({});
try {
computePassEncoder79.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder9.setBindGroup(1, bindGroup32, new Uint32Array(5951), 307, 0);
} catch {}
try {
renderPassEncoder29.executeBundles([renderBundle8]);
} catch {}
try {
renderPassEncoder19.draw(507, 484, 778_251_759, 179_117_691);
} catch {}
try {
renderPassEncoder28.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer57 = device0.createBuffer({
  size: 4982,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture97 = device0.createTexture({
  size: [1980, 1, 97],
  sampleCount: 1,
  format: 'depth16unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let sampler57 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 89.30,
});
try {
computePassEncoder57.setBindGroup(1, bindGroup39);
} catch {}
try {
renderPassEncoder13.endOcclusionQuery();
} catch {}
let img2 = await imageWithData(30, 177, '#10101010', '#20202020');
let pipelineLayout9 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder89 = device0.createCommandEncoder({});
let texture98 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'depth24plus',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView90 = texture36.createView({dimension: '2d', format: 'rg8snorm', mipLevelCount: 1, baseArrayLayer: 17});
let computePassEncoder80 = commandEncoder89.beginComputePass({});
let renderPassEncoder31 = commandEncoder46.beginRenderPass({
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: -776.1, g: -627.9, b: -88.36, a: -612.4, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 565097425,
});
try {
computePassEncoder28.end();
} catch {}
try {
renderPassEncoder3.setBindGroup(3, bindGroup20, new Uint32Array(2301), 380, 0);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer54, 124);
} catch {}
try {
renderPassEncoder9.setPipeline(pipeline2);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
globalThis.someLabel = bindGroupLayout1.label;
} catch {}
let commandBuffer3 = commandEncoder13.finish();
let texture99 = device0.createTexture({
  label: '\uaa8a\u9b2d\u1088',
  size: [95, 1, 1],
  format: 'depth24plus-stencil8',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder8.setBindGroup(0, bindGroup28);
} catch {}
try {
renderPassEncoder19.draw(158, 182, 271_373_646, 446_483_250);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer22, 1_492);
} catch {}
try {
renderPassEncoder9.setPipeline(pipeline2);
} catch {}
try {
textureView43.label = '\u7096\u0250';
} catch {}
let commandEncoder90 = device0.createCommandEncoder({label: '\ubb3e\u5e66'});
let textureView91 = texture99.createView({});
let textureView92 = texture15.createView({arrayLayerCount: 6});
let renderPassEncoder32 = commandEncoder90.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: -10.89, g: -198.8, b: 408.8, a: 663.0, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
renderPassEncoder19.draw(85, 169, 107_677_426, 1_815_980_072);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer49, 200);
} catch {}
let texture100 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 27},
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView93 = texture32.createView({aspect: 'all', baseArrayLayer: 64, arrayLayerCount: 1});
try {
renderPassEncoder31.setBindGroup(3, bindGroup17);
} catch {}
try {
renderPassEncoder8.setViewport(86.9958653197533, 0.49910194672921937, 2.124815540039634, 0.1335843489767101, 0.45675631510303494, 0.9108283591818185);
} catch {}
try {
renderPassEncoder8.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder32.setVertexBuffer(2, buffer35);
} catch {}
let commandEncoder91 = device0.createCommandEncoder({});
let computePassEncoder81 = commandEncoder91.beginComputePass({});
try {
computePassEncoder80.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer20, 76);
} catch {}
try {
renderPassEncoder27.setPipeline(pipeline2);
} catch {}
let commandEncoder92 = device0.createCommandEncoder();
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder81.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder22.setVertexBuffer(5, buffer37, 2_688, 1_239);
} catch {}
try {
if (!arrayBuffer3.detached) { new Uint8Array(arrayBuffer3).fill(0x55); };
} catch {}
let textureView94 = texture93.createView({label: '\u9f08\u{1fe09}\u88bf\ub43d\u822b\u0eca\u{1ff0e}\u0d63', dimension: '1d'});
let texture101 = device0.createTexture({
  label: '\u049d\u0e98\u{1f918}\ud40f\u7715\u55d0\u0703\u{1fb6f}\u08ed\u048b',
  size: {width: 990, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder33.setBindGroup(3, bindGroup30, []);
} catch {}
try {
renderPassEncoder19.draw(0, 61, 132_461_602, 35_618_608);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(2, buffer12, 120, 118);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture21,
  mipLevel: 0,
  origin: {x: 1, y: 1, z: 0},
  aspect: 'all',
}, new Uint8Array(582).fill(132), /* required buffer size: 582 */
{offset: 582, bytesPerRow: 41}, {width: 0, height: 2, depthOrArrayLayers: 0});
} catch {}
let commandEncoder93 = device0.createCommandEncoder();
let texture102 = device0.createTexture({size: [380, 5, 1], format: 'rg11b10ufloat', usage: GPUTextureUsage.COPY_DST});
try {
computePassEncoder2.setBindGroup(2, bindGroup23);
} catch {}
try {
computePassEncoder6.setBindGroup(1, bindGroup5, new Uint32Array(2497), 319, 0);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup19, new Uint32Array(861), 126, 0);
} catch {}
try {
renderPassEncoder19.draw(24, 75, 2_689_884_656, 1_997_807_430);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer29, 224);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline2);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture3,
  mipLevel: 3,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(1_502).fill(240), /* required buffer size: 1_502 */
{offset: 74, bytesPerRow: 21, rowsPerImage: 68}, {width: 0, height: 0, depthOrArrayLayers: 2});
} catch {}
let bindGroup58 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 140, resource: textureView61},
    {binding: 89, resource: sampler14},
    {binding: 359, resource: {buffer: buffer48, offset: 1536}},
    {binding: 29, resource: textureView35},
    {binding: 298, resource: {buffer: buffer20, offset: 0, size: 12}},
    {binding: 313, resource: textureView56},
    {binding: 173, resource: {buffer: buffer14, offset: 2560, size: 3104}},
    {binding: 150, resource: textureView6},
    {binding: 487, resource: textureView44},
  ],
});
let textureView95 = texture83.createView({format: 'r8sint', mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder82 = commandEncoder93.beginComputePass({});
try {
renderPassEncoder1.draw(1, 305, 2, 235_659_364);
} catch {}
try {
renderPassEncoder1.drawIndexedIndirect(buffer45, 1_700);
} catch {}
try {
if (!arrayBuffer3.detached) { new Uint8Array(arrayBuffer3).fill(0x55); };
} catch {}
document.body.append(canvas0);
let buffer58 = device0.createBuffer({size: 11078, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder94 = device0.createCommandEncoder({});
try {
computePassEncoder23.setBindGroup(0, bindGroup5, new Uint32Array(1172), 536, 0);
} catch {}
try {
renderPassEncoder25.setBindGroup(0, bindGroup40, new Uint32Array(2646), 151, 0);
} catch {}
try {
renderPassEncoder19.drawIndirect(buffer21, 1_132);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(0, buffer37, 284, 390);
} catch {}
try {
buffer44.unmap();
} catch {}
try {
commandEncoder94.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 220 */
  offset: 220,
  buffer: buffer47,
}, {
  texture: texture20,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder27.insertDebugMarker('\u2bb5');
} catch {}
let querySet9 = device0.createQuerySet({type: 'occlusion', count: 1496});
let textureView96 = texture9.createView({arrayLayerCount: 1});
let sampler58 = device0.createSampler({addressModeU: 'repeat', lodMinClamp: 76.55, lodMaxClamp: 86.40, maxAnisotropy: 1});
try {
computePassEncoder59.setBindGroup(0, bindGroup34, new Uint32Array(3879), 11, 0);
} catch {}
try {
renderPassEncoder8.setBindGroup(1, bindGroup45, []);
} catch {}
try {
renderPassEncoder1.drawIndexedIndirect(buffer9, 0);
} catch {}
try {
renderPassEncoder21.setIndexBuffer(buffer30, 'uint32', 196, 1_258);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 990, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData1,
  origin: { x: 4, y: 1 },
  flipY: true,
}, {
  texture: texture101,
  mipLevel: 0,
  origin: {x: 96, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 8, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout14 = device0.createBindGroupLayout({
  label: '\u0501\u138e\ue335\u0141\uf69b\uffd7\u{1f9a6}\uda8c\u222b\u2978\u{1fc0b}',
  entries: [
    {
      binding: 154,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 570,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      storageTexture: { format: 'r32sint', access: 'read-only', viewDimension: '3d' },
    },
  ],
});
let commandEncoder95 = device0.createCommandEncoder({});
let texture103 = device0.createTexture({
  label: '\u379a\u06da\u00df\u09b8\u041a\u2794\u4912\u9a6d',
  size: [1980, 1, 201],
  dimension: '3d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture104 = gpuCanvasContext0.getCurrentTexture();
let computePassEncoder83 = commandEncoder94.beginComputePass();
let renderBundleEncoder13 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], sampleCount: 1, depthReadOnly: true});
let sampler59 = device0.createSampler({addressModeU: 'clamp-to-edge', addressModeW: 'repeat', mipmapFilter: 'nearest', lodMaxClamp: 66.98});
try {
{ clearResourceUsages(device0, computePassEncoder36); computePassEncoder36.dispatchWorkgroups(1, 2); };
} catch {}
try {
computePassEncoder82.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder1.setBindGroup(0, bindGroup19, new Uint32Array(213), 6, 0);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder13.setVertexBuffer(0, buffer50);
} catch {}
try {
buffer55.unmap();
} catch {}
let commandEncoder96 = device0.createCommandEncoder();
let textureView97 = texture103.createView({label: '\u35ce\ucc99\uca0f', baseMipLevel: 0});
let textureView98 = texture33.createView({dimension: '2d-array', mipLevelCount: 1});
let renderPassEncoder33 = commandEncoder95.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 442.1, g: 293.1, b: 779.9, a: 454.9, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundleEncoder14 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true});
let renderBundle13 = renderBundleEncoder14.finish({});
try {
renderPassEncoder4.setIndexBuffer(buffer10, 'uint16', 2_958, 1_312);
} catch {}
try {
renderPassEncoder1.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder13.setBindGroup(1, bindGroup10, new Uint32Array(1343), 191, 2);
} catch {}
try {
commandEncoder96.copyBufferToBuffer(buffer22, 3064, buffer7, 244, 1032);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture100,
  mipLevel: 0,
  origin: {x: 9, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(4_392).fill(17), /* required buffer size: 4_392 */
{offset: 486, bytesPerRow: 93, rowsPerImage: 42}, {width: 22, height: 0, depthOrArrayLayers: 2});
} catch {}
let bindGroup59 = device0.createBindGroup({
  label: '\u0e5b\ua1c8\u7b5d\ufe5f\u0fb1',
  layout: bindGroupLayout12,
  entries: [
    {binding: 187, resource: {buffer: buffer52, offset: 1024, size: 20}},
    {binding: 146, resource: textureView53},
    {binding: 92, resource: textureView85},
    {binding: 4, resource: {buffer: buffer33, offset: 0, size: 700}},
    {binding: 100, resource: {buffer: buffer52, offset: 1024, size: 456}},
  ],
});
let texture105 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 1},
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView99 = texture102.createView({aspect: 'all'});
let computePassEncoder84 = commandEncoder96.beginComputePass({label: '\u07d4\u0fb9\ud498\u0b1e\ue839\u3c56\ub19b\u9207\u09f2'});
try {
{ clearResourceUsages(device0, computePassEncoder70); computePassEncoder70.dispatchWorkgroupsIndirect(buffer22, 2_704); };
} catch {}
try {
computePassEncoder84.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder22.setBindGroup(0, bindGroup3, new Uint32Array(879), 37, 0);
} catch {}
try {
renderPassEncoder1.end();
} catch {}
try {
renderPassEncoder18.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder11.setVertexBuffer(2, buffer35, 1_700, 2_099);
} catch {}
try {
renderBundleEncoder13.setBindGroup(3, bindGroup53, new Uint32Array(124), 9, 0);
} catch {}
try {
renderBundleEncoder13.setIndexBuffer(buffer14, 'uint16', 3_794, 6_628);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder13.setVertexBuffer(4, buffer21, 2_276, 1_948);
} catch {}
let offscreenCanvas1 = new OffscreenCanvas(326, 61);
let commandEncoder97 = device0.createCommandEncoder({});
let computePassEncoder85 = commandEncoder97.beginComputePass({});
let renderBundleEncoder15 = device0.createRenderBundleEncoder({
  label: '\u0cc6\u0440\u0105\u0100\u0ede\u7ff9\ue1a7',
  colorFormats: ['rgba32float'],
  depthReadOnly: true,
  stencilReadOnly: true,
});
try {
{ clearResourceUsages(device0, computePassEncoder59); computePassEncoder59.dispatchWorkgroups(2); };
} catch {}
try {
renderPassEncoder17.setBindGroup(0, bindGroup16, new Uint32Array(1704), 522, 0);
} catch {}
try {
renderPassEncoder4.executeBundles([renderBundle5]);
} catch {}
try {
renderPassEncoder27.setIndexBuffer(buffer50, 'uint32', 152, 339);
} catch {}
try {
renderPassEncoder9.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder15.setBindGroup(3, bindGroup9);
} catch {}
try {
renderBundleEncoder13.setBindGroup(3, bindGroup7, new Uint32Array(1653), 110, 0);
} catch {}
try {
renderBundleEncoder15.setVertexBuffer(0, buffer36, 2_344);
} catch {}
try {
buffer50.unmap();
} catch {}
let bindGroup60 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [
    {binding: 570, resource: textureView97},
    {binding: 154, resource: {buffer: buffer9, offset: 0, size: 24}},
  ],
});
let renderPassEncoder34 = commandEncoder92.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: 827.3, g: -64.91, b: -619.1, a: 705.9, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet9,
});
let sampler60 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  minFilter: 'nearest',
  lodMinClamp: 84.77,
  lodMaxClamp: 91.07,
  compare: 'equal',
});
try {
renderPassEncoder14.executeBundles([renderBundle2, renderBundle5, renderBundle13]);
} catch {}
try {
renderPassEncoder22.setIndexBuffer(buffer35, 'uint16', 2_136, 115);
} catch {}
try {
renderBundleEncoder15.setIndexBuffer(buffer22, 'uint16', 3_608, 256);
} catch {}
try {
renderBundleEncoder15.setPipeline(pipeline1);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
device0.queue.submit([commandBuffer3]);
} catch {}
try {
device0.queue.writeBuffer(buffer32, 120, new BigUint64Array(8048), 1324, 112);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture29,
  mipLevel: 0,
  origin: {x: 462, y: 0, z: 6},
  aspect: 'all',
}, new Uint8Array(32_488).fill(249), /* required buffer size: 32_488 */
{offset: 120, bytesPerRow: 272, rowsPerImage: 17}, {width: 58, height: 0, depthOrArrayLayers: 8});
} catch {}
let bindGroup61 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView77}]});
let commandBuffer4 = commandEncoder3.finish({});
try {
computePassEncoder46.setBindGroup(3, bindGroup3);
} catch {}
try {
computePassEncoder70.setBindGroup(2, bindGroup27, new Uint32Array(258), 7, 0);
} catch {}
try {
computePassEncoder85.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder25.setIndexBuffer(buffer11, 'uint32', 100, 169);
} catch {}
try {
renderBundleEncoder13.setBindGroup(0, bindGroup33, new Uint32Array(3635), 250, 0);
} catch {}
try {
renderBundleEncoder13.drawIndexed(625, 641, 1_705, 1_624_273_672, 1_298_905_320);
} catch {}
try {
renderBundleEncoder13.drawIndexedIndirect(buffer28, 16);
} catch {}
try {
renderBundleEncoder13.drawIndirect(buffer47, 2_504);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
let textureView100 = texture14.createView({baseArrayLayer: 0});
try {
computePassEncoder83.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder15.setBindGroup(2, bindGroup44, new Uint32Array(404), 9, 0);
} catch {}
try {
renderPassEncoder19.end();
} catch {}
try {
renderBundleEncoder15.setBindGroup(0, bindGroup55);
} catch {}
try {
renderBundleEncoder15.setBindGroup(0, bindGroup2, new Uint32Array(1531), 52, 0);
} catch {}
try {
renderBundleEncoder13.drawIndexedIndirect(buffer52, 500);
} catch {}
try {
renderBundleEncoder15.setIndexBuffer(buffer22, 'uint16', 1_270, 3_050);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroupLayout15 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 45,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      storageTexture: { format: 'rgba32float', access: 'read-only', viewDimension: '2d' },
    },
  ],
});
let buffer59 = device0.createBuffer({size: 26257, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder98 = device0.createCommandEncoder({label: '\u09b7\u0f8c\ucabe\u4238\u5369\u{1fd66}'});
try {
renderPassEncoder28.executeBundles([renderBundle10, renderBundle10]);
} catch {}
try {
renderBundleEncoder13.draw(0, 79, 0, 2_318_391_955);
} catch {}
try {
renderBundleEncoder13.drawIndexed(1_630, 35, 139, 431_064_785, 77_129_125);
} catch {}
try {
renderBundleEncoder13.drawIndexedIndirect(buffer40, 224);
} catch {}
try {
commandEncoder98.copyBufferToBuffer(buffer41, 172, buffer53, 1356, 76);
} catch {}
try {
device0.queue.submit([commandBuffer4]);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let commandEncoder99 = device0.createCommandEncoder({});
let commandBuffer5 = commandEncoder98.finish({});
let commandBuffer6 = commandEncoder65.finish();
let renderPassEncoder35 = commandEncoder99.beginRenderPass({
  colorAttachments: [{
  view: textureView64,
  clearValue: { r: -304.7, g: -566.7, b: 667.1, a: -617.3, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
let renderBundle14 = renderBundleEncoder15.finish({});
let externalTexture15 = device0.importExternalTexture({source: videoFrame7, colorSpace: 'display-p3'});
try {
computePassEncoder57.setBindGroup(3, bindGroup48, new Uint32Array(93), 11, 0);
} catch {}
try {
renderPassEncoder3.setBindGroup(0, bindGroup9);
} catch {}
try {
renderBundleEncoder13.draw(0, 79, 0, 427_644_943);
} catch {}
try {
renderBundleEncoder13.drawIndexed(233, 146, 238, 578_080_950, 2_864_740_678);
} catch {}
try {
renderBundleEncoder13.drawIndexedIndirect(buffer40, 104);
} catch {}
try {
renderBundleEncoder13.drawIndirect(buffer47, 3_528);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
offscreenCanvas1.getContext('webgpu');
} catch {}
try {
computePassEncoder58.setBindGroup(0, bindGroup6);
} catch {}
try {
renderPassEncoder33.setViewport(2195.394530394203, 0.37327706926402904, 195.25511643755928, 0.3545928933384126, 0.6684851146884426, 0.8588103631259386);
} catch {}
try {
renderPassEncoder32.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder13.draw(0, 45, 0, 127_044_426);
} catch {}
try {
renderBundleEncoder13.setVertexBuffer(0, buffer14, 3_640, 6_184);
} catch {}
try {
computePassEncoder36.end();
} catch {}
try {
renderPassEncoder16.beginOcclusionQuery(46);
} catch {}
try {
renderPassEncoder20.executeBundles([renderBundle11, renderBundle8, renderBundle0]);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder13.draw(3, 30, 1, 139_395_713);
} catch {}
try {
renderBundleEncoder13.drawIndirect(buffer54, 116);
} catch {}
try {
renderBundleEncoder13.setIndexBuffer(buffer14, 'uint32', 96, 2_215);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
if (!arrayBuffer2.detached) { new Uint8Array(arrayBuffer2).fill(0x55); };
} catch {}
let buffer60 = device0.createBuffer({
  size: 41210,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture106 = device0.createTexture({
  size: {width: 8},
  dimension: '1d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder86 = commandEncoder41.beginComputePass({});
let sampler61 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  lodMinClamp: 64.54,
  lodMaxClamp: 78.91,
  maxAnisotropy: 1,
});
try {
computePassEncoder11.setBindGroup(3, bindGroup23, new Uint32Array(1894), 369, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder70); computePassEncoder70.dispatchWorkgroupsIndirect(buffer45, 40); };
} catch {}
try {
renderPassEncoder30.setBindGroup(3, bindGroup26);
} catch {}
try {
renderPassEncoder30.setIndexBuffer(buffer5, 'uint32', 628, 40);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(6, buffer20, 0, 2_149);
} catch {}
try {
renderBundleEncoder13.drawIndirect(buffer20, 3_952);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
buffer54.unmap();
} catch {}
let promise8 = device0.queue.onSubmittedWorkDone();
let textureView101 = texture29.createView({baseArrayLayer: 9, arrayLayerCount: 15});
let sampler62 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 45.56,
  lodMaxClamp: 64.17,
});
try {
computePassEncoder86.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder16.endOcclusionQuery();
} catch {}
try {
renderBundleEncoder13.draw(3, 7, 0, 887_205_651);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
try {
device0.queue.writeBuffer(buffer46, 280, new BigUint64Array(14580), 3894, 152);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1980, height: 1, depthOrArrayLayers: 154}
*/
{
  source: videoFrame1,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture2,
  mipLevel: 0,
  origin: {x: 368, y: 0, z: 22},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(img2);
let bindGroupLayout16 = device0.createBindGroupLayout({
  label: '\u{1fcc4}\u05ec\uc021\u5838\uee94\u032c\u09fd\uc1a4\u{1f82e}\u92f6',
  entries: [
    {
      binding: 345,
      visibility: GPUShaderStage.VERTEX,
      storageTexture: { format: 'rgba16uint', access: 'read-only', viewDimension: '1d' },
    },
    {binding: 416, visibility: GPUShaderStage.VERTEX, sampler: { type: 'filtering' }},
    {
      binding: 3,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32uint', access: 'read-write', viewDimension: '2d-array' },
    },
    {
      binding: 402,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      buffer: { type: 'uniform', minBindingSize: 0, hasDynamicOffset: true },
    },
    {
      binding: 41,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
    {
      binding: 668,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'uniform', hasDynamicOffset: false },
    },
    {binding: 327, visibility: GPUShaderStage.COMPUTE, sampler: { type: 'non-filtering' }},
    {
      binding: 53,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
    {binding: 62, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' }},
  ],
});
let bindGroup62 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView42}]});
let textureView102 = texture103.createView({label: '\u0c11\ub079\u6dae\u0e6e\udcf3\u8684\u0361'});
let textureView103 = texture80.createView({mipLevelCount: 1, baseArrayLayer: 5, arrayLayerCount: 11});
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(4, buffer20, 1_684);
} catch {}
try {
renderBundleEncoder13.setBindGroup(1, bindGroup13, new Uint32Array(492), 0, 0);
} catch {}
try {
renderBundleEncoder13.drawIndirect(buffer30, 1_208);
} catch {}
try {
renderBundleEncoder13.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder13.setVertexBuffer(5, buffer33, 0);
} catch {}
try {
buffer22.unmap();
} catch {}
let texture107 = device0.createTexture({
  size: [990],
  dimension: '1d',
  format: 'rgba16uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let renderBundle15 = renderBundleEncoder13.finish({});
try {
renderPassEncoder18.executeBundles([renderBundle11]);
} catch {}
try {
renderPassEncoder21.setVertexBuffer(0, buffer28);
} catch {}
let buffer61 = device0.createBuffer({
  size: 10155,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let textureView104 = texture107.createView({label: '\u1258\u20e2\u0dfb\u{1fcb7}\u3707\u2b7c\u{1f99a}\ud76b\u8277', baseArrayLayer: 0});
let textureView105 = texture47.createView({dimension: '2d', format: 'r8sint', baseArrayLayer: 26});
try {
renderPassEncoder18.executeBundles([renderBundle13]);
} catch {}
try {
renderPassEncoder16.setPipeline(pipeline2);
} catch {}
let commandEncoder100 = device0.createCommandEncoder({});
let textureView106 = texture77.createView({dimension: '2d-array'});
let textureView107 = texture63.createView({label: '\u0a68\u285b\u7f40\u{1f7a6}\u{1fae1}', dimension: '2d'});
try {
computePassEncoder6.setBindGroup(0, bindGroup12);
} catch {}
try {
renderPassEncoder33.setBindGroup(3, bindGroup21, new Uint32Array(820), 265, 2);
} catch {}
try {
renderPassEncoder34.setViewport(2009.412388143708, 0.6323367938559505, 1384.7632153903496, 0.33960345912775974, 0.1498953139293575, 0.9674002753669161);
} catch {}
try {
renderPassEncoder27.setVertexBuffer(0, buffer37, 0, 720);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
try {
  await promise8;
} catch {}
let textureView108 = texture33.createView({mipLevelCount: 1});
let computePassEncoder87 = commandEncoder100.beginComputePass();
let sampler63 = device0.createSampler({
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 68.56,
  lodMaxClamp: 72.10,
  maxAnisotropy: 2,
});
try {
computePassEncoder87.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder9.beginOcclusionQuery(160);
} catch {}
try {
renderPassEncoder20.setIndexBuffer(buffer11, 'uint16', 78, 12);
} catch {}
let textureView109 = texture93.createView({});
try {
renderPassEncoder18.setBindGroup(3, bindGroup61);
} catch {}
try {
renderPassEncoder13.setStencilReference(1246);
} catch {}
try {
renderPassEncoder31.setViewport(2267.7828003843706, 0.27450798591808023, 1192.5104665099977, 0.43405244066441095, 0.3678357091870694, 0.49801950085914465);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer10, 'uint32', 2_440, 994);
} catch {}
try {
renderPassEncoder3.setVertexBuffer(0, buffer60);
} catch {}
document.body.append(canvas1);
let textureView110 = texture54.createView({
  label: '\u851b\u{1fe28}\u{1fd54}\ubd98\u7890\u8105\ub3ac\u095d',
  format: 'rgba32float',
  mipLevelCount: 1,
  arrayLayerCount: 1,
});
try {
computePassEncoder85.setBindGroup(0, bindGroup3);
} catch {}
try {
computePassEncoder42.setBindGroup(1, bindGroup54, new Uint32Array(3124), 46, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder70); computePassEncoder70.dispatchWorkgroupsIndirect(buffer30, 404); };
} catch {}
try {
renderPassEncoder11.setBindGroup(3, bindGroup62, new Uint32Array(412), 82, 0);
} catch {}
try {
renderPassEncoder9.endOcclusionQuery();
} catch {}
try {
renderPassEncoder3.draw(21, 63, 7, 391_143_294);
} catch {}
try {
renderPassEncoder3.drawIndexedIndirect(buffer41, 308);
} catch {}
try {
buffer12.unmap();
} catch {}
document.body.prepend(img0);
let bindGroup63 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 359, resource: {buffer: buffer10, offset: 2048, size: 1018}},
    {binding: 150, resource: textureView1},
    {binding: 89, resource: sampler45},
    {binding: 313, resource: textureView6},
    {binding: 298, resource: {buffer: buffer14, offset: 8960, size: 2712}},
    {binding: 140, resource: textureView28},
    {binding: 487, resource: textureView89},
    {binding: 29, resource: textureView35},
    {binding: 173, resource: {buffer: buffer9, offset: 0, size: 4}},
  ],
});
try {
computePassEncoder23.setBindGroup(1, bindGroup38, new Uint32Array(1547), 754, 0);
} catch {}
try {
renderPassEncoder4.setBlendConstant({ r: 91.63, g: -313.0, b: -924.1, a: 548.1, });
} catch {}
try {
buffer35.unmap();
} catch {}
let textureView111 = texture83.createView({label: '\u0b84\u0c2f\udc20\u0d7f\u3203\u3693\u{1fb4a}\u{1fceb}', format: 'r8sint', arrayLayerCount: 1});
try {
renderPassEncoder3.draw(8, 92, 1, 372_305_813);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer61, 'uint32', 4_024, 1_757);
} catch {}
let bindGroup64 = device0.createBindGroup({
  label: '\u2a7e\uff7b\u{1fdad}\uf21e\u0d2b\u126c\u733d\u0971\u20e2\u4096\u0fe8',
  layout: bindGroupLayout16,
  entries: [
    {binding: 668, resource: {buffer: buffer40, offset: 1280}},
    {binding: 345, resource: textureView104},
    {binding: 53, resource: textureView91},
    {binding: 327, resource: sampler57},
    {binding: 3, resource: textureView106},
    {binding: 62, resource: sampler30},
    {binding: 416, resource: sampler63},
    {binding: 41, resource: {buffer: buffer28, offset: 0, size: 4}},
    {binding: 402, resource: {buffer: buffer39, offset: 256, size: 330}},
  ],
});
let commandEncoder101 = device0.createCommandEncoder({});
let computePassEncoder88 = commandEncoder101.beginComputePass({});
try {
renderPassEncoder9.setViewport(2847.0600407676993, 0.9528649860881423, 779.3924695650259, 0.020442648966944272, 0.8779400196724323, 0.9504169128824885);
} catch {}
try {
renderPassEncoder3.drawIndirect(buffer40, 108);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.writeBuffer(buffer29, 932, new BigUint64Array(11845), 579, 216);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let commandEncoder102 = device0.createCommandEncoder();
try {
computePassEncoder77.setBindGroup(3, bindGroup13);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder59); computePassEncoder59.dispatchWorkgroupsIndirect(buffer23, 3_680); };
} catch {}
try {
computePassEncoder88.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder35.setBindGroup(3, bindGroup45, new Uint32Array(838), 91, 0);
} catch {}
try {
renderPassEncoder3.drawIndexedIndirect(buffer60, 8_300);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer56, 'uint32', 316, 1_911);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let buffer62 = device0.createBuffer({size: 6551, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT});
try {
renderPassEncoder29.setBindGroup(3, bindGroup26);
} catch {}
try {
renderPassEncoder30.executeBundles([renderBundle0, renderBundle6]);
} catch {}
try {
renderPassEncoder3.draw(9, 275, 16, 49_297_820);
} catch {}
try {
renderPassEncoder3.drawIndirect(buffer23, 1_900);
} catch {}
try {
renderPassEncoder29.insertDebugMarker('\u975f');
} catch {}
let texture108 = device0.createTexture({
  label: '\u06be\uc4ab\u05f5\u4898\ud7fc',
  size: [3960],
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let textureView112 = texture61.createView({mipLevelCount: 1});
let computePassEncoder89 = commandEncoder102.beginComputePass();
try {
computePassEncoder89.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder3.draw(5, 261, 2, 1_942_715_791);
} catch {}
try {
renderPassEncoder3.drawIndexedIndirect(buffer62, 260);
} catch {}
try {
renderPassEncoder3.drawIndirect(buffer20, 432);
} catch {}
try {
renderPassEncoder18.setVertexBuffer(5, buffer12, 24);
} catch {}
try {
buffer31.unmap();
} catch {}
let bindGroup65 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 487, resource: textureView72},
    {binding: 313, resource: textureView0},
    {binding: 359, resource: {buffer: buffer40, offset: 256}},
    {binding: 89, resource: sampler49},
    {binding: 29, resource: textureView35},
    {binding: 150, resource: textureView56},
    {binding: 298, resource: {buffer: buffer52, offset: 256, size: 20}},
    {binding: 140, resource: textureView43},
    {binding: 173, resource: {buffer: buffer24, offset: 0, size: 172}},
  ],
});
try {
computePassEncoder78.setBindGroup(0, bindGroup2, new Uint32Array(862), 3, 0);
} catch {}
try {
renderPassEncoder3.draw(16, 19, 3, 1_016_692_113);
} catch {}
try {
renderPassEncoder3.drawIndirect(buffer62, 392);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(5, buffer12, 4, 10);
} catch {}
try {
buffer32.unmap();
} catch {}
let texture109 = device0.createTexture({size: [990, 1, 66], format: 'rg32sint', usage: GPUTextureUsage.COPY_DST, viewFormats: []});
let sampler64 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 43.55,
});
try {
renderPassEncoder33.setBindGroup(2, bindGroup25);
} catch {}
try {
renderPassEncoder30.setIndexBuffer(buffer14, 'uint32', 4_932, 4_816);
} catch {}
try {
renderPassEncoder22.setVertexBuffer(1, buffer60, 0);
} catch {}
try {
buffer30.unmap();
} catch {}
let canvas2 = document.createElement('canvas');
let bindGroup66 = device0.createBindGroup({
  label: '\u6f74\uf5c2\u{1ffa5}\u2489\u9616\u{1fea3}\u21b2',
  layout: bindGroupLayout8,
  entries: [{binding: 33, resource: externalTexture10}],
});
let pipelineLayout10 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout0]});
let buffer63 = device0.createBuffer({
  size: 16070,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder103 = device0.createCommandEncoder({});
let texture110 = device0.createTexture({
  size: [495, 1, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView113 = texture53.createView({
  label: '\u993e\ue347\u0d5c',
  format: 'rgba32float',
  mipLevelCount: 1,
  baseArrayLayer: 7,
  arrayLayerCount: 1,
});
let computePassEncoder90 = commandEncoder103.beginComputePass();
try {
computePassEncoder90.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder11.setScissorRect(201, 0, 460, 0);
} catch {}
try {
buffer56.unmap();
} catch {}
let imageData11 = new ImageData(32, 32);
let buffer64 = device0.createBuffer({
  size: 14908,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let textureView114 = texture77.createView({dimension: '2d-array'});
try {
renderPassEncoder26.setBindGroup(1, bindGroup62);
} catch {}
try {
renderPassEncoder3.end();
} catch {}
try {
renderPassEncoder32.executeBundles([renderBundle9, renderBundle14, renderBundle10]);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer5, 'uint16', 74, 652);
} catch {}
try {
commandEncoder12.copyBufferToTexture({
  /* bytesInLastRow: 1320 widthInBlocks: 165 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 408 */
  offset: 408,
  bytesPerRow: 10496,
  buffer: buffer41,
}, {
  texture: texture107,
  mipLevel: 0,
  origin: {x: 33, y: 0, z: 0},
  aspect: 'all',
}, {width: 165, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup67 = device0.createBindGroup({
  label: '\ua2fc\u5098\u0636\uad8b',
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer60, offset: 25856, size: 2460}},
    {binding: 329, resource: textureView18},
  ],
});
let texture111 = device0.createTexture({
  label: '\ud684\u7edc\u1029\uf199\ua57a\u{1fabe}\u80bc',
  size: [47],
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView115 = texture44.createView({dimension: '2d'});
let computePassEncoder91 = commandEncoder12.beginComputePass();
try {
computePassEncoder45.setBindGroup(3, bindGroup44);
} catch {}
try {
computePassEncoder91.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder16.executeBundles([renderBundle7, renderBundle1]);
} catch {}
try {
renderPassEncoder21.setIndexBuffer(buffer15, 'uint32', 56, 109);
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
try {
device0.queue.submit([commandBuffer5, commandBuffer6]);
} catch {}
let gpuCanvasContext2 = canvas2.getContext('webgpu');
let texture112 = device0.createTexture({
  label: '\u06bd\u0040\ub7d6\uf6cb\u0e92\ubf25\u08b0\u4dc9',
  size: [95, 1, 44],
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder65.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder28.setBindGroup(0, bindGroup19);
} catch {}
try {
renderPassEncoder28.draw(161, 17, 61_187_102, 1_217_515_082);
} catch {}
try {
renderPassEncoder28.drawIndirect(buffer45, 508);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(3, buffer12, 0);
} catch {}
let bindGroup68 = device0.createBindGroup({
  layout: bindGroupLayout16,
  entries: [
    {binding: 668, resource: {buffer: buffer39, offset: 0, size: 142}},
    {binding: 402, resource: {buffer: buffer61, offset: 2560, size: 257}},
    {binding: 3, resource: textureView106},
    {binding: 62, resource: sampler47},
    {binding: 53, resource: textureView91},
    {binding: 327, resource: sampler22},
    {binding: 416, resource: sampler43},
    {binding: 41, resource: {buffer: buffer14, offset: 7680, size: 5228}},
    {binding: 345, resource: textureView104},
  ],
});
let commandEncoder104 = device0.createCommandEncoder({label: '\u3336\u37f7\u5b1e\u{1fc27}'});
let texture113 = device0.createTexture({
  size: {width: 495, height: 1, depthOrArrayLayers: 62},
  dimension: '3d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
try {
renderPassEncoder27.executeBundles([renderBundle11, renderBundle1]);
} catch {}
try {
renderPassEncoder28.drawIndirect(buffer29, 288);
} catch {}
try {
renderPassEncoder8.setVertexBuffer(6, buffer50, 772);
} catch {}
try {
commandEncoder104.copyBufferToTexture({
  /* bytesInLastRow: 136 widthInBlocks: 17 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 64 */
  offset: 64,
  buffer: buffer26,
}, {
  texture: texture89,
  mipLevel: 1,
  origin: {x: 4, y: 0, z: 1},
  aspect: 'all',
}, {width: 17, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroupLayout17 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 400,
      visibility: GPUShaderStage.VERTEX,
      texture: { viewDimension: '3d', sampleType: 'uint', multisampled: false },
    },
  ],
});
let commandEncoder105 = device0.createCommandEncoder({});
let textureView116 = texture49.createView({dimension: '2d', baseArrayLayer: 3});
let sampler65 = device0.createSampler({addressModeU: 'repeat', addressModeW: 'repeat', lodMinClamp: 11.91, lodMaxClamp: 84.31});
try {
computePassEncoder15.setBindGroup(3, bindGroup47, new Uint32Array(2315), 423, 0);
} catch {}
try {
renderPassEncoder29.setBindGroup(2, bindGroup36, new Uint32Array(15), 7, 0);
} catch {}
try {
renderPassEncoder28.draw(79, 804, 33_909_228, 104_140_108);
} catch {}
try {
renderPassEncoder22.setIndexBuffer(buffer56, 'uint32', 3_516, 135);
} catch {}
try {
renderPassEncoder28.setVertexBuffer(4, buffer10);
} catch {}
try {
commandEncoder104.copyBufferToBuffer(buffer1, 664, buffer37, 2748, 60);
} catch {}
try {
device0.queue.submit([]);
} catch {}
document.body.prepend(canvas0);
let imageData12 = new ImageData(12, 160);
let pipelineLayout11 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer65 = device0.createBuffer({
  label: '\u74a6\u4172\u747d',
  size: 65536,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM,
});
let texture114 = device0.createTexture({size: [47, 1, 1], format: 'r32sint', usage: GPUTextureUsage.STORAGE_BINDING, viewFormats: []});
let textureView117 = texture109.createView({dimension: '2d', mipLevelCount: 1, baseArrayLayer: 10});
let computePassEncoder92 = commandEncoder104.beginComputePass({});
try {
computePassEncoder71.setBindGroup(2, bindGroup53);
} catch {}
try {
renderPassEncoder28.draw(457, 172, 1_871_693_412, 46_234_737);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer5, 'uint16', 970, 325);
} catch {}
try {
renderPassEncoder13.setPipeline(pipeline2);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 31}
*/
{
  source: imageData11,
  origin: { x: 5, y: 4 },
  flipY: true,
}, {
  texture: texture86,
  mipLevel: 0,
  origin: {x: 1894, y: 0, z: 4},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer2.detached) { new Uint8Array(arrayBuffer2).fill(0x55); };
} catch {}
let bindGroupLayout18 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 72,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '3d' },
    },
    {
      binding: 575,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      sampler: { type: 'comparison' },
    },
    {
      binding: 67,
      visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      sampler: { type: 'filtering' },
    },
    {
      binding: 490,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
    {
      binding: 54,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba8unorm', access: 'write-only', viewDimension: '2d' },
    },
  ],
});
let buffer66 = device0.createBuffer({size: 45500, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.UNIFORM});
let commandEncoder106 = device0.createCommandEncoder({label: '\u3958\ub473\u{1fe86}\u8f8b\ue3f8\u718d\u0cd1\u{1fcac}'});
let textureView118 = texture114.createView({});
let computePassEncoder93 = commandEncoder106.beginComputePass({});
try {
computePassEncoder50.setBindGroup(1, bindGroup60);
} catch {}
try {
computePassEncoder70.end();
} catch {}
try {
computePassEncoder92.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder29.setStencilReference(94);
} catch {}
try {
  await buffer1.mapAsync(GPUMapMode.WRITE, 1912, 16);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 15}
*/
{
  source: videoFrame7,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 3},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let querySet10 = device0.createQuerySet({label: '\u7492\uf922\u436a\u0627\u0cb9\u067e\u3ab4', type: 'occlusion', count: 12});
let textureView119 = texture96.createView({
  label: '\u{1fcdf}\u4ef6\u047c\u059c\u60ba\u07d5\u0628',
  aspect: 'all',
  format: 'rgba32float',
  baseArrayLayer: 4,
  arrayLayerCount: 3,
});
let textureView120 = texture10.createView({mipLevelCount: 1});
try {
computePassEncoder59.end();
} catch {}
try {
renderPassEncoder28.draw(19, 115, 1_194_854_324, 535_490_162);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(3, buffer12, 0);
} catch {}
try {
commandEncoder69.copyBufferToTexture({
  /* bytesInLastRow: 15 widthInBlocks: 15 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 548 */
  offset: 548,
  bytesPerRow: 12544,
  buffer: buffer10,
}, {
  texture: texture43,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, {width: 15, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let buffer67 = device0.createBuffer({
  size: 2092,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder107 = device0.createCommandEncoder({});
let texture115 = device0.createTexture({
  size: [47, 1, 108],
  format: 'rgba8unorm',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture116 = device0.createTexture({size: {width: 95}, dimension: '1d', format: 'rgb10a2uint', usage: GPUTextureUsage.COPY_SRC});
let textureView121 = texture40.createView({});
let renderPassEncoder36 = commandEncoder107.beginRenderPass({
  colorAttachments: [{
  view: textureView76,
  clearValue: { r: -602.4, g: -959.4, b: -904.0, a: 50.48, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let sampler66 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 35.66,
  lodMaxClamp: 91.17,
});
let externalTexture16 = device0.importExternalTexture({source: videoFrame0});
try {
computePassEncoder8.setBindGroup(1, bindGroup47);
} catch {}
try {
renderPassEncoder30.setBindGroup(1, bindGroup35, new Uint32Array(826), 319, 0);
} catch {}
try {
renderPassEncoder28.draw(55, 105, 63_770_766, 1_717_312_365);
} catch {}
let commandBuffer7 = commandEncoder78.finish({});
let textureView122 = texture115.createView({dimension: '2d', format: 'rgba8unorm', baseArrayLayer: 24});
try {
computePassEncoder8.setBindGroup(2, bindGroup43, new Uint32Array(2806), 189, 0);
} catch {}
try {
renderPassEncoder28.draw(69, 56, 2_002_244_068, 695_400_199);
} catch {}
try {
renderPassEncoder28.drawIndirect(buffer9, 0);
} catch {}
try {
renderPassEncoder21.setIndexBuffer(buffer35, 'uint32', 896, 1_490);
} catch {}
try {
renderPassEncoder15.setPipeline(pipeline1);
} catch {}
let texture117 = device0.createTexture({
  label: '\u6207\u0765\u07f6\u5bd1\u4942\u3c34',
  size: [3960, 1, 1],
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let renderPassEncoder37 = commandEncoder69.beginRenderPass({
  label: '\u0a06\u6103\u084d\u8f5c\u0f98\u05a6',
  colorAttachments: [{view: textureView111, loadOp: 'load', storeOp: 'discard'}],
});
let sampler67 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 10.51,
  lodMaxClamp: 99.32,
  maxAnisotropy: 4,
});
try {
{ clearResourceUsages(device0, computePassEncoder6); computePassEncoder6.dispatchWorkgroups(1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder78); computePassEncoder78.dispatchWorkgroupsIndirect(buffer45, 144); };
} catch {}
try {
renderPassEncoder29.setBindGroup(2, bindGroup36, new Uint32Array(5030), 314, 0);
} catch {}
try {
renderPassEncoder28.draw(4, 210, 199_033_588, 1_888_722_431);
} catch {}
try {
renderPassEncoder28.drawIndirect(buffer47, 192);
} catch {}
try {
renderPassEncoder26.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder8.setVertexBuffer(5, buffer36, 1_384);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture106,
  mipLevel: 0,
  origin: {x: 5, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(34).fill(15), /* required buffer size: 34 */
{offset: 34}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup69 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView36}]});
let texture118 = device0.createTexture({
  size: [990, 1, 341],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder94 = commandEncoder105.beginComputePass({label: '\u0ccf\ub619\ud77a\u0fcc\u0fca\u{1f787}\u0420\u{1f99e}\u2d3a\u{1fabb}'});
try {
renderPassEncoder9.executeBundles([renderBundle2, renderBundle11]);
} catch {}
try {
renderPassEncoder28.draw(233, 120, 182_786_529, 54_127_015);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer61, 'uint32', 308, 958);
} catch {}
try {
renderPassEncoder21.setVertexBuffer(6, buffer12, 4);
} catch {}
let bindGroup70 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 7, resource: textureView59},
    {binding: 227, resource: {buffer: buffer39, offset: 0, size: 713}},
    {binding: 21, resource: textureView122},
  ],
});
let commandEncoder108 = device0.createCommandEncoder({label: '\u34af\ub237'});
try {
computePassEncoder64.setBindGroup(1, bindGroup56, new Uint32Array(1225), 264, 0);
} catch {}
try {
computePassEncoder93.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder32.setBindGroup(0, bindGroup70);
} catch {}
try {
renderPassEncoder28.drawIndirect(buffer20, 56);
} catch {}
try {
renderPassEncoder15.setIndexBuffer(buffer41, 'uint32', 80, 216);
} catch {}
let buffer68 = device0.createBuffer({size: 11022, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder109 = device0.createCommandEncoder({label: '\u0d6a\u0080\u{1fdc8}\uc94f\ubdce\u75f7\ufb66\u0024'});
let texture119 = device0.createTexture({
  size: [95, 1, 1],
  mipLevelCount: 2,
  format: 'rg32uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView123 = texture100.createView({baseArrayLayer: 0});
let computePassEncoder95 = commandEncoder108.beginComputePass();
try {
computePassEncoder69.setBindGroup(1, bindGroup23, new Uint32Array(1791), 188, 0);
} catch {}
try {
computePassEncoder95.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setScissorRect(48, 0, 7, 1);
} catch {}
try {
renderPassEncoder28.draw(116, 184, 672_394_351, 992_530_441);
} catch {}
let commandEncoder110 = device0.createCommandEncoder({});
let textureView124 = texture108.createView({dimension: '1d'});
try {
computePassEncoder14.setBindGroup(0, bindGroup19);
} catch {}
try {
computePassEncoder24.setBindGroup(2, bindGroup69, new Uint32Array(386), 60, 0);
} catch {}
try {
renderPassEncoder22.setBindGroup(2, bindGroup38, []);
} catch {}
try {
renderPassEncoder28.draw(36, 269, 109_444_340, 871_485_415);
} catch {}
try {
renderPassEncoder28.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext0.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.TEXTURE_BINDING});
} catch {}
try {
device0.queue.writeBuffer(buffer47, 4036, new Float32Array(14207), 3907, 44);
} catch {}
let buffer69 = device0.createBuffer({size: 21782, usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX});
try {
computePassEncoder91.setBindGroup(2, bindGroup22, new Uint32Array(3729), 86, 0);
} catch {}
try {
computePassEncoder94.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder25.setBindGroup(1, bindGroup26, new Uint32Array(981), 240, 0);
} catch {}
try {
renderPassEncoder14.setVertexBuffer(0, buffer60);
} catch {}
try {
commandEncoder110.copyBufferToBuffer(buffer7, 292, buffer62, 1836, 128);
} catch {}
try {
commandEncoder109.copyBufferToTexture({
  /* bytesInLastRow: 196 widthInBlocks: 49 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 740 */
  offset: 740,
  bytesPerRow: 22528,
  buffer: buffer3,
}, {
  texture: texture58,
  mipLevel: 0,
  origin: {x: 7, y: 5, z: 0},
  aspect: 'all',
}, {width: 49, height: 7, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder110.insertDebugMarker('\u{1fd57}');
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 31}
*/
{
  source: canvas2,
  origin: { x: 7, y: 66 },
  flipY: false,
}, {
  texture: texture86,
  mipLevel: 0,
  origin: {x: 63, y: 0, z: 4},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 110, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup71 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer21, offset: 4352, size: 1116}}],
});
let textureView125 = texture42.createView({baseMipLevel: 0});
let computePassEncoder96 = commandEncoder110.beginComputePass({});
let renderPassEncoder38 = commandEncoder109.beginRenderPass({
  label: '\u64d9\u0efe\u0003\u0ded\u85fa\u0a2c\u90bd\u{1f9d9}\u6f3b',
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: -506.9, g: 988.4, b: -208.6, a: 351.2, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
renderPassEncoder36.setBindGroup(1, bindGroup55);
} catch {}
try {
renderPassEncoder26.setScissorRect(32, 0, 4, 1);
} catch {}
try {
renderPassEncoder28.draw(8, 417, 898_029_487, 273_197_647);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture70,
  mipLevel: 0,
  origin: {x: 7, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(10).fill(232), /* required buffer size: 10 */
{offset: 10}, {width: 31, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let bindGroup72 = device0.createBindGroup({layout: bindGroupLayout15, entries: [{binding: 45, resource: textureView107}]});
let buffer70 = device0.createBuffer({
  label: '\ue279\u{1ff6c}\u1e67\u3f50\uf4fc\u8243\uee34',
  size: 6788,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE,
  mappedAtCreation: false,
});
let querySet11 = device0.createQuerySet({label: '\u9313\u0e91\u{1fa32}\ub563', type: 'occlusion', count: 41});
let texture120 = device0.createTexture({
  size: [1980, 1, 33],
  mipLevelCount: 1,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let renderBundleEncoder16 = device0.createRenderBundleEncoder({colorFormats: ['rg32sint', 'rgb10a2uint', 'rgba16float'], sampleCount: 4, depthReadOnly: true});
let sampler68 = device0.createSampler({
  label: '\u0d84\u{1ff20}\uf3f7\u8308\u0abe\u0566\u81d2\u08d2\u2a83\u0139',
  addressModeU: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 43.08,
  lodMaxClamp: 47.29,
  compare: 'less-equal',
});
try {
renderPassEncoder28.setBindGroup(2, bindGroup36);
} catch {}
try {
renderPassEncoder28.end();
} catch {}
try {
commandEncoder80.copyTextureToTexture({
  texture: texture54,
  mipLevel: 1,
  origin: {x: 10, y: 0, z: 7},
  aspect: 'all',
},
{
  texture: texture63,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
},
{width: 11, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup73 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView3}]});
let commandEncoder111 = device0.createCommandEncoder();
try {
computePassEncoder95.setBindGroup(0, bindGroup7, new Uint32Array(2020), 248, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder78); computePassEncoder78.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder34.setBlendConstant({ r: 133.7, g: -970.3, b: -323.7, a: -573.9, });
} catch {}
try {
renderBundleEncoder16.setBindGroup(0, bindGroup59);
} catch {}
try {
renderBundleEncoder16.setIndexBuffer(buffer32, 'uint32', 224, 439);
} catch {}
try {
buffer50.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer0, 52, new Float32Array(37678), 66, 24);
} catch {}
let computePassEncoder97 = commandEncoder80.beginComputePass({});
try {
computePassEncoder94.setBindGroup(0, bindGroup6, new Uint32Array(655), 89, 0);
} catch {}
try {
renderPassEncoder12.executeBundles([renderBundle4]);
} catch {}
try {
buffer63.unmap();
} catch {}
let textureView126 = texture49.createView({dimension: 'cube-array', baseArrayLayer: 5, arrayLayerCount: 6});
try {
computePassEncoder19.setBindGroup(1, bindGroup30);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer62, 'uint32', 1_604, 417);
} catch {}
try {
renderPassEncoder16.setVertexBuffer(3, buffer50);
} catch {}
try {
renderBundleEncoder16.setBindGroup(3, bindGroup19, []);
} catch {}
try {
renderBundleEncoder16.setBindGroup(0, bindGroup55, new Uint32Array(823), 124, 0);
} catch {}
try {
renderBundleEncoder16.setVertexBuffer(4, buffer37, 1_780, 847);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 23, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame4,
  origin: { x: 1, y: 0 },
  flipY: true,
}, {
  texture: texture59,
  mipLevel: 3,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup74 = device0.createBindGroup({
  label: '\u{1fc8d}\u{1fc2d}\u47f0\u395b\u3c66\u7c69\u{1f99b}\u4a9b',
  layout: bindGroupLayout16,
  entries: [
    {binding: 345, resource: textureView104},
    {binding: 3, resource: textureView106},
    {binding: 53, resource: textureView91},
    {binding: 668, resource: {buffer: buffer12, offset: 0, size: 105}},
    {binding: 62, resource: sampler65},
    {binding: 416, resource: sampler53},
    {binding: 41, resource: {buffer: buffer9, offset: 0, size: 12}},
    {binding: 402, resource: {buffer: buffer2, offset: 3328}},
    {binding: 327, resource: sampler66},
  ],
});
let commandEncoder112 = device0.createCommandEncoder({});
let renderPassEncoder39 = commandEncoder111.beginRenderPass({
  label: '\u3bf6\u63ec\u0fe2\u12dc',
  colorAttachments: [{view: textureView98, loadOp: 'load', storeOp: 'store'}],
});
let sampler69 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 43.81,
  lodMaxClamp: 98.44,
});
try {
computePassEncoder6.end();
} catch {}
try {
computePassEncoder96.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder22.executeBundles([renderBundle14, renderBundle9, renderBundle10]);
} catch {}
try {
renderPassEncoder37.setVertexBuffer(4, buffer10, 0, 3_424);
} catch {}
try {
renderBundleEncoder16.setBindGroup(3, bindGroup38);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
adapter0.label = '\u{1ff0b}\u020b\ud01a\u7d72\u0cc6\u00fc\u12cf\u0cbe\u7a3c';
} catch {}
let texture121 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 1},
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let renderPassEncoder40 = commandEncoder112.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -551.4, g: -311.5, b: -523.3, a: 526.8, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder73.setBindGroup(0, bindGroup31, []);
} catch {}
try {
computePassEncoder78.end();
} catch {}
try {
computePassEncoder97.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder9.setBindGroup(0, bindGroup19, new Uint32Array(101), 13, 0);
} catch {}
try {
renderPassEncoder25.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder16.setBindGroup(0, bindGroup43, new Uint32Array(681), 32, 0);
} catch {}
try {
renderBundleEncoder16.setIndexBuffer(buffer15, 'uint32', 132, 447);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
document.body.append(canvas2);
let textureView127 = texture80.createView({dimension: '2d', baseArrayLayer: 3});
let renderPassEncoder41 = commandEncoder8.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 361.6, g: 27.36, b: -810.9, a: -373.4, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet6,
});
try {
computePassEncoder50.setBindGroup(2, bindGroup67, new Uint32Array(5118), 453, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder58); computePassEncoder58.dispatchWorkgroups(1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder94); computePassEncoder94.dispatchWorkgroupsIndirect(buffer62, 1_428); };
} catch {}
try {
renderPassEncoder16.setViewport(1749.6454011201643, 0.8370453058725601, 354.6608698897507, 0.12306602319684183, 0.28787178887586806, 0.8896506622443525);
} catch {}
try {
renderPassEncoder25.setIndexBuffer(buffer30, 'uint16', 358, 852);
} catch {}
document.body.append(canvas1);
let buffer71 = device0.createBuffer({
  size: 23687,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture122 = device0.createTexture({
  size: [380, 5, 119],
  mipLevelCount: 3,
  sampleCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder42 = commandEncoder87.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: 798.1, g: -390.4, b: 346.0, a: -861.8, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
try {
computePassEncoder77.setBindGroup(1, bindGroup46);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer47, 'uint16', 1_844, 693);
} catch {}
try {
renderBundleEncoder16.setIndexBuffer(buffer63, 'uint16', 1_664, 1_343);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
let promise9 = device0.queue.onSubmittedWorkDone();
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas1,
  origin: { x: 11, y: 5 },
  flipY: true,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 15, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup75 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [
    {binding: 154, resource: {buffer: buffer19, offset: 0, size: 660}},
    {binding: 570, resource: textureView102},
  ],
});
let texture123 = device0.createTexture({size: {width: 380}, dimension: '1d', format: 'r8sint', usage: GPUTextureUsage.COPY_SRC, viewFormats: []});
try {
computePassEncoder51.setBindGroup(0, bindGroup57);
} catch {}
try {
computePassEncoder63.setBindGroup(0, bindGroup59, new Uint32Array(3147), 594, 0);
} catch {}
try {
renderPassEncoder15.setBindGroup(3, bindGroup0, new Uint32Array(3080), 577, 0);
} catch {}
try {
renderPassEncoder22.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder29.setVertexBuffer(1, buffer18, 1_824, 393);
} catch {}
try {
renderBundleEncoder16.setIndexBuffer(buffer21, 'uint16', 124, 3_916);
} catch {}
try {
renderBundleEncoder16.setVertexBuffer(7, buffer10, 0, 794);
} catch {}
let arrayBuffer4 = buffer40.getMappedRange(2080, 64);
try {
renderBundleEncoder16.insertDebugMarker('\u7044');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
externalTexture10.label = '\uf2e1\u0961\u7f62\u{1f74c}\u0f5e\u{1fa32}';
} catch {}
let texture124 = device0.createTexture({
  size: {width: 3960},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
renderPassEncoder15.setBindGroup(2, bindGroup23);
} catch {}
try {
renderBundleEncoder16.setIndexBuffer(buffer66, 'uint32', 3_180, 1_811);
} catch {}
try {
device0.queue.writeBuffer(buffer51, 260, new BigUint64Array(8128), 1788, 24);
} catch {}
let commandEncoder113 = device0.createCommandEncoder({});
let texture125 = device0.createTexture({
  size: {width: 495, height: 1, depthOrArrayLayers: 1},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let textureView128 = texture83.createView({dimension: '2d', baseArrayLayer: 1});
let renderPassEncoder43 = commandEncoder113.beginRenderPass({
  label: '\u66ad\u1db0\udd21\ue048\u6adb\uac6f\u073e\u{1fbf0}\u6c64\ucd97',
  colorAttachments: [{
  view: textureView71,
  depthSlice: 9,
  clearValue: { r: -544.0, g: 847.5, b: -917.9, a: -460.0, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet3,
});
let renderBundle16 = renderBundleEncoder16.finish();
try {
computePassEncoder42.setBindGroup(0, bindGroup25);
} catch {}
try {
computePassEncoder49.setBindGroup(3, bindGroup71, new Uint32Array(1308), 326, 0);
} catch {}
try {
renderPassEncoder11.setBindGroup(0, bindGroup12, new Uint32Array(3001), 1_335, 0);
} catch {}
try {
renderPassEncoder22.setIndexBuffer(buffer63, 'uint32', 48, 710);
} catch {}
try {
renderPassEncoder37.setVertexBuffer(0, buffer48);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let textureView129 = texture62.createView({});
let renderBundleEncoder17 = device0.createRenderBundleEncoder({label: '\uc89f\ud10b\u314d\u061c\u0f6c\u{1fa28}', colorFormats: ['rgba32float']});
let sampler70 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  lodMinClamp: 76.27,
  lodMaxClamp: 95.00,
});
try {
computePassEncoder83.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder36.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder17.setBindGroup(3, bindGroup71);
} catch {}
try {
renderBundleEncoder17.setIndexBuffer(buffer23, 'uint32', 12_364, 899);
} catch {}
try {
device0.lost.then(r => { log('device0 lost!'); log(r.message, r.reason); });
} catch {}
let imageData13 = new ImageData(148, 8);
let bindGroupLayout19 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 64,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32float', access: 'read-write', viewDimension: '2d-array' },
    },
    {
      binding: 12,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
  ],
});
let commandEncoder114 = device0.createCommandEncoder();
let computePassEncoder98 = commandEncoder114.beginComputePass({label: '\u0b96\u{1fd44}\u4c44\u{1fb9a}\u44c4\u{1ff41}\u4959'});
let renderBundle17 = renderBundleEncoder17.finish({});
try {
computePassEncoder73.setBindGroup(0, bindGroup33, new Uint32Array(951), 134, 0);
} catch {}
try {
  await shaderModule5.getCompilationInfo();
} catch {}
let texture126 = gpuCanvasContext0.getCurrentTexture();
let sampler71 = device0.createSampler({
  label: '\u{1fdb6}\u{1f7bc}\u{1fb12}\u1952\u2044\u0ef4\u{1f88e}\ue082',
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMaxClamp: 86.11,
});
try {
computePassEncoder24.setBindGroup(2, bindGroup29);
} catch {}
try {
computePassEncoder84.setBindGroup(3, bindGroup29, new Uint32Array(3900), 216, 0);
} catch {}
try {
renderPassEncoder38.setBindGroup(2, bindGroup27);
} catch {}
try {
renderPassEncoder11.setVertexBuffer(5, buffer40, 168, 546);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
document.body.append(canvas1);
let bindGroupLayout20 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 50,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: 'cube', sampleType: 'float', multisampled: false },
    },
  ],
});
let commandEncoder115 = device0.createCommandEncoder({});
let textureView130 = texture116.createView({label: '\u5c04\u4843\u0c9c\u5e05\u0978\u3bdb\u08aa'});
try {
computePassEncoder61.setBindGroup(3, bindGroup73);
} catch {}
try {
computePassEncoder55.setBindGroup(2, bindGroup16, new Uint32Array(1648), 599, 0);
} catch {}
try {
renderPassEncoder8.setBindGroup(0, bindGroup2);
} catch {}
try {
renderPassEncoder13.setBindGroup(0, bindGroup25, new Uint32Array(1686), 158, 0);
} catch {}
try {
renderPassEncoder13.drawIndexedIndirect(buffer49, 116);
} catch {}
try {
renderPassEncoder31.setIndexBuffer(buffer7, 'uint32', 184, 179);
} catch {}
try {
commandEncoder115.copyTextureToTexture({
  texture: texture101,
  mipLevel: 0,
  origin: {x: 258, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture120,
  mipLevel: 0,
  origin: {x: 409, y: 0, z: 10},
  aspect: 'all',
},
{width: 112, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture44,
  mipLevel: 0,
  origin: {x: 32, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(184_060).fill(229), /* required buffer size: 184_060 */
{offset: 136, bytesPerRow: 524, rowsPerImage: 39}, {width: 118, height: 0, depthOrArrayLayers: 10});
} catch {}
let shaderModule8 = device0.createShaderModule({
  code: `
enable f16;

diagnostic(info, xyz);

requires readonly_and_readwrite_storage_textures;

fn unconst_bool(v: bool) -> bool { return v; }

@id(26740) override override5: bool;

fn fn0(a0: ptr<storage, array<u32>, read>) -> FragmentOutput6 {
  var out: FragmentOutput6;
  let ptr56: ptr<storage, u32, read> = &(*a0)[bitcast<vec2u>(unpack2x16float(u32(unconst_u32(90))))[0]];
  let vf208: vec4f = unpack4x8snorm(u32(unconst_u32(13)));
  let vf209: vec2f = unpack2x16float(u32(unconst_u32(378)));
  let vf210: vec2f = vf209;
  out.f0 -= vec4f(vf209[0]);
  var vf211: vec4f = atan2(vec4f(unconst_f32(0.06922), unconst_f32(0.1416), unconst_f32(0.07147), unconst_f32(0.1468)), vec4f(unconst_f32(0.08789), unconst_f32(0.06687), unconst_f32(0.01630), unconst_f32(0.1302)));
  out.f2 &= vec4u((*a0)[arrayLength(&(*a0)) - 1]);
  vf211 = sqrt(vec3f(unconst_f32(0.3501), unconst_f32(0.1202), unconst_f32(0.2606))).brgb;
  var vf212: vec4f = reflect(unpack4x8snorm(vec3u(cross(vec3h(unconst_f16(2455.7), unconst_f16(6443.0), unconst_f16(5506.4)), vec3h(unconst_f16(4691.6), unconst_f16(951.6), unconst_f16(1796.5))))[1]), vec4f(unconst_f32(0.01201), unconst_f32(0.06464), unconst_f32(0.2201), unconst_f32(0.03464)));
  out = FragmentOutput6(vf211, vec2i(vf211.rr), bitcast<vec4u>(vf211));
  let vf213: vec2u = extractBits(vec2u(arrayLength(&(*a0))), u32(vf209[0]), pack4x8snorm(vf212));
  vf211 = vec4f(radians(vec2h(unconst_f16(6394.2), unconst_f16(6338.3))).yxxx);
  let vf214: f32 = vf210[0];
  let vf215: f32 = vf210[0];
  let vf216: bool = override5;
  vf211 = vec4f(f32(override5));
  vf212 = unpack2x16float(vf213[0]).rrrg;
  let vf217: vec2f = vf209;
  var vf218: vec4f = reflect(vf211, vec4f(unconst_f32(-0.1349), unconst_f32(0.2921), unconst_f32(0.04924), unconst_f32(0.06235)));
  let vf219: vec4u = unpack4xU8(u32(unconst_u32(1)));
  let vf220: vec2h = radians(vec2h(unconst_f16(979.8), unconst_f16(18064.5)));
  return out;
  _ = override5;
}

fn unconst_f32(v: f32) -> f32 { return v; }

fn unconst_i32(v: i32) -> i32 { return v; }

fn unconst_f16(v: f16) -> f16 { return v; }

struct FragmentOutput6 {
  @location(2) f0: vec4f,
  @location(0) f1: vec2i,
  @location(1) @interpolate(flat) f2: vec4u,
}

struct T0 {
  @size(8) f0: array<u32>,
}

@group(0) @binding(48) var st8: texture_storage_2d_array<r32float, read_write>;

@group(0) @binding(182) var sam8: sampler;

fn unconst_u32(v: u32) -> u32 { return v; }

@fragment
fn fragment6() -> FragmentOutput6 {
  var out: FragmentOutput6;
  out.f0 = vec4f(bitcast<f32>(pack4x8unorm(vec4f(unconst_f32(-0.08412), unconst_f32(0.1020), unconst_f32(0.07846), unconst_f32(0.00622)))));
  let vf221: u32 = textureNumLayers(st8);
  let vf222: vec2h = exp2(vec2h(unconst_f16(19269.7), unconst_f16(5931.6)));
  var vf223: u32 = textureNumLayers(st8);
  vf223 = bitcast<u32>(vf222);
  var vf224: u32 = pack4x8unorm(vec4f(f32(override5)));
  var vf225: f16 = vf222[bitcast<u32>(vf222)];
  var vf226: bool = any(vec2<bool>(unconst_bool(true), unconst_bool(false)));
  let vf227: f16 = vf222[1];
  textureStore(st8, vec2i(unconst_i32(-18), unconst_i32(107)), i32(vf226), vec4f(vec4f(bitcast<f32>(textureNumLayers(st8)))));
  let vf228: vec2h = vf222;
  out.f2 += unpack4xU8(u32(override5));
  let vf229: f16 = vf222[vf223];
  out.f2 = vec4u(vf222.yxxy);
  vf226 = override5;
  var vf230: f16 = vf227;
  let vf231: vec2h = vf222;
  var vf232: bool = override5;
  return out;
  _ = override5;
}`,
  hints: {},
});
let bindGroupLayout21 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 285,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
    {
      binding: 125,
      visibility: GPUShaderStage.COMPUTE,
      storageTexture: { format: 'r32uint', access: 'read-write', viewDimension: '2d' },
    },
  ],
});
let bindGroup76 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer60, offset: 5632, size: 572}}],
});
let buffer72 = device0.createBuffer({
  size: 4793,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE,
});
let commandEncoder116 = device0.createCommandEncoder({label: '\u2dc7\u3c3a\ud665\ud751'});
let textureView131 = texture97.createView({dimension: '2d', baseMipLevel: 0, baseArrayLayer: 6});
let textureView132 = texture124.createView({mipLevelCount: 1});
let computePassEncoder99 = commandEncoder115.beginComputePass();
let renderPassEncoder44 = commandEncoder116.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: 256.2, g: 776.5, b: 701.6, a: 536.9, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 8010174,
});
try {
computePassEncoder98.setBindGroup(3, bindGroup2);
} catch {}
try {
computePassEncoder68.setBindGroup(1, bindGroup56, new Uint32Array(2430), 73, 0);
} catch {}
try {
renderPassEncoder39.setBindGroup(3, bindGroup10, [512, 768]);
} catch {}
try {
renderPassEncoder39.setBindGroup(0, bindGroup52, new Uint32Array(109), 40, 2);
} catch {}
try {
renderPassEncoder31.executeBundles([renderBundle6]);
} catch {}
try {
renderPassEncoder13.drawIndexedIndirect(buffer22, 8_608);
} catch {}
try {
renderPassEncoder13.drawIndirect(buffer72, 420);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer27, 'uint16', 5_996, 102);
} catch {}
try {
renderPassEncoder21.setVertexBuffer(2, buffer21, 1_924, 2_123);
} catch {}
try {
computePassEncoder93.setBindGroup(0, bindGroup27, new Uint32Array(4931), 883, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder73); computePassEncoder73.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder99.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder29.setBindGroup(1, bindGroup5, []);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 990, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData11,
  origin: { x: 4, y: 4 },
  flipY: false,
}, {
  texture: texture101,
  mipLevel: 0,
  origin: {x: 318, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let bindGroup77 = device0.createBindGroup({
  label: '\ua7ee\u{1fc2e}',
  layout: bindGroupLayout5,
  entries: [
    {binding: 487, resource: textureView45},
    {binding: 359, resource: {buffer: buffer52, offset: 0, size: 506}},
    {binding: 298, resource: {buffer: buffer39, offset: 256, size: 296}},
    {binding: 150, resource: textureView127},
    {binding: 313, resource: textureView6},
    {binding: 89, resource: sampler65},
    {binding: 173, resource: {buffer: buffer33, offset: 0, size: 96}},
    {binding: 140, resource: textureView43},
    {binding: 29, resource: textureView78},
  ],
});
try {
renderPassEncoder8.executeBundles([renderBundle7]);
} catch {}
try {
renderPassEncoder13.draw(0, 48, 6, 222_559_080);
} catch {}
try {
renderPassEncoder13.drawIndirect(buffer5, 252);
} catch {}
try {
device0.queue.submit([commandBuffer7]);
} catch {}
let textureView133 = texture122.createView({
  label: '\uf464\u0338\u0b75\u013d\u955e\u01f6\u0bb5\u0bc2',
  mipLevelCount: 1,
  baseArrayLayer: 19,
  arrayLayerCount: 37,
});
try {
renderPassEncoder36.setBindGroup(1, bindGroup56);
} catch {}
try {
renderPassEncoder34.setBindGroup(3, bindGroup46, new Uint32Array(671), 244, 0);
} catch {}
try {
renderPassEncoder8.drawIndexedIndirect(buffer47, 2_072);
} catch {}
try {
renderPassEncoder8.drawIndirect(buffer23, 1_860);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer29, 'uint32', 1_316, 55);
} catch {}
try {
renderPassEncoder31.setVertexBuffer(3, buffer32);
} catch {}
try {
renderPassEncoder27.pushDebugGroup('\uaacd');
} catch {}
let promise10 = device0.queue.onSubmittedWorkDone();
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 31}
*/
{
  source: imageData4,
  origin: { x: 2, y: 0 },
  flipY: false,
}, {
  texture: texture86,
  mipLevel: 0,
  origin: {x: 566, y: 0, z: 1},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 13, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder117 = device0.createCommandEncoder({});
let renderPassEncoder45 = commandEncoder117.beginRenderPass({
  colorAttachments: [{
  view: textureView48,
  clearValue: { r: -924.6, g: 743.1, b: 129.3, a: 844.7, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 135569598,
});
try {
renderPassEncoder8.draw(0, 195, 0, 125_828_304);
} catch {}
try {
renderPassEncoder8.drawIndexedIndirect(buffer6, 6_924);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer65, 'uint16', 13_974, 204);
} catch {}
try {
renderPassEncoder29.setVertexBuffer(1, buffer12, 28);
} catch {}
try {
device0.queue.writeBuffer(buffer2, 1780, new BigUint64Array(29846), 4965, 44);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 95, height: 1, depthOrArrayLayers: 27}
*/
{
  source: imageData5,
  origin: { x: 7, y: 0 },
  flipY: false,
}, {
  texture: texture89,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup78 = device0.createBindGroup({layout: bindGroupLayout17, entries: [{binding: 400, resource: textureView86}]});
let textureView134 = texture65.createView({
  label: '\u15c4\ubc0d\u60c2\uee03',
  format: 'rgba32float',
  mipLevelCount: 1,
  baseArrayLayer: 31,
  arrayLayerCount: 5,
});
let sampler72 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 65.37,
  lodMaxClamp: 79.24,
  maxAnisotropy: 19,
});
try {
computePassEncoder16.setBindGroup(1, bindGroup53, new Uint32Array(1489), 129, 0);
} catch {}
try {
computePassEncoder98.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder16.executeBundles([renderBundle2, renderBundle3]);
} catch {}
try {
renderPassEncoder13.draw(9, 218, 11, 601_629_834);
} catch {}
try {
renderPassEncoder13.drawIndexedIndirect(buffer23, 324);
} catch {}
try {
renderPassEncoder13.drawIndirect(buffer10, 1_460);
} catch {}
try {
renderPassEncoder42.setPipeline(pipeline2);
} catch {}
let bindGroup79 = device0.createBindGroup({
  label: '\ubd3c\ued89\ud096\u0524\u0b8b\u8fab\u0577\u0af1\u{1fbd7}\u986e',
  layout: bindGroupLayout20,
  entries: [{binding: 50, resource: textureView67}],
});
let pipelineLayout12 = device0.createPipelineLayout({label: '\u3c37\u2976\u6c9d\u{1fe88}\ua29a\u1c21\u9914\u4248\u345e\u73ee\ue1e7', bindGroupLayouts: []});
let texture127 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 1},
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView135 = texture47.createView({label: '\u50ea\u7d1a\u3adc\u8192\u{1f7ee}\ude76\u08a8', baseMipLevel: 0, arrayLayerCount: 43});
let sampler73 = device0.createSampler({addressModeU: 'clamp-to-edge', addressModeW: 'clamp-to-edge', lodMaxClamp: 77.32});
try {
computePassEncoder24.setBindGroup(1, bindGroup39, new Uint32Array(1776), 107, 0);
} catch {}
try {
renderPassEncoder32.setBindGroup(2, bindGroup37, new Uint32Array(59), 2, 0);
} catch {}
try {
renderPassEncoder29.setVertexBuffer(0, buffer28, 0, 13);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  alphaMode: 'premultiplied',
});
} catch {}
try {
  await promise10;
} catch {}
let bindGroup80 = device0.createBindGroup({
  label: '\u0b22\u353e\u0896\u048f\uac85\u965e\u361b\u867e\u70d0',
  layout: bindGroupLayout21,
  entries: [
    {binding: 285, resource: {buffer: buffer9, offset: 0, size: 16}},
    {binding: 125, resource: textureView75},
  ],
});
let commandEncoder118 = device0.createCommandEncoder({});
let computePassEncoder100 = commandEncoder118.beginComputePass({});
let sampler74 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 72.34,
});
try {
renderPassEncoder21.setBindGroup(0, bindGroup2, new Uint32Array(1991), 211, 0);
} catch {}
try {
renderPassEncoder8.draw(0, 671, 0, 1_271_552_151);
} catch {}
try {
renderPassEncoder22.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let imageBitmap1 = await createImageBitmap(imageData12);
let bindGroup81 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView42}]});
let commandEncoder119 = device0.createCommandEncoder();
let texture128 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 1},
  sampleCount: 1,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView136 = texture21.createView({dimension: 'cube', baseArrayLayer: 0});
try {
computePassEncoder100.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder38.setBindGroup(3, bindGroup12);
} catch {}
try {
renderPassEncoder13.draw(4, 449, 4, 209_159_726);
} catch {}
try {
renderPassEncoder13.drawIndirect(buffer62, 2_348);
} catch {}
try {
renderPassEncoder25.setIndexBuffer(buffer33, 'uint16', 520, 18);
} catch {}
let commandEncoder120 = device0.createCommandEncoder();
let textureView137 = texture63.createView({dimension: '2d-array', mipLevelCount: 1, arrayLayerCount: 1});
let sampler75 = device0.createSampler({addressModeU: 'clamp-to-edge', minFilter: 'linear', mipmapFilter: 'nearest', lodMinClamp: 28.14});
try {
computePassEncoder82.setBindGroup(0, bindGroup9, new Uint32Array(1243), 14, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder94); computePassEncoder94.dispatchWorkgroups(1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder42); computePassEncoder42.dispatchWorkgroupsIndirect(buffer9, 0); };
} catch {}
try {
renderPassEncoder35.setBindGroup(0, bindGroup78);
} catch {}
try {
renderPassEncoder14.beginOcclusionQuery(90);
} catch {}
try {
renderPassEncoder45.setScissorRect(11, 0, 18, 0);
} catch {}
try {
renderPassEncoder21.draw(228, 47, 910_283_513, 1_610_649_438);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer62, 3_384);
} catch {}
try {
renderPassEncoder34.setIndexBuffer(buffer60, 'uint32', 464, 3_753);
} catch {}
try {
renderPassEncoder25.setPipeline(pipeline1);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture28,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(181).fill(16), /* required buffer size: 181 */
{offset: 181, rowsPerImage: 15}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer73 = device0.createBuffer({
  size: 4407,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let textureView138 = texture33.createView({dimension: '2d-array', mipLevelCount: 1});
let renderPassEncoder46 = commandEncoder120.beginRenderPass({
  colorAttachments: [{
  view: textureView128,
  clearValue: { r: -970.5, g: 604.4, b: -737.4, a: 701.1, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet8,
});
try {
computePassEncoder91.setBindGroup(2, bindGroup63, [768, 0]);
} catch {}
try {
renderPassEncoder8.end();
} catch {}
let computePassEncoder101 = commandEncoder39.beginComputePass({});
try {
renderPassEncoder45.setBindGroup(2, bindGroup47);
} catch {}
try {
renderPassEncoder45.setIndexBuffer(buffer7, 'uint32', 0, 70);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(1, buffer60, 16_824, 3_220);
} catch {}
let arrayBuffer5 = buffer1.getMappedRange(1912, 0);
try {
commandEncoder119.copyBufferToBuffer(buffer64, 128, buffer37, 64, 300);
} catch {}
try {
commandEncoder119.copyTextureToBuffer({
  texture: texture86,
  mipLevel: 0,
  origin: {x: 981, y: 0, z: 7},
  aspect: 'all',
}, {
  /* bytesInLastRow: 3808 widthInBlocks: 238 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 3440 */
  offset: 3440,
  buffer: buffer8,
}, {width: 238, height: 0, depthOrArrayLayers: 0});
} catch {}
let textureView139 = texture50.createView({
  label: '\u0e89\u53de\u029e\u{1fa36}\u0a1c\u5acf\ucff9\u07d6\u{1fb7a}',
  dimension: 'cube-array',
  baseArrayLayer: 0,
  arrayLayerCount: 6,
});
let textureView140 = texture111.createView({label: '\u3d3a\u{1f8fa}\u{1f7dd}\u{1f6fe}\u3be4\u0ca4\u04f4'});
let renderPassEncoder47 = commandEncoder119.beginRenderPass({
  colorAttachments: [{
  view: textureView70,
  clearValue: { r: 219.9, g: 455.0, b: -918.9, a: 214.6, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet5,
});
try {
computePassEncoder14.setBindGroup(3, bindGroup55);
} catch {}
try {
renderPassEncoder21.drawIndexed(35, 84, 92, 484_302_572, 2_549_760_067);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer47, 6_444);
} catch {}
try {
renderPassEncoder13.drawIndirect(buffer72, 264);
} catch {}
try {
renderPassEncoder34.setPipeline(pipeline2);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
device0.queue.submit([]);
} catch {}
let commandEncoder121 = device0.createCommandEncoder({label: '\u88ee\ud97d'});
let computePassEncoder102 = commandEncoder121.beginComputePass();
let externalTexture17 = device0.importExternalTexture({source: videoFrame4, colorSpace: 'display-p3'});
try {
computePassEncoder50.setBindGroup(3, bindGroup21, [0, 14592]);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder82); computePassEncoder82.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder73.end();
} catch {}
try {
renderPassEncoder2.setViewport(1252.5293272308047, 0.9986859643524895, 2170.167015221265, 6.802215356359331e-05, 0.16383241790391145, 0.3818629756262413);
} catch {}
try {
renderPassEncoder21.drawIndexed(11, 155, 32, 160_092_370, 1_641_508_939);
} catch {}
try {
renderPassEncoder13.drawIndexedIndirect(buffer20, 1_516);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer51, 420);
} catch {}
let commandEncoder122 = device0.createCommandEncoder({});
let sampler76 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 58.01,
  lodMaxClamp: 81.27,
});
try {
computePassEncoder94.end();
} catch {}
try {
computePassEncoder101.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder26.setBindGroup(1, bindGroup5, new Uint32Array(1115), 135, 0);
} catch {}
try {
renderPassEncoder14.endOcclusionQuery();
} catch {}
try {
renderPassEncoder21.draw(75, 33, 4_214_830_349, 847_554_047);
} catch {}
try {
renderPassEncoder21.drawIndexed(48, 451, 92, 577_582_775, 293_871_849);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer12, 56);
} catch {}
try {
renderPassEncoder44.setIndexBuffer(buffer65, 'uint16', 22_744, 9_793);
} catch {}
try {
renderPassEncoder33.setPipeline(pipeline2);
} catch {}
let buffer74 = device0.createBuffer({
  size: 13286,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
let textureView141 = texture3.createView({dimension: '2d', format: 'r8sint', baseMipLevel: 1, mipLevelCount: 1, baseArrayLayer: 0});
let computePassEncoder103 = commandEncoder105.beginComputePass({label: '\ucda6\u{1f76e}\ue481\u723c\u0d32'});
try {
computePassEncoder14.setBindGroup(1, bindGroup24);
} catch {}
try {
computePassEncoder96.setBindGroup(2, bindGroup40, new Uint32Array(95), 1, 0);
} catch {}
try {
renderPassEncoder9.beginOcclusionQuery(53);
} catch {}
try {
renderPassEncoder9.endOcclusionQuery();
} catch {}
try {
renderPassEncoder13.draw(10, 519, 4, 994_596_966);
} catch {}
try {
renderPassEncoder39.setIndexBuffer(buffer11, 'uint16', 422, 17);
} catch {}
try {
renderPassEncoder44.setPipeline(pipeline2);
} catch {}
try {
commandEncoder82.copyBufferToTexture({
  /* bytesInLastRow: 124 widthInBlocks: 31 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1608 */
  offset: 1608,
  rowsPerImage: 176,
  buffer: buffer60,
}, {
  texture: texture4,
  mipLevel: 0,
  origin: {x: 107, y: 0, z: 0},
  aspect: 'all',
}, {width: 31, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
renderPassEncoder18.pushDebugGroup('\u028e');
} catch {}
await gc();
let buffer75 = device0.createBuffer({
  label: '\uc8ca\u0331\u07bd\ud080\u{1f78b}\u0e14',
  size: 671,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM,
});
try {
computePassEncoder83.setBindGroup(3, bindGroup23);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder51); computePassEncoder51.dispatchWorkgroupsIndirect(buffer47, 772); };
} catch {}
try {
renderPassEncoder17.setBindGroup(2, bindGroup80);
} catch {}
try {
renderPassEncoder45.setBindGroup(1, bindGroup45, new Uint32Array(1667), 424, 0);
} catch {}
try {
renderPassEncoder21.drawIndexed(322, 82, 2, 4_254_911, 1_741_609_155);
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
let arrayBuffer6 = buffer40.getMappedRange(1912, 52);
try {
  await promise9;
} catch {}
try {
externalTexture8.label = '\ub23f\u3cf2\ub420\u{1f8fb}\uff3b';
} catch {}
let commandEncoder123 = device0.createCommandEncoder({});
let texture129 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 13},
  sampleCount: 1,
  format: 'r8sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
let sampler77 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'linear',
  lodMinClamp: 48.75,
  lodMaxClamp: 80.16,
  maxAnisotropy: 1,
});
try {
computePassEncoder55.setBindGroup(2, bindGroup24);
} catch {}
try {
renderPassEncoder13.setBindGroup(3, bindGroup54, new Uint32Array(295), 83, 0);
} catch {}
try {
renderPassEncoder13.end();
} catch {}
try {
renderPassEncoder14.setVertexBuffer(3, buffer49, 136);
} catch {}
try {
commandEncoder123.insertDebugMarker('\ue024');
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'premultiplied',
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
await gc();
let sampler78 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 67.82,
  lodMaxClamp: 83.42,
});
try {
renderPassEncoder21.draw(201, 105, 816_952_867, 815_352_961);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer73, 300);
} catch {}
try {
commandEncoder57.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 144 */
  offset: 128,
  buffer: buffer20,
}, {
  texture: texture49,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 4},
  aspect: 'all',
}, {width: 1, height: 1, depthOrArrayLayers: 1});
} catch {}
try {
renderPassEncoder27.popDebugGroup();
} catch {}
let commandEncoder124 = device0.createCommandEncoder({});
let textureView142 = texture94.createView({dimension: '3d'});
let sampler79 = device0.createSampler({addressModeU: 'clamp-to-edge', mipmapFilter: 'nearest', lodMinClamp: 57.38, lodMaxClamp: 70.15});
let externalTexture18 = device0.importExternalTexture({source: videoFrame8});
try {
computePassEncoder97.setBindGroup(0, bindGroup73, new Uint32Array(2310), 78, 0);
} catch {}
try {
computePassEncoder14.setPipeline(pipeline0);
} catch {}
try {
computePassEncoder103.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder12.setBindGroup(2, bindGroup61);
} catch {}
try {
renderPassEncoder34.setBindGroup(3, bindGroup52, new Uint32Array(1045), 86, 2);
} catch {}
try {
renderPassEncoder38.setIndexBuffer(buffer66, 'uint32', 3_732, 1_546);
} catch {}
try {
commandEncoder57.copyBufferToTexture({
  /* bytesInLastRow: 4 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 368 */
  offset: 368,
  rowsPerImage: 10,
  buffer: buffer41,
}, {
  texture: texture51,
  mipLevel: 0,
  origin: {x: 24, y: 0, z: 0},
  aspect: 'all',
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
let commandBuffer8 = commandEncoder57.finish({});
let textureView143 = texture103.createView({
  label: '\ueff7\u3e29\u0ae3\u{1fb08}\ud9a7\u{1fec3}\u9fed\u7c08\u3149\u{1f8a8}\u8812',
  format: 'r32sint',
});
let texture130 = device0.createTexture({
  label: '\u14da\u{1fe0e}\u02c5\ud23f\u{1ff03}\u{1fa71}\uf27f',
  size: [1980, 1, 23],
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let textureView144 = texture125.createView({dimension: '2d-array', mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder104 = commandEncoder124.beginComputePass({});
try {
computePassEncoder49.setBindGroup(0, bindGroup32, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder51); computePassEncoder51.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder104.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder37.executeBundles([renderBundle15, renderBundle2]);
} catch {}
try {
renderPassEncoder21.drawIndexed(34, 50, 60, 547_266_576, 1_544_052_142);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer70, 964);
} catch {}
try {
renderPassEncoder14.setPipeline(pipeline2);
} catch {}
try {
commandEncoder123.copyBufferToBuffer(buffer8, 308, buffer44, 248, 8);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture102,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(301).fill(7), /* required buffer size: 301 */
{offset: 301}, {width: 151, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
bindGroup29.label = '\ucfc7\u2027\uaf8c\u{1fc62}\uf496\u3ace\u777e\u0ee3\u4f1e\u1750';
} catch {}
let commandEncoder125 = device0.createCommandEncoder({label: '\u5e43\ud6de\ufbad\ue332\ua3c7\ubd9b\u{1fd97}'});
try {
computePassEncoder46.setBindGroup(0, bindGroup63, [5888, 0]);
} catch {}
try {
computePassEncoder101.setBindGroup(2, bindGroup18, new Uint32Array(4992), 208, 0);
} catch {}
try {
renderPassEncoder21.drawIndexed(10, 407, 80, -1_433_906_460, 347_651_618);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer12, 56);
} catch {}
try {
commandEncoder122.copyBufferToBuffer(buffer1, 544, buffer72, 192, 172);
} catch {}
let renderPassEncoder48 = commandEncoder125.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: -792.9, g: 46.08, b: -243.4, a: -727.2, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet0,
});
try {
computePassEncoder75.setBindGroup(2, bindGroup50, new Uint32Array(1134), 439, 0);
} catch {}
try {
renderPassEncoder17.setBindGroup(3, bindGroup1, new Uint32Array(1889), 52, 0);
} catch {}
let buffer76 = device0.createBuffer({
  size: 6768,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let computePassEncoder105 = commandEncoder122.beginComputePass({});
try {
computePassEncoder65.setBindGroup(0, bindGroup34);
} catch {}
try {
computePassEncoder102.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder17.setBindGroup(2, bindGroup63, [1536, 0]);
} catch {}
try {
renderPassEncoder21.drawIndexed(26, 131, 3, 409_475_462, 150_896_196);
} catch {}
try {
commandEncoder82.copyBufferToTexture({
  /* bytesInLastRow: 1376 widthInBlocks: 86 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 64 */
  offset: 64,
  buffer: buffer76,
}, {
  texture: texture59,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, {width: 86, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder82.copyTextureToTexture({
  texture: texture7,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture84,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.submit([commandBuffer8]);
} catch {}
let promise11 = device0.queue.onSubmittedWorkDone();
let buffer77 = device0.createBuffer({size: 8720, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let querySet12 = device0.createQuerySet({type: 'occlusion', count: 374});
let renderPassEncoder49 = commandEncoder123.beginRenderPass({
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: 139.5, g: 969.8, b: 424.9, a: -425.3, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 280624853,
});
try {
computePassEncoder98.setBindGroup(0, bindGroup25);
} catch {}
try {
computePassEncoder96.setBindGroup(1, bindGroup77, new Uint32Array(331), 9, 2);
} catch {}
try {
computePassEncoder98.end();
} catch {}
try {
renderPassEncoder43.setBindGroup(3, bindGroup14);
} catch {}
try {
renderPassEncoder45.setBindGroup(1, bindGroup16, new Uint32Array(5418), 1_232, 0);
} catch {}
try {
renderPassEncoder29.executeBundles([renderBundle11]);
} catch {}
try {
renderPassEncoder21.drawIndexed(43, 91, 98, 117_859_746, 817_924_386);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer7, 296);
} catch {}
try {
renderPassEncoder32.setVertexBuffer(3, buffer10, 0);
} catch {}
try {
  await promise11;
} catch {}
let commandEncoder126 = device0.createCommandEncoder({});
let sampler80 = device0.createSampler({
  label: '\u051b\ud6e5\u0347',
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 25.26,
  lodMaxClamp: 58.94,
  maxAnisotropy: 17,
});
try {
computePassEncoder79.setBindGroup(1, bindGroup52, [7936, 0]);
} catch {}
try {
renderPassEncoder21.draw(80, 245, 683_005_484, 708_328_260);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer20, 1_892);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(5, buffer12, 40);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
buffer67.unmap();
} catch {}
let bindGroup82 = device0.createBindGroup({label: '\u2a32\u0a2c', layout: bindGroupLayout20, entries: [{binding: 50, resource: textureView15}]});
let commandEncoder127 = device0.createCommandEncoder({label: '\u2ae5\u{1fb1c}'});
let texture131 = device0.createTexture({
  size: [8, 8, 15],
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
{ clearResourceUsages(device0, computePassEncoder58); computePassEncoder58.dispatchWorkgroupsIndirect(buffer20, 780); };
} catch {}
try {
renderPassEncoder41.setBindGroup(0, bindGroup44);
} catch {}
try {
renderPassEncoder14.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer54, 168);
} catch {}
try {
buffer76.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture3,
  mipLevel: 4,
  origin: {x: 0, y: 0, z: 2},
  aspect: 'all',
}, new Uint8Array(56).fill(149), /* required buffer size: 56 */
{offset: 56}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup83 = device0.createBindGroup({
  label: '\u{1fc19}\u7e79\u9579\ubdab',
  layout: bindGroupLayout7,
  entries: [{binding: 329, resource: textureView63}, {binding: 267, resource: {buffer: buffer24, offset: 256}}],
});
let textureView145 = texture32.createView({format: 'rgba8uint', baseArrayLayer: 20, arrayLayerCount: 2});
let renderPassEncoder50 = commandEncoder114.beginRenderPass({
  colorAttachments: [{view: textureView98, loadOp: 'load', storeOp: 'discard'}],
  occlusionQuerySet: querySet10,
});
try {
computePassEncoder57.setBindGroup(1, bindGroup79);
} catch {}
try {
computePassEncoder39.setBindGroup(2, bindGroup30, new Uint32Array(73), 8, 0);
} catch {}
try {
renderPassEncoder21.drawIndexed(107, 436, 2, 7_086_980, 716_707_733);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer54, 8);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer76, 2_072);
} catch {}
try {
renderPassEncoder18.popDebugGroup();
} catch {}
let texture132 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 68},
  sampleCount: 1,
  dimension: '3d',
  format: 'r32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder86.setBindGroup(0, bindGroup19, new Uint32Array(727), 32, 0);
} catch {}
try {
renderPassEncoder23.executeBundles([renderBundle10, renderBundle17]);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer32, 24);
} catch {}
try {
renderPassEncoder21.setIndexBuffer(buffer15, 'uint32', 492, 24);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture23,
  mipLevel: 0,
  origin: {x: 16, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(74).fill(26), /* required buffer size: 74 */
{offset: 74, bytesPerRow: 38}, {width: 10, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData14 = new ImageData(8, 44);
let bindGroupLayout22 = device0.createBindGroupLayout({
  label: '\ubc1e\u{1f7a1}\u4ea3\u0daf\u3a0b\u2f90\ufdb6\u8717\u{1fe3f}\uab0e',
  entries: [
    {
      binding: 138,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
  ],
});
let bindGroup84 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView0}]});
let computePassEncoder106 = commandEncoder82.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder58); computePassEncoder58.dispatchWorkgroupsIndirect(buffer45, 744); };
} catch {}
try {
computePassEncoder105.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder35.executeBundles([renderBundle9]);
} catch {}
try {
renderPassEncoder21.draw(33, 51, 29_686_652, 304_518_938);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 178, 1, 190_435_871, 341_255_099);
} catch {}
try {
commandEncoder127.copyBufferToTexture({
  /* bytesInLastRow: 8 widthInBlocks: 8 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 2972 */
  offset: 2972,
  bytesPerRow: 50432,
  buffer: buffer22,
}, {
  texture: texture51,
  mipLevel: 1,
  origin: {x: 10, y: 0, z: 0},
  aspect: 'all',
}, {width: 8, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder71.pushDebugGroup('\uf0a7');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 11, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageBitmap0,
  origin: { x: 0, y: 10 },
  flipY: true,
}, {
  texture: texture69,
  mipLevel: 2,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer6.detached) { new Uint8Array(arrayBuffer6).fill(0x55); };
} catch {}
let texture133 = device0.createTexture({size: [8, 8, 15], mipLevelCount: 1, format: 'r8sint', usage: GPUTextureUsage.COPY_SRC});
let computePassEncoder107 = commandEncoder126.beginComputePass();
let renderPassEncoder51 = commandEncoder127.beginRenderPass({
  colorAttachments: [{
  view: textureView84,
  clearValue: { r: -584.9, g: -688.6, b: -446.6, a: 418.6, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet7,
});
try {
computePassEncoder107.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder49.setBindGroup(2, bindGroup47, new Uint32Array(1339), 208, 0);
} catch {}
try {
renderPassEncoder44.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder17.setVertexBuffer(3, buffer52, 0, 907);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let textureView146 = texture107.createView({});
let texture134 = device0.createTexture({
  label: '\u{1feaa}\u81a7',
  size: {width: 495},
  dimension: '1d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST,
});
try {
computePassEncoder99.setBindGroup(0, bindGroup39);
} catch {}
try {
computePassEncoder106.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 385, 0, 137_983_757, 196_897_312);
} catch {}
let bindGroup85 = device0.createBindGroup({
  layout: bindGroupLayout18,
  entries: [
    {binding: 72, resource: textureView72},
    {binding: 54, resource: textureView122},
    {binding: 67, resource: sampler23},
    {binding: 490, resource: {buffer: buffer4, offset: 1024, size: 1372}},
    {binding: 575, resource: sampler68},
  ],
});
let texture135 = device0.createTexture({
  size: {width: 190, height: 2, depthOrArrayLayers: 1},
  format: 'depth16unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture136 = device0.createTexture({
  size: [3960],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder58.setBindGroup(1, bindGroup70);
} catch {}
try {
renderPassEncoder43.beginOcclusionQuery(15);
} catch {}
try {
renderPassEncoder43.endOcclusionQuery();
} catch {}
try {
renderPassEncoder14.executeBundles([renderBundle8, renderBundle7, renderBundle13]);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer23, 8_552);
} catch {}
try {
renderPassEncoder29.setPipeline(pipeline2);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 8, depthOrArrayLayers: 15}
*/
{
  source: imageData1,
  origin: { x: 10, y: 3 },
  flipY: false,
}, {
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
document.body.prepend(canvas2);
let img3 = await imageWithData(62, 24, '#10101010', '#20202020');
let pipelineLayout13 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout5]});
let textureView147 = texture103.createView({});
let sampler81 = device0.createSampler({
  label: '\u5c8c\u0b9d\u0047\u6a7a\u79c3\u1f11\ued2c\u{1ff76}',
  addressModeU: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 84.11,
  lodMaxClamp: 90.33,
  maxAnisotropy: 2,
});
try {
{ clearResourceUsages(device0, computePassEncoder14); computePassEncoder14.dispatchWorkgroupsIndirect(buffer9, 0); };
} catch {}
try {
renderPassEncoder27.setBindGroup(2, bindGroup73);
} catch {}
try {
renderPassEncoder21.draw(211, 49, 66_177_125, 305_963_845);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer23, 4_484);
} catch {}
try {
renderPassEncoder46.setPipeline(pipeline2);
} catch {}
try {
computePassEncoder37.setBindGroup(3, bindGroup41);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder51); computePassEncoder51.dispatchWorkgroupsIndirect(buffer54, 176); };
} catch {}
try {
renderPassEncoder35.executeBundles([renderBundle17]);
} catch {}
try {
renderPassEncoder21.draw(394, 168, 220_174_175, 365_205_988);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer52, 36);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture1,
  mipLevel: 0,
  origin: {x: 694, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(21).fill(212), /* required buffer size: 21 */
{offset: 21}, {width: 210, height: 0, depthOrArrayLayers: 1});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroupLayout23 = device0.createBindGroupLayout({entries: [{binding: 170, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' }}]});
let commandEncoder128 = device0.createCommandEncoder({});
try {
{ clearResourceUsages(device0, computePassEncoder58); computePassEncoder58.dispatchWorkgroupsIndirect(buffer71, 3_408); };
} catch {}
try {
renderPassEncoder37.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer41, 68);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer56, 'uint32', 728, 437);
} catch {}
try {
renderPassEncoder32.setPipeline(pipeline1);
} catch {}
let arrayBuffer7 = buffer1.getMappedRange(1920, 0);
try {
commandEncoder128.copyBufferToTexture({
  /* bytesInLastRow: 15840 widthInBlocks: 1980 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 40 */
  offset: 40,
  buffer: buffer19,
}, {
  texture: texture88,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 4},
  aspect: 'all',
}, {width: 1980, height: 0, depthOrArrayLayers: 1});
} catch {}
let promise12 = device0.queue.onSubmittedWorkDone();
let texture137 = device0.createTexture({
  size: {width: 190},
  mipLevelCount: 1,
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC,
});
let sampler82 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 46.75,
  lodMaxClamp: 93.66,
  maxAnisotropy: 12,
});
try {
computePassEncoder95.setBindGroup(1, bindGroup42, new Uint32Array(1168), 77, 0);
} catch {}
try {
renderPassEncoder31.setBindGroup(0, bindGroup21, [0, 1536]);
} catch {}
try {
renderPassEncoder18.beginOcclusionQuery(424);
} catch {}
try {
commandEncoder128.clearBuffer(buffer52, 108, 1884);
} catch {}
try {
computePassEncoder71.popDebugGroup();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageBitmap0,
  origin: { x: 0, y: 12 },
  flipY: true,
}, {
  texture: texture117,
  mipLevel: 0,
  origin: {x: 17, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture138 = device0.createTexture({
  size: {width: 47},
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let externalTexture19 = device0.importExternalTexture({source: videoFrame7});
try {
renderPassEncoder21.draw(160, 89, 1_053_924_233, 828_929_370);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer75, 104);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer72, 'uint32', 1_468, 38);
} catch {}
try {
renderPassEncoder9.setPipeline(pipeline2);
} catch {}
try {
commandEncoder128.copyBufferToBuffer(buffer7, 48, buffer59, 11104, 272);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  alphaMode: 'opaque',
});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroup86 = device0.createBindGroup({
  label: '\u0fe1\u04a3\u0172\u{1f7dd}\u9817\ua999',
  layout: bindGroupLayout7,
  entries: [{binding: 267, resource: {buffer: buffer18, offset: 768}}, {binding: 329, resource: textureView18}],
});
let commandEncoder129 = device0.createCommandEncoder({});
let renderPassEncoder52 = commandEncoder129.beginRenderPass({
  colorAttachments: [{
  view: textureView107,
  clearValue: { r: -268.8, g: -853.3, b: -344.2, a: -634.1, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 102512471,
});
try {
renderPassEncoder27.setBindGroup(2, bindGroup26);
} catch {}
try {
renderPassEncoder18.endOcclusionQuery();
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 121, 0, 1_578_985_413, 292_454_363);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer71, 136);
} catch {}
try {
renderPassEncoder16.setPipeline(pipeline2);
} catch {}
try {
buffer47.unmap();
} catch {}
try {
commandEncoder128.copyBufferToBuffer(buffer52, 152, buffer57, 1616, 992);
} catch {}
try {
commandEncoder128.copyTextureToTexture({
  texture: texture121,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture134,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 0},
  aspect: 'all',
},
{width: 32, height: 0, depthOrArrayLayers: 0});
} catch {}
let computePassEncoder108 = commandEncoder128.beginComputePass({});
try {
computePassEncoder108.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder20.setBindGroup(1, bindGroup48, new Uint32Array(406), 204, 0);
} catch {}
try {
renderPassEncoder15.beginOcclusionQuery(197);
} catch {}
try {
renderPassEncoder21.draw(130, 211, 264_586_919, 28_332_593);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer62, 304);
} catch {}
try {
renderPassEncoder49.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder38.insertDebugMarker('\u0439');
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
let shaderModule9 = device0.createShaderModule({
  code: `
enable f16;

requires readonly_and_readwrite_storage_textures;

@group(0) @binding(182) var sam9: sampler;

struct T0 {
  @size(16) f0: array<u32>,
}

fn unconst_f16(v: f16) -> f16 { return v; }

fn unconst_f32(v: f32) -> f32 { return v; }

@group(0) @binding(48) var st9: texture_storage_2d_array<r32float, read_write>;

var<workgroup> vw22: FragmentOutput7;

fn unconst_bool(v: bool) -> bool { return v; }

fn unconst_u32(v: u32) -> u32 { return v; }

struct FragmentOutput7 {
  @location(0) @interpolate(flat) f0: i32,
  @builtin(sample_mask) f1: u32,
  @location(2) f2: vec4i,
}

var<workgroup> vw23: atomic<u32>;

fn unconst_i32(v: i32) -> i32 { return v; }

@fragment
fn fragment7() -> FragmentOutput7 {
  var out: FragmentOutput7;
  out = FragmentOutput7(vec2i(tanh(vec2f(unconst_f32(0.3103), unconst_f32(0.03055)))).r, pack2x16unorm(tanh(vec2f(unconst_f32(0.3103), unconst_f32(0.03055)))), bitcast<vec4i>(tanh(vec2f(unconst_f32(0.3103), unconst_f32(0.03055))).yyxx));
  var vf233: f32 = ldexp(f32(unconst_f32(0.1025)), i32(unconst_i32(132)));
  var vf234: vec2u = textureDimensions(st9);
  out.f0 &= bitcast<i32>(pack4xI8(vec4i(unconst_i32(78), unconst_i32(-152), unconst_i32(247), unconst_i32(2))));
  var vf235: vec3h = step(smoothstep(vec3h(unconst_f16(22246.5), unconst_f16(10649.0), unconst_f16(20376.8)), vec3h(unconst_f16(3721.2), unconst_f16(29552.9), unconst_f16(20665.0)), vec3h(unconst_f16(21247.2), unconst_f16(1414.6), unconst_f16(26289.6))), vec3h(unconst_f16(20722.7), unconst_f16(23203.6), unconst_f16(1661.6)));
  var vf236: vec2i = clamp(vec2i(unconst_i32(261), unconst_i32(13)), vec2i(unconst_i32(292), unconst_i32(-161)), vec2i(i32(vf235[2])));
  let vf237: vec2h = normalize(inverseSqrt(vec3h(unconst_f16(2307.9), unconst_f16(9763.3), unconst_f16(11972.0))).rg);
  return out;
}

@compute @workgroup_size(1, 1, 1)
fn compute9(@builtin(global_invocation_id) a0: vec3u, @builtin(local_invocation_id) a1: vec3u) {
  let vf238: u32 = a0[u32(unconst_u32(115))];
  var vf239: i32 = vw22.f2[1];
  let ptr57: ptr<workgroup, vec4i> = &(*&vw22).f2;
  let vf240: vec2h = asinh(vec2h(a0.zz));
  storageBarrier();
  let ptr58: ptr<workgroup, vec4i> = &(*&vw22).f2;
  atomicXor(&vw23, u32(unconst_u32(5)));
  vw22 = FragmentOutput7(i32(vf240[0]), u32(vf240[0]), vec4i(i32(vf240[0])));
  var vf241: vec3u = a0;
  let ptr59: ptr<workgroup, vec4i> = &(*ptr57);
  atomicOr(&vw23, pack4xU8(vec4u((*ptr58))));
  let vf242: f16 = vf240[0];
  let ptr60: ptr<workgroup, vec4i> = &(*ptr58);
}

@compute @workgroup_size(2, 1, 1)
fn compute10() {
  vw22.f0 *= bitcast<i32>(quantizeToF16(vec2f(bitcast<f32>(vw22.f0))).r);
  let vf243: vec3h = faceForward(vec3h(unconst_f16(724.8), unconst_f16(25512.5), unconst_f16(-60000.0)), vec3h(unconst_f16(-15610.8), unconst_f16(4794.9), unconst_f16(27343.7)), vec3h(f16(atomicLoad(&(*&vw23)))));
  atomicExchange(&vw23, bitcast<u32>(vw22.f0));
  let ptr61: ptr<workgroup, i32> = &vw22.f0;
  let ptr62: ptr<workgroup, u32> = &(*&vw22).f1;
  let ptr63: ptr<workgroup, vec4i> = &(*&vw22).f2;
  var vf244: i32 = (*ptr63)[u32(unconst_u32(504))];
  atomicOr(&vw23, u32((*ptr63)[u32(unconst_u32(50))]));
  vf244 = bitcast<i32>(atomicLoad(&(*&vw23)));
  var vf245: vec2h = select(vec2h(unconst_f16(3746.6), unconst_f16(3726.0)), vec2h(unconst_f16(22175.1), unconst_f16(-28562.8)), vec2<bool>(unconst_bool(true), unconst_bool(false)));
  vf245 = bitcast<vec2h>((*&vw22).f1);
  atomicSub(&vw23, u32(unconst_u32(16)));
  vw22 = FragmentOutput7(vec2i(quantizeToF16(vec2f(f32((*&vw22).f0)))).x, bitcast<vec2u>(quantizeToF16(vec2f(f32((*&vw22).f0)))).g, bitcast<vec4i>(quantizeToF16(vec2f(f32((*&vw22).f0))).xyxx));
  var vf246: u32 = atomicExchange(&vw23, u32(quantizeToF16(vec2f(unconst_f32(0.00289), unconst_f32(0.04428)))[1]));
  vw22.f0 = i32(atomicExchange(&(*&vw23), atomicLoad(&vw23)));
  var vf247: f16 = vf243[bitcast<u32>((*ptr61))];
  let vf248: vec2f = quantizeToF16(vec2f(f32(vf243[u32(unconst_u32(508))])));
  vf244 |= i32(faceForward(vec3h(vf243[vw22.f1]), vec3h(f16((*&vw22).f0)), vec3h(unconst_f16(9640.6), unconst_f16(11869.8), unconst_f16(14105.8))).z);
  var vf249: bool = all(bool(atomicLoad(&(*&vw23))));
  vf249 = bool((*&vw22).f1);
  var vf250: f32 = vf248[0];
}`,
  sourceMap: {},
});
let bindGroup87 = device0.createBindGroup({
  layout: bindGroupLayout11,
  entries: [{binding: 76, resource: textureView81}, {binding: 295, resource: textureView43}],
});
let commandEncoder130 = device0.createCommandEncoder({label: '\u7dcd\u7160\u{1f830}\u0975\u0f60\u{1fd1f}\u0c46\uee13\u6b0a'});
let texture139 = device0.createTexture({
  size: {width: 3960, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let texture140 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST,
  viewFormats: [],
});
let sampler83 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 88.59,
  lodMaxClamp: 97.52,
});
try {
computePassEncoder58.end();
} catch {}
try {
renderPassEncoder21.draw(148, 76, 495_032_813, 672_489_079);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(2, buffer60);
} catch {}
try {
computePassEncoder63.insertDebugMarker('\u24bf');
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroup88 = device0.createBindGroup({layout: bindGroupLayout15, entries: [{binding: 45, resource: textureView116}]});
let buffer78 = device0.createBuffer({
  size: 7948,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
  mappedAtCreation: true,
});
let commandEncoder131 = device0.createCommandEncoder({});
let textureView148 = texture45.createView({label: '\u691e\u{1f6ce}\u64bd'});
let computePassEncoder109 = commandEncoder131.beginComputePass();
let sampler84 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 19.67,
  lodMaxClamp: 29.85,
  compare: 'always',
  maxAnisotropy: 11,
});
try {
computePassEncoder85.setBindGroup(0, bindGroup57, new Uint32Array(455), 25, 0);
} catch {}
try {
renderPassEncoder48.setBindGroup(2, bindGroup61);
} catch {}
try {
renderPassEncoder17.setScissorRect(42, 0, 1, 0);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 75, 0, -2_138_986_869, 790_202_999);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer46, 2_084);
} catch {}
try {
renderPassEncoder32.setIndexBuffer(buffer7, 'uint32', 4, 572);
} catch {}
try {
renderPassEncoder47.setVertexBuffer(2, buffer40, 0, 70);
} catch {}
try {
commandEncoder130.copyBufferToTexture({
  /* bytesInLastRow: 34 widthInBlocks: 34 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 51 */
  offset: 51,
  buffer: buffer33,
}, {
  texture: texture138,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 34, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer5.detached) { new Uint8Array(arrayBuffer5).fill(0x55); };
} catch {}
document.body.prepend(img2);
let bindGroup89 = device0.createBindGroup({layout: bindGroupLayout8, entries: [{binding: 33, resource: externalTexture7}]});
let textureView149 = texture99.createView({aspect: 'stencil-only'});
let renderPassEncoder53 = commandEncoder130.beginRenderPass({
  label: '\uffa5\ue32f\u{1fe8c}\ua31f\u{1feee}\u317a\u1ce4\u60cb',
  colorAttachments: [{
  view: textureView64,
  clearValue: { r: -224.5, g: -659.8, b: 245.5, a: -509.7, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet8,
});
let sampler85 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 61.31,
  lodMaxClamp: 99.29,
  maxAnisotropy: 4,
});
try {
renderPassEncoder25.setBindGroup(1, bindGroup82);
} catch {}
try {
renderPassEncoder15.endOcclusionQuery();
} catch {}
try {
renderPassEncoder17.executeBundles([renderBundle4, renderBundle14]);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer7, 16);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer29, 660);
} catch {}
try {
renderPassEncoder26.setVertexBuffer(4, buffer50, 0);
} catch {}
try {
renderPassEncoder38.insertDebugMarker('\u{1f651}');
} catch {}
await gc();
let commandEncoder132 = device0.createCommandEncoder({});
let computePassEncoder110 = commandEncoder132.beginComputePass({label: '\u{1f77e}\u8aba\u395b\u06ae\uac09\u944a\u47a1\ucbde'});
try {
computePassEncoder110.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder9.setBindGroup(2, bindGroup53, new Uint32Array(2225), 6, 0);
} catch {}
try {
renderPassEncoder34.executeBundles([renderBundle8, renderBundle13]);
} catch {}
try {
renderPassEncoder21.draw(218, 62, 424_616_971, 475_759_960);
} catch {}
try {
renderPassEncoder21.drawIndexed(2, 24, 1, 645_192_513, 467_152_341);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer12, 28);
} catch {}
try {
renderPassEncoder48.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder38.setVertexBuffer(4, buffer48, 0);
} catch {}
try {
commandEncoder68.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 2152 */
  offset: 2152,
  rowsPerImage: 189,
  buffer: buffer57,
}, {
  texture: texture106,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageBitmap2 = await createImageBitmap(videoFrame5);
let bindGroup90 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer4, offset: 768, size: 392}},
    {binding: 329, resource: textureView112},
  ],
});
let commandEncoder133 = device0.createCommandEncoder({});
let textureView150 = texture54.createView({mipLevelCount: 1, baseArrayLayer: 0});
try {
computePassEncoder82.end();
} catch {}
try {
renderPassEncoder21.draw(179, 250, 448_630_049, 2_197_799_286);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 40, 0, 302_070_028, 392_373_943);
} catch {}
try {
renderPassEncoder52.setIndexBuffer(buffer33, 'uint32', 112, 574);
} catch {}
try {
renderPassEncoder51.setPipeline(pipeline1);
} catch {}
try {
device0.queue.submit([]);
} catch {}
let commandEncoder134 = device0.createCommandEncoder({});
let commandBuffer9 = commandEncoder93.finish();
let textureView151 = texture34.createView({dimension: '1d'});
let computePassEncoder111 = commandEncoder68.beginComputePass({});
try {
renderPassEncoder21.drawIndexed(0, 211, 0, 226_156_522, 188_437_711);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer8, 4_528);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer46, 3_756);
} catch {}
try {
renderPassEncoder49.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder51.setVertexBuffer(3, buffer14, 9_672, 1_529);
} catch {}
try {
buffer71.unmap();
} catch {}
try {
computePassEncoder11.setBindGroup(3, bindGroup71, []);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder86); computePassEncoder86.dispatchWorkgroupsIndirect(buffer47, 1_600); };
} catch {}
try {
renderPassEncoder41.executeBundles([renderBundle13, renderBundle5, renderBundle2, renderBundle6, renderBundle0]);
} catch {}
try {
renderPassEncoder29.setIndexBuffer(buffer7, 'uint16', 398, 248);
} catch {}
try {
renderPassEncoder35.setPipeline(pipeline1);
} catch {}
document.body.prepend(canvas0);
let texture141 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView152 = texture114.createView({arrayLayerCount: 1});
let computePassEncoder112 = commandEncoder134.beginComputePass({});
try {
computePassEncoder99.setBindGroup(0, bindGroup9, new Uint32Array(205), 27, 0);
} catch {}
try {
computePassEncoder112.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder37.setStencilReference(75);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 79, 1, 755_730_352, 820_174_007);
} catch {}
try {
renderPassEncoder2.setIndexBuffer(buffer35, 'uint32', 840, 4_696);
} catch {}
try {
commandEncoder133.copyTextureToTexture({
  texture: texture54,
  mipLevel: 0,
  origin: {x: 85, y: 0, z: 7},
  aspect: 'all',
},
{
  texture: texture69,
  mipLevel: 0,
  origin: {x: 8, y: 0, z: 0},
  aspect: 'all',
},
{width: 10, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder133.resolveQuerySet(querySet2, 7, 0, buffer43, 5376);
} catch {}
let bindGroup91 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView9}]});
let textureView153 = texture122.createView({aspect: 'all', mipLevelCount: 1, baseArrayLayer: 1, arrayLayerCount: 13});
let sampler86 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  lodMinClamp: 57.98,
  lodMaxClamp: 81.95,
});
try {
renderPassEncoder21.drawIndexed(0, 38, 0, 631_425_168, 66_052_738);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer75, 24);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer32, 140);
} catch {}
try {
renderPassEncoder37.setIndexBuffer(buffer14, 'uint32', 5_172, 1_459);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.STORAGE_BINDING,
  colorSpace: 'display-p3',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture54,
  mipLevel: 0,
  origin: {x: 19, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(188_636).fill(129), /* required buffer size: 188_636 */
{offset: 36, bytesPerRow: 2300, rowsPerImage: 41}, {width: 141, height: 0, depthOrArrayLayers: 3});
} catch {}
let texture142 = device0.createTexture({
  label: '\u36f1\u379c\u{1fae7}\u8873\u5f1a\u{1fc94}\u{1f649}\u0876\u{1f701}\u327e',
  size: {width: 990},
  dimension: '1d',
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let computePassEncoder113 = commandEncoder133.beginComputePass({});
let sampler87 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 68.08,
  lodMaxClamp: 90.39,
});
try {
computePassEncoder109.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder22.setBindGroup(0, bindGroup9, []);
} catch {}
try {
renderPassEncoder39.setBindGroup(2, bindGroup52, new Uint32Array(746), 65, 2);
} catch {}
try {
renderPassEncoder46.beginOcclusionQuery(238);
} catch {}
try {
renderPassEncoder22.draw(427, 118, 107_884_382, 365_513_478);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer41, 'uint16', 366, 126);
} catch {}
try {
renderPassEncoder50.setPipeline(pipeline1);
} catch {}
try {
device0.queue.submit([commandBuffer9]);
} catch {}
await gc();
let commandEncoder135 = device0.createCommandEncoder({});
let texture143 = device0.createTexture({
  size: [495, 1, 1],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView154 = texture85.createView({label: '\u{1f8a8}\u0778\u{1fd4b}\u5f44\u020b\u{1fff5}\ub19f\ucbe7\u{1f850}\u{1f91f}'});
let renderPassEncoder54 = commandEncoder135.beginRenderPass({
  colorAttachments: [{
  view: textureView16,
  clearValue: { r: 662.9, g: -13.05, b: -212.7, a: -372.6, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder51.end();
} catch {}
try {
renderPassEncoder46.endOcclusionQuery();
} catch {}
try {
renderPassEncoder12.setStencilReference(723);
} catch {}
await gc();
let bindGroup92 = device0.createBindGroup({
  layout: bindGroupLayout11,
  entries: [{binding: 295, resource: textureView133}, {binding: 76, resource: textureView75}],
});
let buffer79 = device0.createBuffer({size: 737, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: false});
let computePassEncoder114 = commandEncoder31.beginComputePass();
let sampler88 = device0.createSampler({
  label: '\uad84\uf563\u82ea\u6c1c\u0247\u{1f663}\ue0e8\u{1fc3e}\u0296\u0ed4\u0c60',
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 58.62,
});
try {
renderPassEncoder21.drawIndexedIndirect(buffer54, 304);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture132,
  mipLevel: 0,
  origin: {x: 216, y: 0, z: 5},
  aspect: 'all',
}, new Uint8Array(67).fill(242), /* required buffer size: 67 */
{offset: 67, bytesPerRow: 117, rowsPerImage: 0}, {width: 7, height: 0, depthOrArrayLayers: 4});
} catch {}
let textureView155 = texture117.createView({format: 'rgba8unorm', baseArrayLayer: 0});
let texture144 = device0.createTexture({
  size: [47],
  dimension: '1d',
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView156 = texture42.createView({label: '\u44cb\u0452\ub6ae'});
try {
renderPassEncoder29.setBindGroup(2, bindGroup39);
} catch {}
try {
renderPassEncoder26.executeBundles([renderBundle9, renderBundle10]);
} catch {}
try {
renderPassEncoder22.draw(88, 136, 721_559_981, 1_463_535_950);
} catch {}
try {
renderPassEncoder21.drawIndexed(0, 55, 0, 80_972_885, 124_480_808);
} catch {}
try {
renderPassEncoder22.drawIndexedIndirect(buffer40, 164);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer40, 'uint32', 136, 2_570);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas0,
  origin: { x: 7, y: 3 },
  flipY: false,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 29, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 9, height: 0, depthOrArrayLayers: 0});
} catch {}
let querySet13 = device0.createQuerySet({type: 'occlusion', count: 397});
try {
computePassEncoder100.setBindGroup(2, bindGroup79);
} catch {}
try {
computePassEncoder52.setBindGroup(0, bindGroup19, new Uint32Array(942), 293, 0);
} catch {}
try {
computePassEncoder2.end();
} catch {}
try {
renderPassEncoder21.drawIndexed(2, 679, 2, -1_710_270_977, 739_371_967);
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer76, 428);
} catch {}
try {
commandEncoder1.copyTextureToBuffer({
  texture: texture7,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 59 widthInBlocks: 59 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 360 */
  offset: 360,
  bytesPerRow: 11264,
  buffer: buffer8,
}, {width: 59, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup93 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView13}, {binding: 50, resource: textureView15}],
});
let buffer80 = device0.createBuffer({size: 1203, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let textureView157 = texture102.createView({label: '\u{1f62a}\ue7fb\u{1f6b7}\u5f97\u{1fa20}\u{1ff9f}\u{1fd8e}\u{1f887}', dimension: '2d-array'});
try {
computePassEncoder69.setBindGroup(3, bindGroup56, new Uint32Array(136), 68, 0);
} catch {}
try {
computePassEncoder111.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder21.draw(138, 49, 108_346_092, 190_476_901);
} catch {}
try {
commandEncoder1.copyBufferToBuffer(buffer26, 1724, buffer20, 240, 344);
} catch {}
let bindGroup94 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 329, resource: textureView105},
    {binding: 267, resource: {buffer: buffer19, offset: 1280, size: 56}},
  ],
});
let commandBuffer10 = commandEncoder1.finish({});
try {
computePassEncoder101.setBindGroup(0, bindGroup57, new Uint32Array(1461), 212, 0);
} catch {}
try {
renderPassEncoder22.end();
} catch {}
try {
renderPassEncoder21.drawIndexedIndirect(buffer41, 48);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer50, 'uint32', 264, 73);
} catch {}
try {
renderPassEncoder14.setPipeline(pipeline2);
} catch {}
try {
if (!arrayBuffer0.detached) { new Uint8Array(arrayBuffer0).fill(0x55); };
} catch {}
let bindGroup95 = device0.createBindGroup({
  layout: bindGroupLayout18,
  entries: [
    {binding: 490, resource: {buffer: buffer10, offset: 768, size: 1384}},
    {binding: 72, resource: textureView30},
    {binding: 54, resource: textureView122},
    {binding: 67, resource: sampler58},
    {binding: 575, resource: sampler84},
  ],
});
let commandEncoder136 = device0.createCommandEncoder({});
let computePassEncoder115 = commandEncoder23.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder52); computePassEncoder52.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder40.setPipeline(pipeline2);
} catch {}
try {
commandEncoder136.copyBufferToBuffer(buffer13, 216, buffer57, 972, 2408);
} catch {}
try {
renderPassEncoder36.pushDebugGroup('\u37ac');
} catch {}
try {
renderPassEncoder37.insertDebugMarker('\ud9a8');
} catch {}
let videoFrame9 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-ncl', primaries: 'smpte240m', transfer: 'logSqrt'} });
let bindGroup96 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 48, resource: textureView37}, {binding: 182, resource: sampler73}],
});
let buffer81 = device0.createBuffer({
  size: 2534,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
try {
computePassEncoder63.setBindGroup(2, bindGroup84);
} catch {}
try {
computePassEncoder115.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder39.setBindGroup(2, bindGroup4);
} catch {}
try {
renderPassEncoder21.drawIndirect(buffer5, 152);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
try {
  await promise12;
} catch {}
let canvas3 = document.createElement('canvas');
let texture145 = device0.createTexture({
  label: '\u095e\uefff',
  size: {width: 990},
  dimension: '1d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST,
});
let textureView158 = texture78.createView({dimension: '2d-array', format: 'rgba32float', arrayLayerCount: 1});
let sampler89 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 23.43,
  lodMaxClamp: 24.86,
  maxAnisotropy: 14,
});
try {
computePassEncoder8.setBindGroup(3, bindGroup76, new Uint32Array(672), 157, 0);
} catch {}
try {
computePassEncoder113.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder41.setBindGroup(0, bindGroup28, []);
} catch {}
try {
renderPassEncoder21.draw(278, 397, 30_208_304, 258_733_180);
} catch {}
try {
renderPassEncoder21.drawIndexed(1, 264, 0, -1_480_598_859, 73_762_287);
} catch {}
try {
buffer61.unmap();
} catch {}
try {
commandEncoder136.copyBufferToTexture({
  /* bytesInLastRow: 1 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1022 */
  offset: 1022,
  bytesPerRow: 18176,
  buffer: buffer36,
}, {
  texture: texture43,
  mipLevel: 0,
  origin: {x: 14, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let promise13 = device0.queue.onSubmittedWorkDone();
try {
externalTexture4.label = '\u94ed\ufd38\u02b3\ucec0\u6384\ud48c';
} catch {}
let bindGroupLayout24 = device0.createBindGroupLayout({
  label: '\u0582\u0c48\u7f57\ubb28\u273f',
  entries: [
    {
      binding: 403,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'sint', multisampled: false },
    },
  ],
});
let commandEncoder137 = device0.createCommandEncoder({});
try {
{ clearResourceUsages(device0, computePassEncoder49); computePassEncoder49.dispatchWorkgroups(2, 1, 2); };
} catch {}
try {
renderPassEncoder21.end();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 11, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas1,
  origin: { x: 94, y: 6 },
  flipY: false,
}, {
  texture: texture69,
  mipLevel: 2,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer82 = device0.createBuffer({
  size: 15921,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let texture146 = device0.createTexture({
  label: '\u{1ff4f}\u{1ffd2}\u0333\u{1f8f1}',
  size: {width: 3960, height: 1, depthOrArrayLayers: 14},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView159 = texture25.createView({baseMipLevel: 1, mipLevelCount: 1});
try {
computePassEncoder109.setBindGroup(0, bindGroup94, []);
} catch {}
try {
renderPassEncoder20.setVertexBuffer(1, buffer8, 0, 3_005);
} catch {}
try {
commandEncoder136.copyTextureToBuffer({
  texture: texture39,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 2 widthInBlocks: 2 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1571 */
  offset: 1571,
  buffer: buffer63,
}, {width: 2, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder114.setPipeline(pipeline0);
} catch {}
try {
commandEncoder137.copyBufferToTexture({
  /* bytesInLastRow: 74 widthInBlocks: 74 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 520 */
  offset: 520,
  rowsPerImage: 659,
  buffer: buffer26,
}, {
  texture: texture70,
  mipLevel: 0,
  origin: {x: 70, y: 0, z: 0},
  aspect: 'all',
}, {width: 74, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer3.detached) { new Uint8Array(arrayBuffer3).fill(0x55); };
} catch {}
try {
globalThis.someLabel = device0.label;
} catch {}
let bindGroup97 = device0.createBindGroup({
  layout: bindGroupLayout12,
  entries: [
    {binding: 100, resource: {buffer: buffer51, offset: 0, size: 520}},
    {binding: 146, resource: textureView53},
    {binding: 92, resource: textureView85},
    {binding: 4, resource: {buffer: buffer14, offset: 5632, size: 3252}},
    {binding: 187, resource: {buffer: buffer12, offset: 0, size: 12}},
  ],
});
let commandEncoder138 = device0.createCommandEncoder();
let commandBuffer11 = commandEncoder36.finish({});
let texture147 = gpuCanvasContext1.getCurrentTexture();
let textureView160 = texture103.createView({
  label: '\u06ba\ub66a\u5acc\ud880\u0be0\uf90c\u0159\u1513\u{1fb34}\ub06e',
  aspect: 'all',
  baseArrayLayer: 0,
});
try {
computePassEncoder37.setBindGroup(0, bindGroup32);
} catch {}
try {
renderPassEncoder45.setBindGroup(0, bindGroup73, new Uint32Array(23), 0, 0);
} catch {}
try {
renderPassEncoder14.setVertexBuffer(4, buffer60, 8_388);
} catch {}
try {
buffer82.unmap();
} catch {}
try {
renderPassEncoder36.popDebugGroup();
} catch {}
try {
device0.queue.submit([commandBuffer10, commandBuffer11]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture82,
  mipLevel: 0,
  origin: {x: 52, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(271_617).fill(105), /* required buffer size: 271_617 */
{offset: 17, bytesPerRow: 388, rowsPerImage: 20}, {width: 16, height: 0, depthOrArrayLayers: 36});
} catch {}
let gpuCanvasContext3 = canvas3.getContext('webgpu');
try {
  await promise13;
} catch {}
let textureView161 = texture77.createView({});
let computePassEncoder116 = commandEncoder138.beginComputePass();
let renderPassEncoder55 = commandEncoder137.beginRenderPass({
  label: '\u4870\u0be1\u5b31',
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: 820.2, g: -198.2, b: 652.6, a: -87.75, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder68.setBindGroup(3, bindGroup40);
} catch {}
try {
computePassEncoder116.setBindGroup(0, bindGroup54, new Uint32Array(4570), 300, 0);
} catch {}
try {
computePassEncoder116.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder40.setBindGroup(3, bindGroup22, new Uint32Array(1929), 431, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture54,
  mipLevel: 0,
  origin: {x: 33, y: 0, z: 5},
  aspect: 'all',
}, new Uint8Array(47_540).fill(78), /* required buffer size: 47_540 */
{offset: 192, bytesPerRow: 356, rowsPerImage: 19}, {width: 22, height: 0, depthOrArrayLayers: 8});
} catch {}
let buffer83 = device0.createBuffer({size: 2816, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder139 = device0.createCommandEncoder({});
let texture148 = gpuCanvasContext1.getCurrentTexture();
try {
computePassEncoder16.setBindGroup(2, bindGroup42);
} catch {}
try {
computePassEncoder80.setBindGroup(1, bindGroup35, new Uint32Array(2417), 649, 0);
} catch {}
try {
computePassEncoder0.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder11.setIndexBuffer(buffer27, 'uint16', 1_806, 1_133);
} catch {}
try {
renderPassEncoder40.setVertexBuffer(4_294_967_294, undefined, 0, 148_018_172);
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'premultiplied',
});
} catch {}
let bindGroup98 = device0.createBindGroup({
  layout: bindGroupLayout7,
  entries: [
    {binding: 267, resource: {buffer: buffer60, offset: 3328, size: 2268}},
    {binding: 329, resource: textureView63},
  ],
});
let texture149 = device0.createTexture({size: [8, 3705, 1], mipLevelCount: 2, format: 'astc-8x5-unorm', usage: GPUTextureUsage.TEXTURE_BINDING});
let renderBundleEncoder18 = device0.createRenderBundleEncoder({colorFormats: ['rgba32float'], depthReadOnly: false});
try {
computePassEncoder57.setBindGroup(2, bindGroup90, new Uint32Array(719), 92, 0);
} catch {}
try {
renderPassEncoder42.setBindGroup(0, bindGroup53);
} catch {}
try {
renderPassEncoder42.executeBundles([renderBundle15, renderBundle11, renderBundle6]);
} catch {}
try {
renderPassEncoder32.setIndexBuffer(buffer65, 'uint32', 1_500, 7_644);
} catch {}
try {
commandEncoder136.insertDebugMarker('\u0492');
} catch {}
let computePassEncoder117 = commandEncoder139.beginComputePass({});
let sampler90 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 89.23,
  lodMaxClamp: 97.17,
  maxAnisotropy: 8,
});
try {
{ clearResourceUsages(device0, computePassEncoder42); computePassEncoder42.dispatchWorkgroupsIndirect(buffer21, 6_844); };
} catch {}
try {
renderPassEncoder36.setBindGroup(1, bindGroup10, [1280, 768]);
} catch {}
try {
renderBundleEncoder18.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder18.setVertexBuffer(0, buffer14);
} catch {}
try {
buffer13.unmap();
} catch {}
let promise14 = device0.queue.onSubmittedWorkDone();
try {
if (!arrayBuffer6.detached) { new Uint8Array(arrayBuffer6).fill(0x55); };
} catch {}
let buffer84 = device0.createBuffer({
  label: '\u{1fadf}\u070e\u{1f8ff}\u1d5f\u005c',
  size: 1582,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder140 = device0.createCommandEncoder({label: '\u2cef\u{1f8ce}\u41c7\u090a\u0c18\u3f6f\ucc53\u{1fa0e}\u09dd\uffea'});
let texture150 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 1},
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView162 = texture128.createView({mipLevelCount: 1, baseArrayLayer: 0});
let computePassEncoder118 = commandEncoder136.beginComputePass({});
let renderBundle18 = renderBundleEncoder18.finish({label: '\ue278\ud85a\u283f'});
try {
computePassEncoder117.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder55.executeBundles([renderBundle14, renderBundle18, renderBundle17]);
} catch {}
let bindGroup99 = device0.createBindGroup({layout: bindGroupLayout13, entries: [{binding: 28, resource: textureView91}]});
let buffer85 = device0.createBuffer({size: 3237, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
try {
computePassEncoder22.setBindGroup(2, bindGroup29);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder42); computePassEncoder42.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder44.setBindGroup(1, bindGroup17);
} catch {}
try {
renderPassEncoder48.setBindGroup(2, bindGroup55, new Uint32Array(1776), 686, 0);
} catch {}
try {
globalThis.someLabel = buffer18.label;
} catch {}
let commandEncoder141 = device0.createCommandEncoder({});
let texture151 = device0.createTexture({
  size: [8, 8, 927],
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: ['rgba16float'],
});
try {
computePassEncoder76.setBindGroup(1, bindGroup56, new Uint32Array(2921), 186, 0);
} catch {}
try {
computePassEncoder118.setPipeline(pipeline3);
} catch {}
try {
commandEncoder141.copyBufferToBuffer(buffer64, 1348, buffer32, 32, 44);
} catch {}
try {
commandEncoder141.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 884 */
  offset: 884,
  bytesPerRow: 12800,
  buffer: buffer54,
}, {
  texture: texture28,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder140.copyTextureToBuffer({
  texture: texture69,
  mipLevel: 2,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 416 */
  offset: 416,
  bytesPerRow: 0,
  buffer: buffer60,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup100 = device0.createBindGroup({
  label: '\u07f5\u9302\u4964\ubfcc\ucd02\u{1f63a}\u0c7e\u0925',
  layout: bindGroupLayout1,
  entries: [
    {binding: 7, resource: textureView91},
    {binding: 21, resource: textureView122},
    {binding: 227, resource: {buffer: buffer84, offset: 0, size: 469}},
  ],
});
let commandEncoder142 = device0.createCommandEncoder({});
let textureView163 = texture99.createView({aspect: 'stencil-only', arrayLayerCount: 1});
let computePassEncoder119 = commandEncoder141.beginComputePass({});
let sampler91 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 17.30,
  lodMaxClamp: 49.76,
  compare: 'greater',
});
try {
computePassEncoder108.setBindGroup(3, bindGroup51, new Uint32Array(122), 13, 2);
} catch {}
try {
renderPassEncoder35.setVertexBuffer(0, buffer32, 0);
} catch {}
try {
commandEncoder140.copyTextureToTexture({
  texture: texture139,
  mipLevel: 0,
  origin: {x: 1443, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture89,
  mipLevel: 1,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
},
{width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let commandEncoder143 = device0.createCommandEncoder({});
let texture152 = device0.createTexture({
  size: [190, 2, 67],
  sampleCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture153 = device0.createTexture({
  label: '\u0694\u195a',
  size: {width: 495, height: 1, depthOrArrayLayers: 4},
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder37.setBindGroup(2, bindGroup68, [256]);
} catch {}
try {
renderPassEncoder48.setBindGroup(1, bindGroup100, new Uint32Array(2180), 27, 0);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer2, 'uint16', 444, 9_221);
} catch {}
let buffer86 = device0.createBuffer({
  size: 10123,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT,
  mappedAtCreation: false,
});
try {
renderPassEncoder31.setBindGroup(3, bindGroup25);
} catch {}
try {
renderPassEncoder55.setIndexBuffer(buffer35, 'uint16', 2_080, 14_470);
} catch {}
try {
renderPassEncoder45.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder15.setVertexBuffer(6, buffer37, 652, 977);
} catch {}
try {
commandEncoder140.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1064 */
  offset: 1064,
  buffer: buffer14,
}, {
  texture: texture100,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 14},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup101 = device0.createBindGroup({
  layout: bindGroupLayout22,
  entries: [{binding: 138, resource: {buffer: buffer9, offset: 0, size: 56}}],
});
let buffer87 = device0.createBuffer({
  size: 17751,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let textureView164 = texture16.createView({
  dimension: 'cube-array',
  aspect: 'all',
  baseMipLevel: 0,
  mipLevelCount: 1,
  baseArrayLayer: 1,
  arrayLayerCount: 6,
});
let texture154 = device0.createTexture({
  size: {width: 495},
  sampleCount: 1,
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
});
let computePassEncoder120 = commandEncoder140.beginComputePass({});
let renderPassEncoder56 = commandEncoder143.beginRenderPass({
  colorAttachments: [{
  view: textureView98,
  clearValue: { r: 872.6, g: 859.9, b: -461.9, a: 450.6, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder119.setPipeline(pipeline3);
} catch {}
try {
commandEncoder142.copyBufferToTexture({
  /* bytesInLastRow: 672 widthInBlocks: 84 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 16 */
  offset: 16,
  bytesPerRow: 2816,
  buffer: buffer47,
}, {
  texture: texture8,
  mipLevel: 1,
  origin: {x: 12, y: 0, z: 3},
  aspect: 'all',
}, {width: 84, height: 0, depthOrArrayLayers: 1});
} catch {}
let promise15 = device0.queue.onSubmittedWorkDone();
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
try {
globalThis.someLabel = externalTexture3.label;
} catch {}
let bindGroup102 = device0.createBindGroup({layout: bindGroupLayout13, entries: [{binding: 28, resource: textureView131}]});
let commandEncoder144 = device0.createCommandEncoder();
try {
renderPassEncoder55.setBindGroup(3, bindGroup68, [256]);
} catch {}
try {
commandEncoder144.copyBufferToBuffer(buffer78, 184, buffer60, 10292, 1340);
} catch {}
try {
commandEncoder144.copyBufferToTexture({
  /* bytesInLastRow: 206 widthInBlocks: 206 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1341 */
  offset: 1341,
  buffer: buffer35,
}, {
  texture: texture38,
  mipLevel: 0,
  origin: {x: 194, y: 0, z: 0},
  aspect: 'all',
}, {width: 206, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: imageData11,
  origin: { x: 5, y: 4 },
  flipY: false,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 45, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
let computePassEncoder121 = commandEncoder144.beginComputePass({});
try {
computePassEncoder56.setBindGroup(0, bindGroup54);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder37); computePassEncoder37.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder37.end();
} catch {}
try {
computePassEncoder120.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder38.setBindGroup(3, bindGroup6);
} catch {}
try {
renderPassEncoder43.setIndexBuffer(buffer86, 'uint32', 388, 3_665);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline1);
} catch {}
let buffer88 = device0.createBuffer({
  label: '\u203d\u{1f86d}\uc469\u{1f62b}\u06c6\ufab1',
  size: 4385,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE,
});
let textureView165 = texture131.createView({dimension: 'cube-array', baseMipLevel: 0, arrayLayerCount: 6});
let computePassEncoder122 = commandEncoder142.beginComputePass({});
try {
computePassEncoder121.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder51.executeBundles([renderBundle4, renderBundle9]);
} catch {}
try {
renderPassEncoder41.setIndexBuffer(buffer51, 'uint16', 1_052, 151);
} catch {}
try {
renderPassEncoder49.setVertexBuffer(1, buffer33);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture97,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 37},
  aspect: 'all',
}, new Uint8Array(6_399_799).fill(25), /* required buffer size: 6_399_799 */
{offset: 19, bytesPerRow: 4020, rowsPerImage: 43}, {width: 1980, height: 1, depthOrArrayLayers: 38});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: img3,
  origin: { x: 2, y: 9 },
  flipY: true,
}, {
  texture: texture117,
  mipLevel: 0,
  origin: {x: 380, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(img3);
let bindGroup103 = device0.createBindGroup({
  layout: bindGroupLayout16,
  entries: [
    {binding: 3, resource: textureView106},
    {binding: 53, resource: textureView131},
    {binding: 327, resource: sampler20},
    {binding: 41, resource: {buffer: buffer28, offset: 0, size: 40}},
    {binding: 345, resource: textureView146},
    {binding: 668, resource: {buffer: buffer71, offset: 512, size: 1636}},
    {binding: 402, resource: {buffer: buffer24, offset: 512}},
    {binding: 416, resource: sampler5},
    {binding: 62, resource: sampler88},
  ],
});
let commandBuffer12 = commandEncoder42.finish({});
try {
{ clearResourceUsages(device0, computePassEncoder101); computePassEncoder101.dispatchWorkgroupsIndirect(buffer74, 268); };
} catch {}
try {
computePassEncoder122.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder43.setPipeline(pipeline1);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 8, depthOrArrayLayers: 15}
*/
{
  source: imageBitmap0,
  origin: { x: 1, y: 24 },
  flipY: false,
}, {
  texture: texture131,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 2},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 1, height: 1, depthOrArrayLayers: 0});
} catch {}
let bindGroup104 = device0.createBindGroup({layout: bindGroupLayout17, entries: [{binding: 400, resource: textureView86}]});
let sampler92 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  lodMinClamp: 11.02,
  lodMaxClamp: 61.55,
});
let externalTexture20 = device0.importExternalTexture({label: '\u0dd8\u0960\ud652\u0fc3\u2d53', source: videoFrame8, colorSpace: 'srgb'});
try {
computePassEncoder30.setBindGroup(0, bindGroup92);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder99); computePassEncoder99.dispatchWorkgroupsIndirect(buffer63, 6_912); };
} catch {}
try {
renderPassEncoder40.executeBundles([renderBundle0, renderBundle11, renderBundle11, renderBundle7, renderBundle0, renderBundle3]);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise14;
} catch {}
let bindGroup105 = device0.createBindGroup({
  label: '\u{1ff71}\u{1fd2f}\u1a50\ub724\u{1f9b0}\u{1fd31}\u8cf2\u5e16\uf549\u0800\u765b',
  layout: bindGroupLayout18,
  entries: [
    {binding: 67, resource: sampler81},
    {binding: 54, resource: textureView155},
    {binding: 575, resource: sampler35},
    {binding: 72, resource: textureView44},
    {binding: 490, resource: {buffer: buffer42, offset: 1024}},
  ],
});
try {
{ clearResourceUsages(device0, computePassEncoder85); computePassEncoder85.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder23.setBindGroup(2, bindGroup43, new Uint32Array(134), 0, 0);
} catch {}
try {
renderPassEncoder26.executeBundles([renderBundle18, renderBundle10, renderBundle4, renderBundle9, renderBundle10, renderBundle17, renderBundle14, renderBundle10]);
} catch {}
let textureView166 = texture140.createView({dimension: '2d'});
let sampler93 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 80.60,
  lodMaxClamp: 95.31,
  compare: 'greater',
  maxAnisotropy: 2,
});
try {
renderPassEncoder55.setVertexBuffer(5, buffer36, 1_208);
} catch {}
try {
  await promise15;
} catch {}
let textureView167 = texture44.createView({label: '\u0d15\u{1fce6}\uf758\u{1fc4b}', baseMipLevel: 0, baseArrayLayer: 1, arrayLayerCount: 1});
try {
computePassEncoder118.setBindGroup(0, bindGroup53);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder65); computePassEncoder65.dispatchWorkgroups(1, 1); };
} catch {}
try {
renderPassEncoder14.setBindGroup(3, bindGroup85);
} catch {}
try {
renderPassEncoder47.setPipeline(pipeline1);
} catch {}
let commandEncoder145 = device0.createCommandEncoder({});
let textureView168 = texture138.createView({baseArrayLayer: 0});
let computePassEncoder123 = commandEncoder145.beginComputePass({});
try {
computePassEncoder49.setBindGroup(3, bindGroup14, new Uint32Array(1517), 919, 0);
} catch {}
try {
computePassEncoder101.end();
} catch {}
try {
computePassEncoder123.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder40.setBindGroup(0, bindGroup8, new Uint32Array(612), 38, 0);
} catch {}
try {
renderPassEncoder45.setIndexBuffer(buffer14, 'uint32', 9_648, 12_978);
} catch {}
try {
renderPassEncoder56.setVertexBuffer(4, buffer41, 20, 89);
} catch {}
let arrayBuffer8 = buffer40.getMappedRange(1968, 28);
try {
commandEncoder39.copyBufferToTexture({
  /* bytesInLastRow: 736 widthInBlocks: 92 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 112 */
  offset: 112,
  bytesPerRow: 1792,
  buffer: buffer43,
}, {
  texture: texture134,
  mipLevel: 0,
  origin: {x: 18, y: 0, z: 0},
  aspect: 'all',
}, {width: 92, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.submit([commandBuffer12]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture154,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(28).fill(78), /* required buffer size: 28 */
{offset: 28, bytesPerRow: 1491}, {width: 93, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(img2);
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let buffer89 = device0.createBuffer({size: 9214, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: false});
let commandEncoder146 = device0.createCommandEncoder();
let texture155 = device0.createTexture({
  size: [756, 24, 9],
  format: 'astc-12x12-unorm-srgb',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let externalTexture21 = device0.importExternalTexture({source: videoFrame7});
try {
computePassEncoder113.insertDebugMarker('\u414a');
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData2,
  origin: { x: 1, y: 1 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 32, y: 0, z: 3},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 1, height: 1, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout14 = device0.createPipelineLayout({bindGroupLayouts: [bindGroupLayout5, bindGroupLayout11]});
let buffer90 = device0.createBuffer({size: 26785, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandBuffer13 = commandEncoder39.finish({});
let textureView169 = texture116.createView({});
try {
{ clearResourceUsages(device0, computePassEncoder65); computePassEncoder65.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder53.setBindGroup(1, bindGroup15, new Uint32Array(1130), 15, 0);
} catch {}
try {
renderPassEncoder52.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder55.setVertexBuffer(5, buffer45);
} catch {}
try {
commandEncoder146.copyBufferToTexture({
  /* bytesInLastRow: 440 widthInBlocks: 55 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 544 */
  offset: 544,
  bytesPerRow: 17664,
  buffer: buffer34,
}, {
  texture: texture101,
  mipLevel: 0,
  origin: {x: 293, y: 0, z: 0},
  aspect: 'all',
}, {width: 55, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.submit([commandBuffer13]);
} catch {}
let commandEncoder147 = device0.createCommandEncoder({});
try {
computePassEncoder76.setBindGroup(1, bindGroup97, new Uint32Array(329), 7, 0);
} catch {}
try {
renderPassEncoder37.setIndexBuffer(buffer30, 'uint16', 322, 574);
} catch {}
try {
renderPassEncoder15.setPipeline(pipeline1);
} catch {}
try {
commandEncoder147.copyTextureToBuffer({
  texture: texture123,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 44 widthInBlocks: 44 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 4682 */
  offset: 4682,
  buffer: buffer34,
}, {width: 44, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: img3,
  origin: { x: 33, y: 9 },
  flipY: false,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 26, y: 0, z: 4},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
adapter0.label = '\u020b\u0a7e\u06d4\u38e6\u69bd\u{1ff62}\u6989\u81ff\u7338';
} catch {}
let computePassEncoder124 = commandEncoder147.beginComputePass({});
let renderPassEncoder57 = commandEncoder146.beginRenderPass({
  label: '\u{1fa58}\u08f6\u{1f9f1}\ub0ee\u09b1\u9acb\uf8c3\uaf14\u79b2\u{1fa47}',
  colorAttachments: [{
  view: textureView82,
  clearValue: { r: 798.5, g: 668.4, b: 71.22, a: -284.4, },
  loadOp: 'load',
  storeOp: 'store',
}],
  maxDrawCount: 202629527,
});
try {
computePassEncoder123.setBindGroup(0, bindGroup85);
} catch {}
try {
computePassEncoder119.setBindGroup(0, bindGroup2, new Uint32Array(732), 32, 0);
} catch {}
try {
computePassEncoder124.setPipeline(pipeline0);
} catch {}
try {
buffer53.unmap();
} catch {}
let texture156 = device0.createTexture({
  size: {width: 3960},
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
});
try {
computePassEncoder22.setBindGroup(1, bindGroup50, new Uint32Array(769), 22, 0);
} catch {}
try {
renderPassEncoder44.setBindGroup(0, bindGroup23);
} catch {}
try {
renderPassEncoder44.setBindGroup(0, bindGroup40, new Uint32Array(985), 536, 0);
} catch {}
try {
renderPassEncoder55.setVertexBuffer(6, buffer33, 0);
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
let buffer91 = device0.createBuffer({size: 5812, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: true});
try {
renderPassEncoder37.setBindGroup(1, bindGroup84);
} catch {}
try {
renderPassEncoder18.setPipeline(pipeline2);
} catch {}
let arrayBuffer9 = buffer91.getMappedRange(0, 596);
try {
device0.queue.copyExternalImageToTexture(/*
{width: 1980, height: 1, depthOrArrayLayers: 154}
*/
{
  source: img1,
  origin: { x: 2, y: 4 },
  flipY: true,
}, {
  texture: texture2,
  mipLevel: 0,
  origin: {x: 32, y: 0, z: 90},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 42, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup106 = device0.createBindGroup({
  label: '\ub7d9\u{1fa41}\u52be\u0668\u4a55\u0c9a\u0ab1\uc62c',
  layout: bindGroupLayout21,
  entries: [
    {binding: 125, resource: textureView161},
    {binding: 285, resource: {buffer: buffer51, offset: 256, size: 248}},
  ],
});
let commandEncoder148 = device0.createCommandEncoder({label: '\u{1fe0e}\u{1fca4}\uf859\u1ef0\u{1fef7}'});
let texture157 = device0.createTexture({
  size: {width: 1980, height: 1, depthOrArrayLayers: 1},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC,
});
let computePassEncoder125 = commandEncoder148.beginComputePass({});
try {
renderPassEncoder15.setBindGroup(1, bindGroup27, new Uint32Array(3104), 436, 0);
} catch {}
try {
renderPassEncoder42.executeBundles([renderBundle0]);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer33, 'uint16', 560, 286);
} catch {}
try {
renderPassEncoder26.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder27.setVertexBuffer(3, buffer21, 0, 4_156);
} catch {}
let pipelineLayout15 = device0.createPipelineLayout({label: '\u0960\u0bc8\u3018\u0b54\ub9c5', bindGroupLayouts: []});
let commandEncoder149 = device0.createCommandEncoder();
try {
renderPassEncoder41.setVertexBuffer(2, buffer45);
} catch {}
let commandEncoder150 = device0.createCommandEncoder({label: '\u002d\u02a6\ub084\u{1f6d0}\u{1f9b0}'});
let computePassEncoder126 = commandEncoder149.beginComputePass({});
try {
renderPassEncoder30.setViewport(3147.902300295079, 0.031485112810582194, 82.803173987209, 0.27401753559895814, 0.5508468248491616, 0.7688031021574243);
} catch {}
try {
commandEncoder150.copyBufferToTexture({
  /* bytesInLastRow: 608 widthInBlocks: 38 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 2496 */
  offset: 2496,
  bytesPerRow: 8704,
  buffer: buffer63,
}, {
  texture: texture82,
  mipLevel: 0,
  origin: {x: 14, y: 0, z: 18},
  aspect: 'all',
}, {width: 38, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture158 = device0.createTexture({
  label: '\u01b0\u70ac\u0e5e\u38a3\u3fb2\udadd\u939a\u47fc\ua9df\ua84f',
  size: [380, 5, 115],
  mipLevelCount: 3,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView170 = texture8.createView({mipLevelCount: 1, arrayLayerCount: 4});
try {
computePassEncoder87.setBindGroup(1, bindGroup62);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder14); computePassEncoder14.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder16.setScissorRect(829, 0, 233, 0);
} catch {}
try {
renderPassEncoder33.setIndexBuffer(buffer60, 'uint32', 4_512, 2_158);
} catch {}
let videoFrame10 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'BGRX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'yCgCo', primaries: 'bt470m', transfer: 'smpte240m'} });
let textureView171 = texture131.createView({dimension: 'cube-array', arrayLayerCount: 6});
let texture159 = device0.createTexture({
  size: [3960],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let sampler94 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 4.294,
  maxAnisotropy: 2,
});
try {
computePassEncoder95.setBindGroup(3, bindGroup85);
} catch {}
try {
computePassEncoder33.setBindGroup(3, bindGroup35, new Uint32Array(1929), 495, 0);
} catch {}
try {
computePassEncoder125.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder26.setBindGroup(0, bindGroup61, new Uint32Array(3705), 775, 0);
} catch {}
try {
renderPassEncoder49.setViewport(3119.6963906258948, 0.16261236705765159, 783.0530756166039, 0.22430577967364726, 0.8544941883962396, 0.891049036358947);
} catch {}
try {
renderPassEncoder51.setVertexBuffer(6, buffer12, 120);
} catch {}
try {
buffer40.unmap();
} catch {}
try {
computePassEncoder5.insertDebugMarker('\u8fe7');
} catch {}
document.body.append(img2);
let pipelineLayout16 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture160 = device0.createTexture({
  label: '\u{1fe68}\u94ec\ua860\u52d9\u0caa\uafad\u9b6e\u08e5\u297f\u1032',
  size: [990, 1, 1],
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
let texture161 = gpuCanvasContext2.getCurrentTexture();
let renderPassEncoder58 = commandEncoder150.beginRenderPass({
  colorAttachments: [{
  view: textureView111,
  clearValue: { r: -158.2, g: -175.4, b: 743.7, a: -83.79, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet1,
});
try {
computePassEncoder10.setBindGroup(0, bindGroup99);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder85); computePassEncoder85.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder126.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder35.setBindGroup(3, bindGroup44, new Uint32Array(627), 214, 0);
} catch {}
try {
renderPassEncoder20.executeBundles([renderBundle5, renderBundle7, renderBundle0]);
} catch {}
try {
renderPassEncoder27.setViewport(222.32452146629407, 0.9644830870591438, 39.32785510641642, 0.00828890056023547, 0.17348814736695795, 0.7484511706317794);
} catch {}
try {
renderPassEncoder32.setVertexBuffer(5, buffer37, 516);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let videoFrame11 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt709', primaries: 'smpte170m', transfer: 'smpte240m'} });
let bindGroup107 = device0.createBindGroup({layout: bindGroupLayout20, entries: [{binding: 50, resource: textureView67}]});
let textureView172 = texture124.createView({});
try {
renderPassEncoder12.setBindGroup(0, bindGroup24);
} catch {}
try {
renderPassEncoder44.setIndexBuffer(buffer21, 'uint32', 1_068, 580);
} catch {}
try {
renderPassEncoder36.setVertexBuffer(6, buffer69);
} catch {}
try {
globalThis.someLabel = textureView22.label;
} catch {}
let buffer92 = device0.createBuffer({label: '\u{1fc0f}\ufcf3\u10d0\uff72\u03ed', size: 2372, usage: GPUBufferUsage.MAP_WRITE});
let commandEncoder151 = device0.createCommandEncoder({});
let textureView173 = texture110.createView({label: '\uaafe\u1dac\u0457\u028b', dimension: '2d-array', baseMipLevel: 0});
let texture162 = device0.createTexture({size: [990, 1, 1], mipLevelCount: 2, format: 'rg11b10ufloat', usage: GPUTextureUsage.COPY_SRC});
let renderPassEncoder59 = commandEncoder151.beginRenderPass({
  colorAttachments: [{view: textureView73, loadOp: 'load', storeOp: 'discard'}],
  maxDrawCount: 571243755,
});
let sampler95 = device0.createSampler({
  label: '\u967f\ucd11\u0753\u20e1\ua43f',
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 96.33,
  lodMaxClamp: 97.77,
});
try {
renderPassEncoder35.setVertexBuffer(6, buffer28);
} catch {}
let videoFrame12 = videoFrame9.clone();
let bindGroup108 = device0.createBindGroup({
  layout: bindGroupLayout18,
  entries: [
    {binding: 54, resource: textureView122},
    {binding: 72, resource: textureView44},
    {binding: 67, resource: sampler42},
    {binding: 575, resource: sampler60},
    {binding: 490, resource: {buffer: buffer87, offset: 6144, size: 5328}},
  ],
});
let commandEncoder152 = device0.createCommandEncoder({});
let textureView174 = texture27.createView({label: '\uf07a\ue388\u39c3\u0def\u8fa0\u{1fa8f}\u{1f80c}', arrayLayerCount: 1});
try {
computePassEncoder85.end();
} catch {}
try {
renderPassEncoder41.setIndexBuffer(buffer7, 'uint16', 266, 558);
} catch {}
let bindGroup109 = device0.createBindGroup({
  layout: bindGroupLayout18,
  entries: [
    {binding: 72, resource: textureView80},
    {binding: 575, resource: sampler52},
    {binding: 54, resource: textureView155},
    {binding: 67, resource: sampler90},
    {binding: 490, resource: {buffer: buffer64, offset: 3584}},
  ],
});
let commandEncoder153 = device0.createCommandEncoder({});
let texture163 = device0.createTexture({
  size: [380, 5, 37],
  mipLevelCount: 2,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let textureView175 = texture46.createView({dimension: '2d', mipLevelCount: 1, baseArrayLayer: 0, arrayLayerCount: 1});
let computePassEncoder127 = commandEncoder152.beginComputePass({});
try {
computePassEncoder57.setBindGroup(1, bindGroup78);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder86); computePassEncoder86.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder36.setBindGroup(0, bindGroup50, new Uint32Array(4739), 351, 0);
} catch {}
try {
renderPassEncoder12.setBlendConstant({ r: -634.2, g: 388.6, b: 618.7, a: 835.6, });
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let promise16 = device0.queue.onSubmittedWorkDone();
let commandEncoder154 = device0.createCommandEncoder({});
let externalTexture22 = device0.importExternalTexture({source: videoFrame3});
try {
{ clearResourceUsages(device0, computePassEncoder14); computePassEncoder14.dispatchWorkgroups(1, 2); };
} catch {}
try {
computePassEncoder30.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder58.setIndexBuffer(buffer23, 'uint32', 2_968, 7_704);
} catch {}
try {
renderPassEncoder34.setPipeline(pipeline2);
} catch {}
try {
commandEncoder154.copyBufferToTexture({
  /* bytesInLastRow: 616 widthInBlocks: 77 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1984 */
  offset: 1984,
  buffer: buffer63,
}, {
  texture: texture125,
  mipLevel: 0,
  origin: {x: 42, y: 0, z: 0},
  aspect: 'all',
}, {width: 77, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup110 = device0.createBindGroup({
  layout: bindGroupLayout6,
  entries: [{binding: 49, resource: {buffer: buffer32, offset: 0, size: 232}}],
});
let buffer93 = device0.createBuffer({size: 21010, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM});
let commandEncoder155 = device0.createCommandEncoder({});
let textureView176 = texture14.createView({mipLevelCount: 1});
try {
computePassEncoder71.setBindGroup(1, bindGroup102);
} catch {}
try {
computePassEncoder14.end();
} catch {}
try {
renderPassEncoder27.executeBundles([renderBundle1]);
} catch {}
try {
renderPassEncoder30.setIndexBuffer(buffer14, 'uint32', 296, 730);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder54.setVertexBuffer(6, buffer52);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroupLayout25 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 124,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'r32uint', access: 'read-only', viewDimension: '2d' },
    },
  ],
});
let bindGroup111 = device0.createBindGroup({layout: bindGroupLayout23, entries: [{binding: 170, resource: sampler55}]});
let buffer94 = device0.createBuffer({size: 11037, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE});
let commandEncoder156 = device0.createCommandEncoder({label: '\u{1f967}\u{1fb03}'});
let renderPassEncoder60 = commandEncoder97.beginRenderPass({
  colorAttachments: [{
  view: textureView48,
  clearValue: { r: 928.0, g: 789.9, b: 162.5, a: 162.5, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
computePassEncoder22.setBindGroup(2, bindGroup78);
} catch {}
try {
computePassEncoder120.setBindGroup(3, bindGroup5, new Uint32Array(3359), 523, 0);
} catch {}
try {
renderPassEncoder47.setIndexBuffer(buffer45, 'uint16', 296, 354);
} catch {}
try {
commandEncoder155.resolveQuerySet(querySet7, 13, 39, buffer44, 0);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
let bindGroup112 = device0.createBindGroup({
  layout: bindGroupLayout12,
  entries: [
    {binding: 146, resource: textureView60},
    {binding: 92, resource: textureView109},
    {binding: 100, resource: {buffer: buffer81, offset: 0, size: 132}},
    {binding: 187, resource: {buffer: buffer24, offset: 0}},
    {binding: 4, resource: {buffer: buffer51, offset: 256, size: 1032}},
  ],
});
let computePassEncoder128 = commandEncoder21.beginComputePass({});
let sampler96 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 92.01,
  lodMaxClamp: 94.87,
  compare: 'greater',
  maxAnisotropy: 12,
});
try {
{ clearResourceUsages(device0, computePassEncoder119); computePassEncoder119.dispatchWorkgroups(1, 2, 2); };
} catch {}
try {
renderPassEncoder59.executeBundles([renderBundle10, renderBundle17, renderBundle10, renderBundle18]);
} catch {}
try {
renderPassEncoder50.setVertexBuffer(4, buffer40);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
let videoFrame13 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-ncl', primaries: 'unspecified', transfer: 'bt2020_12bit'} });
let bindGroup113 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler25}, {binding: 48, resource: textureView37}],
});
let commandEncoder157 = device0.createCommandEncoder({});
let texture164 = device0.createTexture({
  label: '\ueb2a\u0cc9\ubcf0\u0d77\ucc9c\u4823',
  size: [380],
  sampleCount: 1,
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let textureView177 = texture16.createView({dimension: '2d', format: 'eac-r11snorm', mipLevelCount: 1, baseArrayLayer: 4});
let computePassEncoder129 = commandEncoder153.beginComputePass({});
let renderPassEncoder61 = commandEncoder157.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: -82.21, g: -927.4, b: -963.6, a: 261.8, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 446154814,
});
try {
computePassEncoder127.setBindGroup(1, bindGroup45);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder52); computePassEncoder52.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder99.end();
} catch {}
try {
computePassEncoder129.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder41.beginOcclusionQuery(0);
} catch {}
try {
commandEncoder155.copyBufferToTexture({
  /* bytesInLastRow: 624 widthInBlocks: 78 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 352 */
  offset: 352,
  rowsPerImage: 811,
  buffer: buffer84,
}, {
  texture: texture153,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 78, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let sampler97 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 84.00,
  compare: 'equal',
});
try {
computePassEncoder127.setBindGroup(3, bindGroup50);
} catch {}
try {
computePassEncoder121.setBindGroup(3, bindGroup35, new Uint32Array(1254), 22, 0);
} catch {}
try {
renderPassEncoder52.setVertexBuffer(0, undefined, 0);
} catch {}
let computePassEncoder130 = commandEncoder155.beginComputePass({label: '\u49d5\u{1f733}\uc959\ufe2e\u038d\u9526'});
try {
computePassEncoder11.setBindGroup(2, bindGroup43);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder119); computePassEncoder119.dispatchWorkgroups(1, 2, 1); };
} catch {}
try {
computePassEncoder130.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder45.setBindGroup(1, bindGroup10, [0, 256]);
} catch {}
try {
renderPassEncoder23.setBindGroup(0, bindGroup45, new Uint32Array(1613), 28, 0);
} catch {}
try {
renderPassEncoder49.setStencilReference(224);
} catch {}
try {
renderPassEncoder20.setIndexBuffer(buffer72, 'uint32', 60, 19);
} catch {}
try {
commandEncoder156.copyBufferToBuffer(buffer19, 700, buffer94, 260, 224);
} catch {}
try {
commandEncoder156.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 40296 */
  offset: 3176,
  bytesPerRow: 37120,
  buffer: buffer60,
}, {
  texture: texture141,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 2, depthOrArrayLayers: 1});
} catch {}
await gc();
let texture165 = device0.createTexture({
  size: [380, 5, 1],
  mipLevelCount: 2,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder131 = commandEncoder115.beginComputePass();
let renderPassEncoder62 = commandEncoder154.beginRenderPass({
  colorAttachments: [{
  view: textureView5,
  clearValue: { r: -542.3, g: 674.3, b: 374.6, a: 353.7, },
  loadOp: 'clear',
  storeOp: 'store',
}],
});
try {
computePassEncoder130.setBindGroup(0, bindGroup79);
} catch {}
try {
computePassEncoder120.setBindGroup(0, bindGroup52, new Uint32Array(1567), 560, 2);
} catch {}
try {
computePassEncoder127.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder32.setBindGroup(3, bindGroup99, new Uint32Array(145), 36, 0);
} catch {}
try {
renderPassEncoder41.endOcclusionQuery();
} catch {}
try {
renderPassEncoder12.setIndexBuffer(buffer60, 'uint32', 1_632, 2_628);
} catch {}
let buffer95 = device0.createBuffer({size: 16929, usage: GPUBufferUsage.INDIRECT});
let commandEncoder158 = device0.createCommandEncoder({});
let texture166 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 78},
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView178 = texture23.createView({});
try {
computePassEncoder61.setBindGroup(0, bindGroup113);
} catch {}
try {
computePassEncoder66.setPipeline(pipeline3);
} catch {}
try {
computePassEncoder128.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(7, buffer43);
} catch {}
try {
commandEncoder156.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 448 */
  offset: 448,
  buffer: buffer60,
}, {
  texture: texture127,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder158.copyTextureToBuffer({
  texture: texture90,
  mipLevel: 0,
  origin: {x: 5, y: 0, z: 0},
  aspect: 'all',
}, {
  /* bytesInLastRow: 72 widthInBlocks: 9 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 672 */
  offset: 672,
  rowsPerImage: 495,
  buffer: buffer46,
}, {width: 9, height: 0, depthOrArrayLayers: 1});
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
  alphaMode: 'opaque',
});
} catch {}
let computePassEncoder132 = commandEncoder156.beginComputePass({});
let renderBundleEncoder19 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], sampleCount: 1, depthReadOnly: true});
let sampler98 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 99.18,
  maxAnisotropy: 4,
});
try {
renderPassEncoder40.setIndexBuffer(buffer29, 'uint16', 628, 176);
} catch {}
try {
renderBundleEncoder19.setPipeline(pipeline2);
} catch {}
try {
commandEncoder158.copyBufferToTexture({
  /* bytesInLastRow: 280 widthInBlocks: 35 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 480 */
  offset: 480,
  buffer: buffer20,
}, {
  texture: texture101,
  mipLevel: 0,
  origin: {x: 50, y: 0, z: 0},
  aspect: 'all',
}, {width: 35, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup114 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView23}]});
let commandEncoder159 = device0.createCommandEncoder({});
let textureView179 = texture92.createView({mipLevelCount: 1, arrayLayerCount: 7});
let computePassEncoder133 = commandEncoder158.beginComputePass({});
let renderBundle19 = renderBundleEncoder19.finish({});
try {
{ clearResourceUsages(device0, computePassEncoder42); computePassEncoder42.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder16.setVertexBuffer(0, buffer27);
} catch {}
try {
device0.queue.writeBuffer(buffer90, 4796, new DataView(new ArrayBuffer(25644)), 1436, 1932);
} catch {}
let bindGroupLayout26 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 145,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      sampler: { type: 'non-filtering' },
    },
    {
      binding: 50,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
  ],
});
let buffer96 = device0.createBuffer({size: 25393, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE});
let querySet14 = device0.createQuerySet({label: '\u{1f85d}\u4c8e\u9c4a', type: 'occlusion', count: 951});
let textureView180 = texture65.createView({format: 'rgba32float', mipLevelCount: 1, baseArrayLayer: 9, arrayLayerCount: 5});
let sampler99 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 2.816,
  maxAnisotropy: 16,
});
try {
computePassEncoder107.setBindGroup(3, bindGroup95);
} catch {}
try {
computePassEncoder131.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder56.setViewport(26.11975922253752, 0.9679180170621391, 9.516113196884815, 0.011716877606136348, 0.15513865899516488, 0.20509224574382623);
} catch {}
try {
renderPassEncoder16.setVertexBuffer(7, buffer45, 0, 1_275);
} catch {}
try {
commandEncoder159.copyBufferToBuffer(buffer5, 524, buffer67, 56, 44);
} catch {}
try {
commandEncoder159.insertDebugMarker('\u{1fe01}');
} catch {}
try {
device0.queue.writeBuffer(buffer4, 12, new DataView(new ArrayBuffer(21632)), 3268, 5056);
} catch {}
try {
if (!arrayBuffer1.detached) { new Uint8Array(arrayBuffer1).fill(0x55); };
} catch {}
document.body.prepend(img2);
let bindGroup115 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView25}]});
let textureView181 = texture4.createView({baseMipLevel: 1, mipLevelCount: 1});
try {
renderPassEncoder31.executeBundles([renderBundle13]);
} catch {}
try {
renderPassEncoder42.setIndexBuffer(buffer28, 'uint16', 302, 1);
} catch {}
try {
commandEncoder159.copyTextureToTexture({
  texture: texture53,
  mipLevel: 1,
  origin: {x: 0, y: 1, z: 0},
  aspect: 'all',
},
{
  texture: texture85,
  mipLevel: 0,
  origin: {x: 15, y: 0, z: 8},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(canvas2);
await gc();
let bindGroup116 = device0.createBindGroup({
  layout: bindGroupLayout26,
  entries: [{binding: 50, resource: textureView91}, {binding: 145, resource: sampler58}],
});
let buffer97 = device0.createBuffer({
  size: 33142,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let texture167 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 110},
  dimension: '3d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder134 = commandEncoder159.beginComputePass({});
try {
computePassEncoder10.setBindGroup(3, bindGroup116);
} catch {}
try {
computePassEncoder129.setBindGroup(1, bindGroup78, new Uint32Array(659), 42, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder65); computePassEncoder65.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder52.end();
} catch {}
try {
renderPassEncoder2.executeBundles([renderBundle19]);
} catch {}
try {
renderPassEncoder61.setVertexBuffer(3, buffer43, 0, 5_963);
} catch {}
try {
commandEncoder60.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 4416 */
  offset: 4416,
  bytesPerRow: 59136,
  rowsPerImage: 848,
  buffer: buffer72,
}, {
  texture: texture21,
  mipLevel: 0,
  origin: {x: 0, y: 1, z: 1},
  aspect: 'all',
}, {width: 1, height: 1, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 15}
*/
{
  source: imageData5,
  origin: { x: 4, y: 0 },
  flipY: true,
}, {
  texture: texture15,
  mipLevel: 0,
  origin: {x: 16, y: 0, z: 1},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 5, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder160 = device0.createCommandEncoder({});
let texture168 = device0.createTexture({
  size: [8],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let texture169 = gpuCanvasContext0.getCurrentTexture();
try {
computePassEncoder102.setBindGroup(1, bindGroup41);
} catch {}
try {
computePassEncoder132.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder51.setIndexBuffer(buffer56, 'uint32', 3_620, 521);
} catch {}
try {
renderPassEncoder61.setPipeline(pipeline2);
} catch {}
try {
device0.queue.writeBuffer(buffer86, 768, new Int16Array(4645), 1191, 992);
} catch {}
let buffer98 = device0.createBuffer({
  size: 9538,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE,
});
let textureView182 = texture108.createView({});
let computePassEncoder135 = commandEncoder160.beginComputePass({label: '\u715e\u083e\u70da\ue0c0\u0cc7\u{1fe0a}\u{1fef3}\u09bb\u773e\u9d4e'});
let renderPassEncoder63 = commandEncoder60.beginRenderPass({
  label: '\u89bb\uf161\u{1fbeb}\u41bb\uef33\ud6a7\uff6f\u70d4\u{1fbc1}\u217b\uac39',
  colorAttachments: [{
  view: textureView98,
  clearValue: { r: -266.9, g: 693.8, b: -754.4, a: -431.0, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
let externalTexture23 = device0.importExternalTexture({source: videoFrame4});
try {
computePassEncoder116.setBindGroup(2, bindGroup14, new Uint32Array(3147), 364, 0);
} catch {}
try {
renderPassEncoder38.setPipeline(pipeline2);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
  await promise16;
} catch {}
let sampler100 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 40.46,
  lodMaxClamp: 57.69,
  maxAnisotropy: 1,
});
try {
computePassEncoder22.setBindGroup(2, bindGroup66, new Uint32Array(575), 87, 0);
} catch {}
try {
renderPassEncoder55.setIndexBuffer(buffer14, 'uint32', 6_620, 2_597);
} catch {}
try {
renderPassEncoder26.setVertexBuffer(6, buffer35);
} catch {}
try {
renderPassEncoder17.pushDebugGroup('\u{1fe43}');
} catch {}
let offscreenCanvas2 = new OffscreenCanvas(2, 51);
try {
computePassEncoder135.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder25.setBindGroup(3, bindGroup39, new Uint32Array(1130), 169, 0);
} catch {}
try {
  await buffer31.mapAsync(GPUMapMode.READ, 488, 0);
} catch {}
try {
gpuCanvasContext0.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT});
} catch {}
document.body.append(img3);
let bindGroup117 = device0.createBindGroup({
  layout: bindGroupLayout1,
  entries: [
    {binding: 7, resource: textureView59},
    {binding: 227, resource: {buffer: buffer2, offset: 0, size: 867}},
    {binding: 21, resource: textureView47},
  ],
});
try {
computePassEncoder39.setBindGroup(2, bindGroup54, new Uint32Array(3423), 117, 0);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(6, buffer32);
} catch {}
try {
renderPassEncoder17.popDebugGroup();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture86,
  mipLevel: 0,
  origin: {x: 86, y: 0, z: 4},
  aspect: 'all',
}, new Uint8Array(250).fill(29), /* required buffer size: 250 */
{offset: 250}, {width: 1084, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup118 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView8}, {binding: 50, resource: textureView15}],
});
try {
{ clearResourceUsages(device0, computePassEncoder65); computePassEncoder65.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder49.end();
} catch {}
let arrayBuffer10 = buffer91.getMappedRange(600, 2540);
try {
commandEncoder55.copyBufferToTexture({
  /* bytesInLastRow: 7 widthInBlocks: 7 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 232 */
  offset: 232,
  bytesPerRow: 6656,
  buffer: buffer63,
}, {
  texture: texture61,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, {width: 7, height: 0, depthOrArrayLayers: 0});
} catch {}
let texture170 = device0.createTexture({
  size: {width: 95, height: 1, depthOrArrayLayers: 1},
  mipLevelCount: 4,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let textureView183 = texture130.createView({dimension: '2d', baseArrayLayer: 1});
try {
renderPassEncoder4.setBindGroup(3, bindGroup20);
} catch {}
try {
commandEncoder55.copyBufferToTexture({
  /* bytesInLastRow: 1232 widthInBlocks: 77 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 16 */
  offset: 16,
  buffer: buffer23,
}, {
  texture: texture165,
  mipLevel: 0,
  origin: {x: 24, y: 0, z: 0},
  aspect: 'all',
}, {width: 77, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer99 = device0.createBuffer({size: 14416, usage: GPUBufferUsage.MAP_READ, mappedAtCreation: false});
let commandBuffer14 = commandEncoder55.finish({});
let textureView184 = texture108.createView({
  label: '\u0f3e\u041f\u{1fa67}\u{1f794}\u{1fa99}\u{1f7d6}\u{1fbd8}\u036f\uce65\u52a2\uae5d',
  mipLevelCount: 1,
});
try {
computePassEncoder19.setBindGroup(0, bindGroup10, new Uint32Array(104), 18, 2);
} catch {}
try {
renderPassEncoder11.setBindGroup(0, bindGroup57);
} catch {}
try {
renderPassEncoder30.setBindGroup(2, bindGroup81, new Uint32Array(1321), 366, 0);
} catch {}
try {
device0.queue.submit([commandBuffer14]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture52,
  mipLevel: 0,
  origin: {x: 7, y: 0, z: 7},
  aspect: 'all',
}, new Uint8Array(12_894).fill(48), /* required buffer size: 12_894 */
{offset: 222, bytesPerRow: 64, rowsPerImage: 33}, {width: 15, height: 0, depthOrArrayLayers: 7});
} catch {}
let buffer100 = device0.createBuffer({size: 1760, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE});
let commandEncoder161 = device0.createCommandEncoder({});
let computePassEncoder136 = commandEncoder161.beginComputePass({label: '\u0934\u9c5d\u05e0\u{1f8e2}\u8f43\uf857\u0953\u050a\u85bf\uf678'});
let externalTexture24 = device0.importExternalTexture({source: videoFrame7, colorSpace: 'display-p3'});
try {
computePassEncoder129.setBindGroup(3, bindGroup91, new Uint32Array(323), 50, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder65); computePassEncoder65.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder32.setIndexBuffer(buffer5, 'uint32', 508, 83);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let buffer101 = device0.createBuffer({
  size: 39295,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture171 = device0.createTexture({
  label: '\u10d4\u0529\u7f9e\ufaea\u6159\u33e1\u{1fc06}',
  size: {width: 95, height: 1, depthOrArrayLayers: 31},
  mipLevelCount: 2,
  format: 'rg32sint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: [],
});
try {
{ clearResourceUsages(device0, computePassEncoder86); computePassEncoder86.dispatchWorkgroupsIndirect(buffer95, 5_604); };
} catch {}
let arrayBuffer11 = buffer91.getMappedRange(3144, 176);
try {
device0.queue.writeBuffer(buffer62, 288, new DataView(new ArrayBuffer(34)), 22, 4);
} catch {}
try {
navigator.gpu.getPreferredCanvasFormat();
} catch {}
document.body.prepend(img1);
let offscreenCanvas3 = new OffscreenCanvas(778, 42);
try {
adapter0.label = '\u{1f9c4}\u{1f83a}\ued82\uf869';
} catch {}
let bindGroup119 = device0.createBindGroup({layout: bindGroupLayout20, entries: [{binding: 50, resource: textureView15}]});
let sampler101 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 93.08,
  compare: 'not-equal',
  maxAnisotropy: 11,
});
try {
computePassEncoder114.setBindGroup(3, bindGroup55);
} catch {}
try {
computePassEncoder42.end();
} catch {}
try {
computePassEncoder133.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder48.setBindGroup(0, bindGroup45, []);
} catch {}
try {
renderPassEncoder12.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder31.setVertexBuffer(3, buffer28, 36, 5);
} catch {}
try {
commandEncoder47.copyBufferToBuffer(buffer64, 4968, buffer20, 1164, 108);
} catch {}
try {
computePassEncoder35.insertDebugMarker('\u5cfa');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData9,
  origin: { x: 0, y: 5 },
  flipY: false,
}, {
  texture: texture85,
  mipLevel: 0,
  origin: {x: 128, y: 0, z: 7},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder162 = device0.createCommandEncoder({});
let textureView185 = texture92.createView({dimension: 'cube', baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: 3});
try {
computePassEncoder106.setBindGroup(3, bindGroup30, []);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(2, buffer67, 24, 371);
} catch {}
try {
computePassEncoder135.pushDebugGroup('\ucf44');
} catch {}
try {
computePassEncoder135.popDebugGroup();
} catch {}
document.body.prepend(canvas0);
let texture172 = device0.createTexture({
  label: '\uce62\u1c17\uca87\ue533\u0d9c\u{1f9e5}\ub190',
  size: [3960, 1, 1],
  mipLevelCount: 2,
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder136.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder62.setBindGroup(0, bindGroup46);
} catch {}
try {
renderPassEncoder58.setBindGroup(0, bindGroup33, new Uint32Array(1965), 117, 0);
} catch {}
try {
renderPassEncoder62.executeBundles([renderBundle8]);
} catch {}
try {
commandEncoder47.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 1 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 1296 */
  offset: 1296,
  bytesPerRow: 4608,
  buffer: buffer68,
}, {
  texture: texture33,
  mipLevel: 0,
  origin: {x: 5, y: 0, z: 0},
  aspect: 'all',
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.append(canvas1);
let buffer102 = device0.createBuffer({
  size: 50120,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let querySet15 = device0.createQuerySet({type: 'occlusion', count: 364});
let texture173 = device0.createTexture({
  size: {width: 8, height: 8, depthOrArrayLayers: 143},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder64 = commandEncoder47.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: -14.03, g: 979.1, b: -492.2, a: 485.5, },
  loadOp: 'clear',
  storeOp: 'store',
}],
  maxDrawCount: 65279061,
});
try {
computePassEncoder105.setBindGroup(0, bindGroup12);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder105); computePassEncoder105.dispatchWorkgroups(1, 1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder105); computePassEncoder105.dispatchWorkgroupsIndirect(buffer87, 4_268); };
} catch {}
try {
computePassEncoder134.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder34.setBindGroup(0, bindGroup17, new Uint32Array(1835), 700, 0);
} catch {}
try {
renderPassEncoder32.setViewport(4.849387093727935, 3.750676723103778, 2.922871454606362, 3.0597403555973512, 0.6016516226852717, 0.7936273670431485);
} catch {}
try {
renderPassEncoder43.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext3.configure({device: device0, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, alphaMode: 'opaque'});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture47,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 6},
  aspect: 'all',
}, new Uint8Array(2_364).fill(157), /* required buffer size: 2_364 */
{offset: 42, bytesPerRow: 86, rowsPerImage: 9}, {width: 11, height: 0, depthOrArrayLayers: 4});
} catch {}
let buffer103 = device0.createBuffer({
  size: 13968,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder163 = device0.createCommandEncoder({label: '\u{1f984}\u09be'});
try {
renderPassEncoder12.setViewport(146.98095208856572, 1.1494790227744676, 16.026396395906588, 0.45583012269035195, 0.5051158588910811, 0.9974737563903981);
} catch {}
let pipeline4 = await device0.createComputePipelineAsync({layout: pipelineLayout10, compute: {module: shaderModule3, constants: {}}});
try {
externalTexture16.label = '\ua58e\u06fc\u2f21\ud37a';
} catch {}
let buffer104 = device0.createBuffer({
  label: '\uc14d\u066d\u{1f964}\ud53e\u6e82\u{1fc76}\u{1f8b5}\u5ad5',
  size: 896,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture174 = device0.createTexture({
  label: '\ud2b8\ue422\u2061',
  size: [95, 1, 31],
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView186 = texture17.createView({});
let computePassEncoder137 = commandEncoder162.beginComputePass({});
let renderPassEncoder65 = commandEncoder163.beginRenderPass({
  colorAttachments: [{
  view: textureView51,
  clearValue: { r: -809.9, g: 917.7, b: 350.9, a: -874.3, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 254437650,
});
try {
{ clearResourceUsages(device0, computePassEncoder86); computePassEncoder86.dispatchWorkgroups(1); };
} catch {}
try {
computePassEncoder65.end();
} catch {}
try {
computePassEncoder137.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder41.setVertexBuffer(7, buffer28, 16, 19);
} catch {}
try {
computePassEncoder76.insertDebugMarker('\u0d74');
} catch {}
try {
gpuCanvasContext1.configure({device: device0, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST, colorSpace: 'srgb'});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: videoFrame7,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture14,
  mipLevel: 0,
  origin: {x: 35, y: 0, z: 19},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup120 = device0.createBindGroup({layout: bindGroupLayout17, entries: [{binding: 400, resource: textureView123}]});
let pipelineLayout17 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandBuffer15 = commandEncoder74.finish({});
try {
renderPassEncoder16.setBindGroup(0, bindGroup45);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer18, 'uint16', 294, 160);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture121,
  mipLevel: 0,
  origin: {x: 40, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(317).fill(249), /* required buffer size: 317 */
{offset: 317}, {width: 20, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder164 = device0.createCommandEncoder({});
let textureView187 = texture172.createView({mipLevelCount: 1});
try {
computePassEncoder134.setBindGroup(0, bindGroup87, new Uint32Array(1008), 255, 0);
} catch {}
try {
renderPassEncoder20.setIndexBuffer(buffer10, 'uint16', 310, 2_253);
} catch {}
try {
commandEncoder164.copyBufferToTexture({
  /* bytesInLastRow: 3 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 2061 */
  offset: 2061,
  bytesPerRow: 14848,
  buffer: buffer55,
}, {
  texture: texture111,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder164.resolveQuerySet(querySet14, 562, 28, buffer104, 0);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'display-p3',
});
} catch {}
try {
device0.queue.submit([commandBuffer15]);
} catch {}
let imageData15 = new ImageData(52, 4);
let sampler102 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 95.69,
  lodMaxClamp: 97.10,
});
try {
computePassEncoder72.setBindGroup(1, bindGroup28);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder119); computePassEncoder119.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder27.executeBundles([renderBundle7]);
} catch {}
try {
renderPassEncoder43.setScissorRect(152, 0, 22, 0);
} catch {}
try {
commandEncoder164.copyBufferToTexture({
  /* bytesInLastRow: 400 widthInBlocks: 50 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 2872 */
  offset: 2872,
  buffer: buffer5,
}, {
  texture: texture153,
  mipLevel: 0,
  origin: {x: 92, y: 0, z: 0},
  aspect: 'all',
}, {width: 50, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.prepend(canvas3);
await gc();
let bindGroupLayout27 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 234,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba8uint', access: 'write-only', viewDimension: '3d' },
    },
    {binding: 86, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform', hasDynamicOffset: false }},
  ],
});
let texture175 = device0.createTexture({
  label: '\uf1af\u09f9\u0b7e\u0770\ud823\u00d3\u9a2c\u0b33\u98a1\u92c0\u{1f8ab}',
  size: {width: 1980, height: 1, depthOrArrayLayers: 11},
  dimension: '3d',
  format: 'rgba8uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder138 = commandEncoder164.beginComputePass({});
try {
computePassEncoder138.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder46.setIndexBuffer(buffer45, 'uint16', 194, 104);
} catch {}
try {
renderPassEncoder39.setPipeline(pipeline1);
} catch {}
let buffer105 = device0.createBuffer({size: 12479, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT});
let textureView188 = texture175.createView({dimension: '3d', baseMipLevel: 0});
let texture176 = gpuCanvasContext1.getCurrentTexture();
let textureView189 = texture143.createView({dimension: '2d-array', format: 'rgb10a2uint'});
try {
renderPassEncoder23.setBindGroup(0, bindGroup81);
} catch {}
try {
renderPassEncoder16.setBindGroup(2, bindGroup95, new Uint32Array(1068), 73, 0);
} catch {}
try {
renderPassEncoder53.setVertexBuffer(5, buffer49, 0, 63);
} catch {}
try {
computePassEncoder79.pushDebugGroup('\u095d');
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC,
  colorSpace: 'srgb',
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.writeBuffer(buffer17, 3988, new DataView(new ArrayBuffer(29)), 0, 0);
} catch {}
try {
gpuCanvasContext2.unconfigure();
} catch {}
let imageData16 = new ImageData(80, 24);
let buffer106 = device0.createBuffer({
  size: 21486,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let renderBundleEncoder20 = device0.createRenderBundleEncoder({colorFormats: ['rg32sint', 'rgb10a2uint', 'rgba16float'], sampleCount: 4, stencilReadOnly: true});
let sampler103 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  mipmapFilter: 'nearest',
  lodMaxClamp: 9.292,
  compare: 'always',
  maxAnisotropy: 1,
});
try {
computePassEncoder10.setBindGroup(0, bindGroup9, []);
} catch {}
try {
renderPassEncoder65.setVertexBuffer(3, buffer67, 76);
} catch {}
try {
buffer85.unmap();
} catch {}
document.body.prepend(canvas0);
let bindGroup121 = device0.createBindGroup({layout: bindGroupLayout13, entries: [{binding: 28, resource: textureView131}]});
try {
computePassEncoder124.setBindGroup(3, bindGroup14, new Uint32Array(9803), 1_939, 0);
} catch {}
try {
renderPassEncoder55.setBlendConstant({ r: 720.2, g: -618.3, b: 280.8, a: -807.4, });
} catch {}
try {
renderPassEncoder25.setPipeline(pipeline1);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
if (!arrayBuffer8.detached) { new Uint8Array(arrayBuffer8).fill(0x55); };
} catch {}
let renderBundle20 = renderBundleEncoder20.finish();
let externalTexture25 = device0.importExternalTexture({source: videoFrame8, colorSpace: 'srgb'});
try {
computePassEncoder105.setBindGroup(3, bindGroup38, new Uint32Array(3241), 91, 0);
} catch {}
try {
renderPassEncoder43.setBindGroup(1, bindGroup63, new Uint32Array(178), 10, 2);
} catch {}
try {
renderPassEncoder27.executeBundles([renderBundle2, renderBundle3]);
} catch {}
try {
renderPassEncoder38.setIndexBuffer(buffer106, 'uint32', 3_760, 1_564);
} catch {}
let buffer107 = device0.createBuffer({
  size: 7965,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
  mappedAtCreation: false,
});
try {
computePassEncoder133.setBindGroup(0, bindGroup87);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer32, 'uint32', 40, 280);
} catch {}
try {
renderPassEncoder42.setPipeline(pipeline2);
} catch {}
let gpuCanvasContext4 = offscreenCanvas3.getContext('webgpu');
let bindGroup122 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView42}]});
let buffer108 = device0.createBuffer({
  size: 16651,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder165 = device0.createCommandEncoder({label: '\u035a\u6582\uf00a\u647e\u3313\u6272\u028d\u{1f66a}\u{1fb8d}\u{1fbbc}'});
let querySet16 = device0.createQuerySet({type: 'occlusion', count: 285});
let computePassEncoder139 = commandEncoder165.beginComputePass({label: '\ua865\u0bfb\u384a'});
let sampler104 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 43.45,
  lodMaxClamp: 71.57,
  maxAnisotropy: 10,
});
try {
computePassEncoder90.setBindGroup(3, bindGroup91);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder61); computePassEncoder61.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder41.setIndexBuffer(buffer69, 'uint16', 9_242, 6_470);
} catch {}
try {
renderPassEncoder62.setPipeline(pipeline2);
} catch {}
let arrayBuffer12 = buffer91.getMappedRange(3408, 188);
try {
device0.queue.writeBuffer(buffer16, 4492, new Float32Array(9987), 238, 2648);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 95, height: 1, depthOrArrayLayers: 27}
*/
{
  source: imageBitmap1,
  origin: { x: 1, y: 11 },
  flipY: false,
}, {
  texture: texture54,
  mipLevel: 1,
  origin: {x: 5, y: 0, z: 3},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let videoFrame14 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt470bg', primaries: 'bt470m', transfer: 'smpteSt4281'} });
let texture177 = gpuCanvasContext3.getCurrentTexture();
try {
computePassEncoder134.setBindGroup(1, bindGroup102, new Uint32Array(1219), 221, 0);
} catch {}
try {
renderPassEncoder40.setPipeline(pipeline2);
} catch {}
try {
computePassEncoder79.popDebugGroup();
} catch {}
let gpuCanvasContext5 = offscreenCanvas2.getContext('webgpu');
let buffer109 = device0.createBuffer({
  label: '\u{1f813}\u721f\ue1b0\uc68e\u11d3\u{1fb7d}\u0c98\u052a\u990e\u06d9\u2dcf',
  size: 18485,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let textureView190 = texture87.createView({});
let textureView191 = texture32.createView({dimension: '2d', aspect: 'all', baseArrayLayer: 2});
let sampler105 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 99.19,
  maxAnisotropy: 2,
});
try {
computePassEncoder139.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer87, 'uint32', 1_400, 176);
} catch {}
try {
renderPassEncoder26.setVertexBuffer(2, buffer71, 0, 6_336);
} catch {}
let commandEncoder166 = device0.createCommandEncoder({});
let renderPassEncoder66 = commandEncoder166.beginRenderPass({
  colorAttachments: [{
  view: textureView127,
  clearValue: { r: 469.4, g: 900.4, b: -455.7, a: -124.5, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundleEncoder21 = device0.createRenderBundleEncoder({colorFormats: ['rg32sint', 'rgb10a2uint', 'rgba16float'], sampleCount: 4, depthReadOnly: true});
let renderBundle21 = renderBundleEncoder21.finish({label: '\udbbb\u{1ff4f}\ueda1'});
try {
computePassEncoder112.setBindGroup(2, bindGroup69, new Uint32Array(316), 48, 0);
} catch {}
try {
renderPassEncoder48.executeBundles([renderBundle10]);
} catch {}
try {
renderPassEncoder61.setIndexBuffer(buffer10, 'uint32', 352, 3_134);
} catch {}
try {
renderPassEncoder56.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder50.setVertexBuffer(4_294_967_294, undefined, 1_220_388_588);
} catch {}
document.body.append(canvas0);
let bindGroup123 = device0.createBindGroup({
  layout: bindGroupLayout2,
  entries: [{binding: 276, resource: textureView26}, {binding: 50, resource: textureView15}],
});
let buffer110 = device0.createBuffer({label: '\u6142\ue1bd\ua844\u87ce\u{1ff8a}\u{1fa34}\u3c04', size: 5331, usage: GPUBufferUsage.INDEX});
let textureView192 = texture141.createView({dimension: '2d', aspect: 'all', baseArrayLayer: 3});
let texture178 = device0.createTexture({
  size: [3960],
  dimension: '1d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder10.setBindGroup(3, bindGroup102);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder86); computePassEncoder86.dispatchWorkgroupsIndirect(buffer107, 4_760); };
} catch {}
try {
computePassEncoder61.end();
} catch {}
try {
renderPassEncoder56.setBindGroup(1, bindGroup24);
} catch {}
try {
renderPassEncoder38.setIndexBuffer(buffer74, 'uint32', 3_816, 282);
} catch {}
try {
buffer11.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture142,
  mipLevel: 0,
  origin: {x: 199, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(50).fill(208), /* required buffer size: 50 */
{offset: 50}, {width: 60, height: 0, depthOrArrayLayers: 0});
} catch {}
let canvas4 = document.createElement('canvas');
let bindGroupLayout28 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 40,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 129,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'depth', multisampled: false },
    },
    {
      binding: 51,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      texture: { viewDimension: 'cube', sampleType: 'unfilterable-float', multisampled: false },
    },
    {
      binding: 39,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rg32uint', access: 'write-only', viewDimension: '3d' },
    },
    {
      binding: 26,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rgba32float', access: 'write-only', viewDimension: '2d' },
    },
    {
      binding: 91,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
      externalTexture: {},
    },
  ],
});
let bindGroup124 = device0.createBindGroup({layout: bindGroupLayout10, entries: [{binding: 57, resource: textureView36}]});
let texture179 = device0.createTexture({
  label: '\u5f77\u{1ffdc}\u0a1f\u0676\u0625\ubc9e',
  size: {width: 47, height: 1, depthOrArrayLayers: 13},
  sampleCount: 1,
  dimension: '3d',
  format: 'rg32uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let texture180 = device0.createTexture({
  label: '\u0b72\u{1f75b}',
  size: {width: 2514, height: 48, depthOrArrayLayers: 1},
  mipLevelCount: 2,
  format: 'astc-6x6-unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView193 = texture39.createView({});
let computePassEncoder140 = commandEncoder70.beginComputePass({label: '\u{1fecc}\u7ec0\u0b94\u07da\uecd2\u{1f695}\u2648\u94d2'});
try {
computePassEncoder130.setBindGroup(3, bindGroup71);
} catch {}
try {
renderPassEncoder32.setBindGroup(2, bindGroup98);
} catch {}
try {
renderPassEncoder62.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder47.setIndexBuffer(buffer56, 'uint16', 896, 3_909);
} catch {}
try {
adapter0.label = '\uea32\u9f50\u{1f694}';
} catch {}
let shaderModule10 = device0.createShaderModule({
  code: `
diagnostic(info, xyz);

enable f16;

requires readonly_and_readwrite_storage_textures;

@group(0) @binding(487) var st12: texture_storage_3d<r32float, read_write>;

@group(0) @binding(89) var sam10: sampler;

@group(0) @binding(140) var st11: texture_storage_2d_array<r32sint, read_write>;

fn fn1() -> FragmentOutput8 {
  var out: FragmentOutput8;
  vp4.fract += f16(vp7.fract[1]);
  vp6 = vp6;
  vp4.fract -= buffer112[1];
  let vf252: vec3f = reflect(vec3f(unconst_f32(0.09617), unconst_f32(0.2495), unconst_f32(0.01020)), vec3f(unconst_f32(0.2701), unconst_f32(0.07385), unconst_f32(0.03598)));
  vp6 *= bitcast<vec2i>(vp8.fract.ar);
  let ptr66 = &vp7;
  vp4.whole = sqrt(asinh(vec3h(f16(clamp(i32(buffer112[1]), i32(unconst_i32(242)), bitcast<i32>((*ptr66).whole[1]))))).grgb)[2];
  out = FragmentOutput8(vec4f(f32(buffer112[1])));
  let ptr67 = &(*ptr66);
  let ptr68: ptr<private, vec2i> = &vp6;
  var vf253: vec2f = asinh(vec2f(f32(vp6[u32(unconst_u32(468))])));
  var vf254: vec3f = reflect(vec3f(unconst_f32(0.00644), unconst_f32(0.2053), unconst_f32(0.7952)), vec3f(unconst_f32(0.02707), unconst_f32(0.04495), unconst_f32(0.1151)));
  vp7.fract = vec4f(atan2(vec4f(vp5[1].fract)[3], f32(unconst_f32(0.01177))));
  let ptr69: ptr<uniform, f16> = &(*&buffer112)[1];
  vp4.fract = vec2h(unpack2x16unorm(u32(unconst_u32(76)))).x;
  out.f0 *= vec4f(bitcast<f32>((*ptr68)[0]));
  var vf255: vec3h = asinh(vec3h(unconst_f16(12147.8), unconst_f16(3143.5), unconst_f16(3748.4)));
  vf255 = vec3h(vp8.whole.bga);
  let vf256: vec3f = reflect(vp8.whole.arb, vec3f(unconst_f32(0.03895), unconst_f32(0.06764), unconst_f32(0.3053)));
  vp7 = modf(vec4f(f32(vp4.whole)));
  var vf257: u32 = countLeadingZeros(u32(unconst_u32(341)));
  let ptr70 = &(*ptr66);
  return out;
}

fn unconst_f32(v: f32) -> f32 { return v; }

var<private> vp6: vec2i = vec2i();

fn unconst_bool(v: bool) -> bool { return v; }

struct T0 {
  f0: array<u32>,
}

struct FragmentOutput8 {
  @location(0) f0: vec4f,
}

@group(0) @binding(359) var<uniform> buffer112: array<f16, 2>;

fn unconst_i32(v: i32) -> i32 { return v; }

struct FragmentOutput9 {
  @location(0) f0: vec4f,
}

@group(0) @binding(29) var st10: texture_storage_2d_array<rgba8uint, read>;

var<private> vp5 = array(modf(vec4h()), modf(vec4h()));

fn unconst_f16(v: f16) -> f16 { return v; }

@group(0) @binding(313) var tex1: texture_2d<f32>;

fn unconst_u32(v: u32) -> u32 { return v; }

@group(0) @binding(173) var<storage, read> buffer111: array<array<array<f16, 2>, 1>>;

struct VertexOutput6 {
  @location(8) f22: vec4f,
  @location(12) f23: u32,
  @location(3) f24: vec2f,
  @invariant @builtin(position) f25: vec4f,
}

var<private> vp8 = modf(vec4f());

fn fn0() -> array<array<array<array<array<array<f16, 1>, 2>, 1>, 2>, 1>, 1> {
  var out: array<array<array<array<array<array<f16, 1>, 2>, 1>, 2>, 1>, 1>;
  vp8.whole = vec4f(f32(buffer112[u32(unconst_u32(203))]));
  let ptr64: ptr<private, vec4h> = &vp5[1].fract;
  let ptr65 = &vp5[1];
  var vf251: vec3h = fma(vec3h((*&buffer112)[1]), vec3h(vp4.fract), vec3h(vp7.fract.xxx));
  return out;
}

@group(0) @binding(150) var tex0: texture_2d<f32>;

var<private> vp7 = modf(vec4f());

fn fn2() -> mat3x4h {
  var out: mat3x4h;
  let ptr71 = &vp5[1];
  return out;
}

var<private> vp4 = modf(f16());

@vertex @must_use
fn vertex11() -> VertexOutput6 {
  var out: VertexOutput6;
  out.f23 = bitcast<u32>(sin(vec2h(unconst_f16(1475.9), unconst_f16(3128.1))));
  var vf258 = fn1();
  out.f24 *= vp7.fract.ww;
  out.f22 = vec4f(f32(vp4.fract));
  fn0();
  var vf259 = fn2();
  var vf260 = fn2();
  var vf261 = fn0();
  var vf262 = fn0();
  let ptr72: ptr<function, array<array<array<array<array<f16, 1>, 2>, 1>, 2>, 1>> = &vf262[0];
  vp8 = modf(vec4f(f32((*ptr72)[0][1][0][1][0])));
  vf262[u32(vf262[0][0][1][0][1][0])][u32(vf262[0][0][1][0][u32(unconst_u32(20))][0])][u32(vf262[0][0][1][0][1][0])][u32(unconst_u32(188))][u32((*ptr72)[0][1][0][1][0])][bitcast<vec3u>(sinh(vec3f(unconst_f32(0.09554), unconst_f32(0.06569), unconst_f32(0.1361)))).g] = vf261[u32(unconst_u32(23))][0][1][0][1][0];
  vp4.whole += vec4h(asinh(vec4f(f32(vf262[0][0][1][0][1][0])))).r;
  var vf263: f16 = vf260[0][vec4u(vf260[2])[1]];
  let ptr73: ptr<function, array<array<array<array<f16, 1>, 2>, 1>, 2>> = &vf261[0][u32(vf262[0][0][1][0][1][0])];
  let ptr74: ptr<function, array<array<f16, 1>, 2>> = &(*ptr73)[1][0];
  let vf264: vec4f = unpack4x8unorm(u32(unconst_u32(1)));
  vp5[u32(unconst_u32(154))].fract = vec4h(vf263);
  let ptr75: ptr<function, array<f16, 1>> = &(*ptr72)[0][1][0][1];
  return out;
}

@fragment
fn fragment8() -> FragmentOutput8 {
  var out: FragmentOutput8;
  out.f0 = vec4f(firstTrailingBit(vec3u(unconst_u32(40), unconst_u32(49), unconst_u32(72))).grgr);
  var vf265 = fn0();
  textureStore(st12, vec3i(bitcast<i32>(pack2x16unorm(vp8.fract.zw))), vec4f(vec4f(f32(vf265[0][0][1][0][1][0]))));
  vp7 = modf(vp7.whole);
  vp5[pack4x8snorm(vp8.whole)].fract = vec4h(vp4.whole);
  vp5[1].whole *= reflect(vec2h((*&buffer112)[1]), vec2h(unconst_f16(2667.9), unconst_f16(33176.3))).rrrr;
  var vf266 = fn0();
  vp8 = modf(vec4f(vp5[1].fract));
  out.f0 = vec4f(f32(vf265[0][0][u32(unconst_u32(58))][0][1][0]));
  return out;
}

@fragment
fn fragment9() -> FragmentOutput9 {
  var out: FragmentOutput9;
  var vf267 = fn0();
  let ptr76: ptr<function, array<f16, 1>> = &vf267[0][0][1][0][1];
  let ptr77: ptr<function, f16> = &vf267[0][0][1][0][1][0];
  fn0();
  vp5[u32(unconst_u32(31))].fract = vec4h((*&buffer112)[1]);
  vp8.whole = vec4f(f32(vf267[0][0][1][0][1][0]));
  return out;
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup125 = device0.createBindGroup({
  label: '\ud4b9\u05c9\u0fff',
  layout: bindGroupLayout15,
  entries: [{binding: 45, resource: textureView64}],
});
let buffer113 = device0.createBuffer({size: 3699, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture181 = device0.createTexture({
  label: '\u2093\u7510\u{1fb2b}\u{1f968}\u{1fb9c}\u446d\uf793',
  size: {width: 190, height: 2, depthOrArrayLayers: 55},
  dimension: '3d',
  format: 'rg32uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let textureView194 = texture44.createView({arrayLayerCount: 10});
let renderBundleEncoder22 = device0.createRenderBundleEncoder({
  label: '\u0a43\u0677\ub891\u{1f9a7}\u{1fcca}\ubbbb\u74cf\u{1f9ec}',
  colorFormats: ['r8sint'],
  sampleCount: 1,
  depthReadOnly: true,
});
let sampler106 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 95.36,
  maxAnisotropy: 3,
});
try {
computePassEncoder72.setBindGroup(3, bindGroup39);
} catch {}
try {
computePassEncoder140.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder11.setBindGroup(2, bindGroup20);
} catch {}
try {
renderPassEncoder11.executeBundles([renderBundle5, renderBundle8, renderBundle13, renderBundle11]);
} catch {}
try {
renderBundleEncoder22.setBindGroup(2, bindGroup52, [1280, 0]);
} catch {}
try {
renderBundleEncoder22.setBindGroup(3, bindGroup1, new Uint32Array(1274), 34, 0);
} catch {}
try {
renderBundleEncoder22.setVertexBuffer(4, buffer30, 0);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
let bindGroup126 = device0.createBindGroup({
  label: '\u6e80\u0553\u{1fd4e}\ue8f9',
  layout: bindGroupLayout5,
  entries: [
    {binding: 150, resource: textureView183},
    {binding: 89, resource: sampler58},
    {binding: 29, resource: textureView32},
    {binding: 140, resource: textureView43},
    {binding: 173, resource: {buffer: buffer74, offset: 256, size: 788}},
    {binding: 487, resource: textureView44},
    {binding: 298, resource: {buffer: buffer9, offset: 0, size: 12}},
    {binding: 313, resource: textureView33},
    {binding: 359, resource: {buffer: buffer48, offset: 0}},
  ],
});
let textureView195 = texture181.createView({label: '\u09ab\u{1ffb7}\u77f6\uc72e'});
let texture182 = gpuCanvasContext1.getCurrentTexture();
let textureView196 = texture11.createView({baseMipLevel: 0, arrayLayerCount: 1});
let renderBundle22 = renderBundleEncoder22.finish();
try {
computePassEncoder126.setBindGroup(2, bindGroup60);
} catch {}
try {
computePassEncoder106.setBindGroup(1, bindGroup119, new Uint32Array(533), 88, 0);
} catch {}
try {
renderPassEncoder2.setBindGroup(1, bindGroup111, new Uint32Array(2295), 406, 0);
} catch {}
let bindGroup127 = device0.createBindGroup({
  layout: bindGroupLayout26,
  entries: [{binding: 50, resource: textureView131}, {binding: 145, resource: sampler4}],
});
let buffer114 = device0.createBuffer({
  size: 27960,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let sampler107 = device0.createSampler({addressModeU: 'clamp-to-edge', minFilter: 'nearest', lodMaxClamp: 77.13, compare: 'equal'});
try {
computePassEncoder117.setBindGroup(0, bindGroup6);
} catch {}
try {
renderPassEncoder58.setIndexBuffer(buffer28, 'uint16', 34, 25);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
document.body.prepend(canvas1);
let buffer115 = device0.createBuffer({
  size: 3345,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
  mappedAtCreation: false,
});
let commandEncoder167 = device0.createCommandEncoder({});
let textureView197 = texture77.createView({label: '\u{1f647}\u7e5f\u0e97\u8631', dimension: '2d-array', arrayLayerCount: 1});
let texture183 = device0.createTexture({
  size: {width: 190, height: 2, depthOrArrayLayers: 1},
  sampleCount: 4,
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder141 = commandEncoder167.beginComputePass({label: '\u07ba\u0675\uc658\u{1f637}\u94d1\uc426\ub35d\u0ae6\u8f7f'});
let renderBundleEncoder23 = device0.createRenderBundleEncoder({
  label: '\u0107\u{1fdf3}\uc415\u5524\u0796\u6709\u{1fcf0}\uc959\ucf63\u{1f96c}\u01aa',
  colorFormats: ['rg32sint', 'rgb10a2uint', 'rgba16float'],
  sampleCount: 4,
  depthReadOnly: true,
  stencilReadOnly: true,
});
try {
computePassEncoder119.end();
} catch {}
try {
computePassEncoder141.setPipeline(pipeline4);
} catch {}
try {
renderBundleEncoder23.setBindGroup(1, bindGroup87);
} catch {}
let buffer116 = device0.createBuffer({label: '\u41f7\u7681\u0971', size: 10656, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let commandEncoder168 = device0.createCommandEncoder({});
let textureView198 = texture179.createView({label: '\u8aa1\ubbf9\u6452\u3f8a\u8b78\u{1f7d0}\u89d8\ua635\u074c\u0d7f\u4fbe', arrayLayerCount: 1});
let textureView199 = texture60.createView({dimension: '3d', mipLevelCount: 1});
try {
computePassEncoder66.setBindGroup(1, bindGroup118);
} catch {}
try {
renderBundleEncoder23.setBindGroup(1, bindGroup85, new Uint32Array(830), 14, 0);
} catch {}
let arrayBuffer13 = buffer91.getMappedRange(3320, 8);
let imageBitmap3 = await createImageBitmap(imageData10);
let buffer117 = device0.createBuffer({size: 5803, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.STORAGE});
let textureView200 = texture111.createView({baseMipLevel: 0});
let computePassEncoder142 = commandEncoder168.beginComputePass({});
let renderPassEncoder67 = commandEncoder141.beginRenderPass({
  colorAttachments: [{view: textureView70, loadOp: 'clear', storeOp: 'discard'}],
  occlusionQuerySet: querySet14,
});
try {
computePassEncoder88.setBindGroup(0, bindGroup99, new Uint32Array(2494), 1_513, 0);
} catch {}
try {
computePassEncoder142.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder35.setVertexBuffer(4, buffer18, 0, 279);
} catch {}
try {
renderBundleEncoder23.setVertexBuffer(2, buffer37, 0, 117);
} catch {}
let texture184 = device0.createTexture({
  size: {width: 190},
  sampleCount: 1,
  dimension: '1d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let sampler108 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  lodMinClamp: 50.23,
  lodMaxClamp: 65.34,
  compare: 'less-equal',
});
try {
renderPassEncoder51.executeBundles([renderBundle9]);
} catch {}
try {
renderPassEncoder59.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder23.setVertexBuffer(1, buffer8, 0, 180);
} catch {}
try {
texture122.label = '\uef01\ue039\uf37b\u09e3\ubce8\u05ca\u{1fb01}';
} catch {}
let bindGroupLayout29 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 32,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      sampler: { type: 'filtering' },
    },
  ],
});
let texture185 = device0.createTexture({
  label: '\u{1fff6}\u0d33\u80ce\u9d12\u4314\u060f\uac3e\u0d6c',
  size: [1980, 1, 44],
  mipLevelCount: 2,
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView201 = texture75.createView({baseArrayLayer: 0});
try {
renderPassEncoder58.setBindGroup(0, bindGroup4);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 300, height: 150, depthOrArrayLayers: 1}
*/
{
  source: imageData13,
  origin: { x: 22, y: 0 },
  flipY: true,
}, {
  texture: texture161,
  mipLevel: 0,
  origin: {x: 180, y: 17, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 13, height: 7, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder50.setBindGroup(0, bindGroup76, []);
} catch {}
try {
renderPassEncoder47.setIndexBuffer(buffer35, 'uint32', 356, 757);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder35.setVertexBuffer(3, buffer36, 0);
} catch {}
try {
renderBundleEncoder23.setBindGroup(2, bindGroup102);
} catch {}
try {
renderBundleEncoder23.setVertexBuffer(5, buffer33, 0, 57);
} catch {}
try {
device0.queue.writeBuffer(buffer109, 1836, new BigUint64Array(30213), 10685, 652);
} catch {}
let promise17 = device0.queue.onSubmittedWorkDone();
try {
computePassEncoder105.end();
} catch {}
try {
computePassEncoder110.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder46.setIndexBuffer(buffer14, 'uint32', 2_896, 7_845);
} catch {}
try {
renderPassEncoder41.setPipeline(pipeline2);
} catch {}
try {
computePassEncoder22.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder55.setBindGroup(1, bindGroup17);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer29, 'uint32', 3_708, 1_200);
} catch {}
try {
renderBundleEncoder23.setBindGroup(1, bindGroup4);
} catch {}
try {
renderBundleEncoder23.setVertexBuffer(3, buffer81);
} catch {}
try {
commandEncoder122.copyBufferToTexture({
  /* bytesInLastRow: 415 widthInBlocks: 415 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 1190 */
  offset: 1190,
  bytesPerRow: 7424,
  buffer: buffer105,
}, {
  texture: texture83,
  mipLevel: 0,
  origin: {x: 127, y: 0, z: 0},
  aspect: 'all',
}, {width: 415, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder123.insertDebugMarker('\uc6fe');
} catch {}
let img4 = await imageWithData(166, 67, '#10101010', '#20202020');
let bindGroup128 = device0.createBindGroup({layout: bindGroupLayout8, entries: [{binding: 33, resource: externalTexture10}]});
let buffer118 = device0.createBuffer({
  size: 1166,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let textureView202 = texture175.createView({label: '\u{1ff2e}\u7d25\u0761\ufa96\u{1fdd3}\uff1a\u{1f8fc}\u0fbb\u0036\u9bd6'});
let textureView203 = texture153.createView({dimension: '2d', baseMipLevel: 0});
try {
computePassEncoder19.setBindGroup(2, bindGroup100);
} catch {}
try {
computePassEncoder86.end();
} catch {}
try {
renderPassEncoder4.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder23.setIndexBuffer(buffer21, 'uint16', 324, 2_193);
} catch {}
try {
commandEncoder122.copyBufferToBuffer(buffer13, 2200, buffer79, 132, 104);
} catch {}
try {
commandEncoder122.clearBuffer(buffer46, 3684, 5844);
} catch {}
try {
commandEncoder122.resolveQuerySet(querySet13, 131, 16, buffer82, 4352);
} catch {}
try {
device0.queue.writeBuffer(buffer59, 432, new BigUint64Array(3956), 84, 612);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture0,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(338).fill(145), /* required buffer size: 338 */
{offset: 118, bytesPerRow: 251}, {width: 110, height: 1, depthOrArrayLayers: 1});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: videoFrame10,
  origin: { x: 0, y: 0 },
  flipY: false,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup129 = device0.createBindGroup({
  layout: bindGroupLayout16,
  entries: [
    {binding: 345, resource: textureView104},
    {binding: 402, resource: {buffer: buffer13, offset: 2304}},
    {binding: 53, resource: textureView91},
    {binding: 3, resource: textureView106},
    {binding: 668, resource: {buffer: buffer65, offset: 13056}},
    {binding: 327, resource: sampler57},
    {binding: 41, resource: {buffer: buffer64, offset: 3328}},
    {binding: 416, resource: sampler79},
    {binding: 62, resource: sampler48},
  ],
});
let commandEncoder169 = device0.createCommandEncoder();
let texture186 = device0.createTexture({
  size: [495, 1, 516],
  mipLevelCount: 5,
  dimension: '3d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
});
let textureView204 = texture111.createView({mipLevelCount: 1});
let sampler109 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  mipmapFilter: 'nearest',
  lodMaxClamp: 99.69,
});
try {
computePassEncoder3.setBindGroup(2, bindGroup92);
} catch {}
try {
renderPassEncoder41.executeBundles([renderBundle11]);
} catch {}
try {
renderPassEncoder60.setIndexBuffer(buffer50, 'uint32', 244, 77);
} catch {}
try {
commandEncoder41.clearBuffer(buffer84, 156, 184);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture11,
  mipLevel: 0,
  origin: {x: 14, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(554).fill(134), /* required buffer size: 554 */
{offset: 74, bytesPerRow: 20, rowsPerImage: 24}, {width: 1, height: 0, depthOrArrayLayers: 2});
} catch {}
let commandEncoder170 = device0.createCommandEncoder({});
let textureView205 = texture56.createView({dimension: '2d'});
try {
computePassEncoder62.setBindGroup(0, bindGroup16);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder10); computePassEncoder10.dispatchWorkgroupsIndirect(buffer22, 1_636); };
} catch {}
try {
renderPassEncoder35.setBindGroup(1, bindGroup59);
} catch {}
try {
renderPassEncoder51.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder23.setIndexBuffer(buffer114, 'uint16', 170, 1_982);
} catch {}
let promise18 = device0.queue.onSubmittedWorkDone();
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let shaderModule11 = device0.createShaderModule({
  code: `
requires packed_4x8_integer_dot_product;

enable f16;

struct VertexOutput7 {
  @invariant @builtin(position) f26: vec4f,
}

fn unconst_f16(v: f16) -> f16 { return v; }

var<private> vp9: mat2x3f = mat2x3f();

fn fn0(a0: array<array<VertexOutput7, 1>, 6>) -> mat3x3h {
  var out: mat3x3h;
  out -= mat3x3h(pow(vec2h(unconst_f16(6404.9), unconst_f16(10969.4)), vec2h(unconst_f16(19488.9), unconst_f16(1771.4))).yxy, pow(vec2h(unconst_f16(6404.9), unconst_f16(10969.4)), vec2h(unconst_f16(19488.9), unconst_f16(1771.4))).yxy, pow(vec2h(unconst_f16(6404.9), unconst_f16(10969.4)), vec2h(unconst_f16(19488.9), unconst_f16(1771.4))).xxx);
  let vf268: vec3f = refract(vec3f(vp9[1][0]), bitcast<vec3f>(extractBits(vec3u(transpose(mat4x3h(unconst_f16(-224.0), unconst_f16(12567.6), unconst_f16(2430.1), unconst_f16(-10895.1), unconst_f16(25334.8), unconst_f16(1624.6), unconst_f16(1631.0), unconst_f16(-36218.4), unconst_f16(6819.6), unconst_f16(1858.7), unconst_f16(351.8), unconst_f16(10059.1)))[2].rag), vec3u(vp9[1]).y, u32(vp9[1][u32(unconst_u32(141))]))), f32(unconst_f32(0.2387)));
  var vf269: vec2f = unpack2x16float(u32(a0[5][0].f26.z));
  vf269 += bitcast<vec2f>(reverseBits(vec3u(a0[5][0].f26.grb)).yy);
  vf269 = vec2f(ceil(vec2h(unconst_f16(12829.8), unconst_f16(-7030.9))));
  vp9 -= mat2x3f(vec3f(ceil(bitcast<vec2h>(inverseSqrt(bitcast<f32>(insertBits(bitcast<vec4i>(a0[5][u32(unconst_u32(12))].f26), vec4i(bitcast<i32>(inverseSqrt(f32(unconst_f32(0.00561))))), u32(unconst_u32(297)), u32(unconst_u32(381)))[1])))).xyx), vec3f(ceil(bitcast<vec2h>(inverseSqrt(bitcast<f32>(insertBits(bitcast<vec4i>(a0[5][u32(unconst_u32(12))].f26), vec4i(bitcast<i32>(inverseSqrt(f32(unconst_f32(0.00561))))), u32(unconst_u32(297)), u32(unconst_u32(381)))[1])))).xxx));
  vf269 -= vp9[u32(unconst_u32(56))].gb;
  let ptr78: ptr<private, vec3f> = &vp9[1];
  let vf270: array<VertexOutput7, 1> = a0[5];
  let vf271: f32 = length(f32(unconst_f32(0.00646)));
  out = mat3x3h(f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]), f16(vp9[1][bitcast<u32>(length(vp9[1][0]))]));
  var vf272: array<array<VertexOutput7, 1>, 6> = a0;
  var vf273: f32 = a0[5][0].f26[u32(unconst_u32(24))];
  let vf274: VertexOutput7 = a0[5][0];
  out = mat3x3h(f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]), f16(vf269[1]));
  return out;
}

@group(0) @binding(182) var sam11: sampler;

struct FragmentOutput10 {
  @builtin(sample_mask) f0: u32,
  @location(1) @interpolate(flat, sample) f1: vec4i,
  @location(0) @interpolate(flat, center) f2: vec4f,
}

fn unconst_u32(v: u32) -> u32 { return v; }

@group(0) @binding(48) var st13: texture_storage_2d_array<r32float, read_write>;

fn unconst_f32(v: f32) -> f32 { return v; }

var<workgroup> vw25: atomic<i32>;

struct T0 {
  @size(8) f0: array<u32>,
}

struct T1 {
  @align(1) @size(32) f0: array<u32>,
}

fn unconst_bool(v: bool) -> bool { return v; }

fn fn1() -> VertexOutput7 {
  var out: VertexOutput7;
  var vf275 = fn0(array<array<VertexOutput7, 1>, 6>(array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(radians(vec4h(unconst_f16(304.0), unconst_f16(578.4), unconst_f16(1952.9), unconst_f16(17675.7))).b)))))));
  var vf276 = fn0(array<array<VertexOutput7, 1>, 6>(array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(log(f32(unconst_f32(0.02990))))))));
  out.f26 += floor(vec2f(unconst_f32(0.05591), unconst_f32(0.4489))).gggg;
  var vf277 = fn0(array<array<VertexOutput7, 1>, 6>(array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1)))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(exp2(vec4h(unconst_f16(9421.8), unconst_f16(17981.5), unconst_f16(621.0), unconst_f16(15315.1))))))));
  var vf278: f32 = distance(vec2f(unconst_f32(-0.8497), unconst_f32(0.06026)), vec2f(distance(vec2f(unconst_f32(-0.07776), unconst_f32(0.1073)), vec2f(unconst_f32(0.00060), unconst_f32(0.1039)))));
  out = VertexOutput7(vec4f(select(vec4<bool>(vp9[0].zxzy), vec4<bool>(countLeadingZeros(vec3u(unconst_u32(247), unconst_u32(37), unconst_u32(34))).gbrb), bool(cos(vec3f(vf275[2])).y))));
  let ptr79: ptr<function, mat3x3h> = &vf275;
  var vf279 = fn0(array<array<VertexOutput7, 1>, 6>(array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1]))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1]))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1]))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1]))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1]))))), array<VertexOutput7, 1>(VertexOutput7(vec4f(f32(ceil(vf277[2][1])))))));
  var vf280: vec3h = vf279[u32(unconst_u32(67))];
  vf275 = mat3x3h(exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]), exp2(vf275[2][u32(vf277[pack4xU8Clamp(vec4u(exp2(vec4h(unconst_f16(1167.8), unconst_f16(1313.3), unconst_f16(13776.4), unconst_f16(10617.0)))))][u32(unconst_u32(179))])]));
  return out;
}

var<workgroup> vw24: atomic<u32>;

fn unconst_i32(v: i32) -> i32 { return v; }

@vertex
fn vertex12() -> VertexOutput7 {
  var out: VertexOutput7;
  var vf281 = fn1();
  var vf282 = fn1();
  fn1();
  out.f26 += vec4f(vp9[u32(acos(vec4h(unconst_f16(-3388.4), unconst_f16(424.9), unconst_f16(28384.7), unconst_f16(10869.9))).z)][u32(unconst_u32(239))]);
  let ptr80: ptr<function, vec4f> = &vf282.f26;
  var vf283 = fn1();
  out.f26 = vec4f(countLeadingZeros(vec4i(unconst_i32(57), unconst_i32(26), unconst_i32(324), unconst_i32(161))));
  let ptr81: ptr<function, VertexOutput7> = &vf283;
  var vf284 = fn1();
  fn1();
  var vf285: bool = all(vec4<bool>(all(vec4<bool>(vf284.f26))));
  fn0(array<array<VertexOutput7, 1>, 6>(array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953))))), array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953))))), array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953))))), array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953))))), array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953))))), array<VertexOutput7, 1>(VertexOutput7(quantizeToF16(vec4f(unconst_f32(0.07340), unconst_f32(0.01823), unconst_f32(-0.3679), unconst_f32(0.3953)))))));
  var vf286 = fn1();
  vf283.f26 = vec4f(f32(vf285));
  vf281.f26 = vec4f(vf281.f26[3]);
  vf286.f26 = vf281.f26;
  vf281.f26 = vf282.f26;
  fn1();
  var vf287: f32 = vf284.f26[3];
  var vf288 = fn1();
  return out;
}

@fragment
fn fragment10(@location(8) a0: vec4f) -> FragmentOutput10 {
  var out: FragmentOutput10;
  let vf289: vec2u = textureDimensions(st13);
  fn1();
  fn1();
  textureStore(st13, bitcast<vec2i>(textureLoad(st13, bitcast<vec2i>(vf289), i32(unconst_i32(132))).bg), i32(vp9[u32(unconst_u32(118))][bitcast<vec3u>(vp9[pack2x16float(sqrt(vec2f(f32(vf289[1]))))]).y]), vec4f(vec4f(unconst_f32(0.3863), unconst_f32(0.2583), unconst_f32(0.4598), unconst_f32(0.09398))));
  out.f2 *= bitcast<vec4f>(textureDimensions(st13).yxxy);
  textureStore(st13, vec2i(unconst_i32(178), unconst_i32(287)), i32(vp9[1][u32(vp9[1][u32(unconst_u32(76))])]), vec4f(vec4f(unconst_f32(0.1955), unconst_f32(0.3997), unconst_f32(0.1470), unconst_f32(0.1361))));
  fn1();
  vp9 -= mat2x3f(vec3f(extractBits(vec2i(unconst_i32(165), unconst_i32(-436)), u32(unconst_u32(503)), vf289[1]).xxx), bitcast<vec3f>(extractBits(vec2i(unconst_i32(165), unconst_i32(-436)), u32(unconst_u32(503)), vf289[1]).ggr));
  fn1();
  out.f0 += vf289[1];
  fn1();
  let vf290: u32 = vf289[u32(unconst_u32(52))];
  vp9 = mat2x3f(f32(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))), bitcast<f32>(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))), f32(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))), bitcast<f32>(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))), bitcast<f32>(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))), f32(insertBits(u32(unconst_u32(330)), u32(unconst_u32(279)), u32(vp9[u32(unconst_u32(187))].z), bitcast<u32>(vp9[1][1]))));
  return out;
}`,
  sourceMap: {},
});
let renderPassEncoder68 = commandEncoder41.beginRenderPass({colorAttachments: [{view: textureView48, loadOp: 'load', storeOp: 'discard'}]});
let renderBundle23 = renderBundleEncoder23.finish();
try {
renderPassEncoder20.setViewport(20.187447345548282, 0.6046804255336748, 73.04865915481642, 0.36146806289533107, 0.9896315445312417, 0.9920935509311638);
} catch {}
try {
commandEncoder169.copyBufferToTexture({
  /* bytesInLastRow: 3 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 484 */
  offset: 484,
  rowsPerImage: 2368,
  buffer: buffer115,
}, {
  texture: texture61,
  mipLevel: 1,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
let computePassEncoder143 = commandEncoder169.beginComputePass({});
let sampler110 = device0.createSampler({
  label: '\u001e\u9c93\u033c\u0aac',
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  lodMaxClamp: 54.32,
});
try {
computePassEncoder10.end();
} catch {}
try {
commandEncoder122.copyBufferToTexture({
  /* bytesInLastRow: 56 widthInBlocks: 7 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 584 */
  offset: 584,
  rowsPerImage: 15,
  buffer: buffer8,
}, {
  texture: texture88,
  mipLevel: 3,
  origin: {x: 22, y: 0, z: 0},
  aspect: 'all',
}, {width: 7, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup130 = device0.createBindGroup({
  label: '\u7c7c\u{1f8cb}\u6e0f\ue652\u{1f9d0}\u09ea\u{1fa91}\u{1fba6}',
  layout: bindGroupLayout21,
  entries: [{binding: 285, resource: {buffer: buffer42, offset: 768}}, {binding: 125, resource: textureView75}],
});
let commandEncoder171 = device0.createCommandEncoder();
try {
computePassEncoder143.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder26.setBindGroup(2, bindGroup8, new Uint32Array(1324), 86, 0);
} catch {}
try {
renderPassEncoder47.setStencilReference(485);
} catch {}
try {
renderPassEncoder23.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder53.setVertexBuffer(4, buffer21, 10_812, 1_065);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData16,
  origin: { x: 0, y: 2 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 14, y: 0, z: 26},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 8, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData17 = new ImageData(4, 8);
let bindGroup131 = device0.createBindGroup({layout: bindGroupLayout25, entries: [{binding: 124, resource: textureView75}]});
let texture187 = device0.createTexture({
  size: [8, 8, 15],
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
let textureView206 = texture88.createView({
  label: '\u129f\u2665\u4223\u{1fc2f}\u0ca6\u38b6\u01ee\ud13f',
  dimension: '2d',
  mipLevelCount: 1,
  baseArrayLayer: 5,
  arrayLayerCount: 1,
});
let computePassEncoder144 = commandEncoder122.beginComputePass();
try {
renderPassEncoder57.setIndexBuffer(buffer23, 'uint32', 64, 2_943);
} catch {}
try {
commandEncoder170.copyBufferToTexture({
  /* bytesInLastRow: 426 widthInBlocks: 213 aspectSpecificFormat.texelBlockSize: 2 */
  /* end: 2684 */
  offset: 2684,
  bytesPerRow: 100352,
  buffer: buffer14,
}, {
  texture: texture0,
  mipLevel: 0,
  origin: {x: 43, y: 4, z: 1},
  aspect: 'all',
}, {width: 213, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData15,
  origin: { x: 10, y: 0 },
  flipY: true,
}, {
  texture: texture62,
  mipLevel: 0,
  origin: {x: 397, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 9, height: 0, depthOrArrayLayers: 0});
} catch {}
let computePassEncoder145 = commandEncoder171.beginComputePass({});
try {
renderPassEncoder29.setBindGroup(3, bindGroup56);
} catch {}
try {
renderPassEncoder66.executeBundles([renderBundle9, renderBundle10, renderBundle14]);
} catch {}
try {
renderPassEncoder4.setIndexBuffer(buffer10, 'uint32', 184, 7_741);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
buffer55.unmap();
} catch {}
let gpuCanvasContext6 = canvas4.getContext('webgpu');
let commandBuffer16 = commandEncoder15.finish({});
let textureView207 = texture97.createView({baseArrayLayer: 25, arrayLayerCount: 4});
let sampler111 = device0.createSampler({
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 72.51,
  lodMaxClamp: 93.50,
  maxAnisotropy: 5,
});
try {
computePassEncoder144.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder58.setBindGroup(2, bindGroup120, new Uint32Array(2214), 414, 0);
} catch {}
try {
renderPassEncoder36.setIndexBuffer(buffer69, 'uint16', 426, 10_900);
} catch {}
await gc();
let bindGroup132 = device0.createBindGroup({layout: bindGroupLayout9, entries: [{binding: 357, resource: textureView47}]});
let texture188 = device0.createTexture({
  size: {width: 495, height: 1, depthOrArrayLayers: 18},
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
});
let computePassEncoder146 = commandEncoder170.beginComputePass({});
let sampler112 = device0.createSampler({
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 44.42,
  lodMaxClamp: 81.22,
  compare: 'greater-equal',
  maxAnisotropy: 11,
});
try {
computePassEncoder45.setBindGroup(0, bindGroup40);
} catch {}
try {
computePassEncoder145.setPipeline(pipeline4);
} catch {}
try {
buffer117.unmap();
} catch {}
let buffer119 = device0.createBuffer({
  size: 24855,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture189 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 110},
  mipLevelCount: 1,
  dimension: '3d',
  format: 'rg32sint',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView208 = texture98.createView({aspect: 'depth-only', mipLevelCount: 1});
let sampler113 = device0.createSampler({
  label: '\u8fc2\u0dd1\u82bc',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  lodMaxClamp: 95.46,
});
try {
computePassEncoder74.setBindGroup(3, bindGroup85);
} catch {}
try {
computePassEncoder146.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder63.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder43.setVertexBuffer(0, buffer37, 128, 530);
} catch {}
let promise19 = device0.queue.onSubmittedWorkDone();
let bindGroup133 = device0.createBindGroup({
  label: '\ue997\u464b\uf7a2',
  layout: bindGroupLayout5,
  entries: [
    {binding: 89, resource: sampler31},
    {binding: 359, resource: {buffer: buffer107, offset: 768, size: 408}},
    {binding: 487, resource: textureView45},
    {binding: 313, resource: textureView183},
    {binding: 298, resource: {buffer: buffer114, offset: 6144, size: 4652}},
    {binding: 29, resource: textureView68},
    {binding: 173, resource: {buffer: buffer29, offset: 1024, size: 128}},
    {binding: 150, resource: textureView17},
    {binding: 140, resource: textureView194},
  ],
});
let buffer120 = device0.createBuffer({
  size: 6617,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX,
});
let commandEncoder172 = device0.createCommandEncoder();
let textureView209 = texture99.createView({
  label: '\ub49b\u{1fdcd}\u2729\u87ef\u0f42\u1fad\ubca2\u7b7f\uddf4\u{1fd9a}\u{1f878}',
  dimension: '2d-array',
  baseMipLevel: 0,
  baseArrayLayer: 0,
});
let texture190 = device0.createTexture({
  label: '\u1951\ufd51\u0c76\u9d10\u016d',
  size: {width: 8, height: 8, depthOrArrayLayers: 15},
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
let sampler114 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  lodMinClamp: 81.25,
  lodMaxClamp: 94.42,
  maxAnisotropy: 1,
});
try {
computePassEncoder137.setBindGroup(3, bindGroup121, new Uint32Array(1961), 49, 0);
} catch {}
try {
buffer10.unmap();
} catch {}
try {
  await promise19;
} catch {}
await gc();
let buffer121 = device0.createBuffer({size: 213, usage: GPUBufferUsage.MAP_WRITE, mappedAtCreation: false});
let texture191 = device0.createTexture({
  size: [47, 1, 13],
  mipLevelCount: 1,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder147 = commandEncoder172.beginComputePass({});
try {
computePassEncoder113.setBindGroup(3, bindGroup47, new Uint32Array(2222), 98, 0);
} catch {}
try {
computePassEncoder147.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder66.setBindGroup(3, bindGroup51, [512, 0]);
} catch {}
try {
renderPassEncoder41.setIndexBuffer(buffer30, 'uint32', 540, 640);
} catch {}
try {
buffer85.unmap();
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: canvas2,
  origin: { x: 25, y: 27 },
  flipY: true,
}, {
  texture: texture59,
  mipLevel: 0,
  origin: {x: 15, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder173 = device0.createCommandEncoder();
let computePassEncoder148 = commandEncoder173.beginComputePass({label: '\u3deb\u0257\u0df2\ua535\u{1f6d3}\u09b3\u0de9\u0fb4\u099e'});
let sampler115 = device0.createSampler({
  label: '\u93c9\u0798\u07e9\ued98\u680f\u05fa\uac77\u83a6',
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 24.72,
  lodMaxClamp: 71.31,
  compare: 'less-equal',
});
try {
renderPassEncoder25.setPipeline(pipeline1);
} catch {}
try {
computePassEncoder66.setBindGroup(2, bindGroup23);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder117); computePassEncoder117.dispatchWorkgroupsIndirect(buffer22, 4_736); };
} catch {}
try {
computePassEncoder148.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder57.setBindGroup(3, bindGroup57, new Uint32Array(2137), 102, 0);
} catch {}
try {
renderPassEncoder55.setVertexBuffer(1, buffer30, 776, 738);
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
  colorSpace: 'display-p3',
});
} catch {}
let textureView210 = texture11.createView({});
try {
computePassEncoder102.setBindGroup(2, bindGroup56);
} catch {}
try {
computePassEncoder147.setBindGroup(2, bindGroup22, new Uint32Array(136), 32, 0);
} catch {}
try {
computePassEncoder117.end();
} catch {}
try {
renderPassEncoder37.setBindGroup(2, bindGroup125);
} catch {}
try {
renderPassEncoder30.setVertexBuffer(6, buffer118, 320);
} catch {}
try {
buffer52.unmap();
} catch {}
let imageData18 = new ImageData(72, 40);
let bindGroup134 = device0.createBindGroup({
  layout: bindGroupLayout4,
  entries: [
    {binding: 7, resource: {buffer: buffer108, offset: 2560, size: 1363}},
    {binding: 569, resource: textureView100},
    {binding: 171, resource: textureView196},
  ],
});
let textureView211 = texture165.createView({dimension: '2d-array', format: 'rgba32float', mipLevelCount: 1, arrayLayerCount: 1});
let computePassEncoder149 = commandEncoder139.beginComputePass({label: '\u{1fc54}\ud3f7\u654f\u94c2\u3974'});
let renderBundleEncoder24 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: false});
let sampler116 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMaxClamp: 81.24,
  maxAnisotropy: 6,
});
let texture192 = device0.createTexture({
  size: [95, 1, 1],
  mipLevelCount: 3,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let sampler117 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  lodMinClamp: 62.05,
  lodMaxClamp: 83.88,
});
try {
computePassEncoder46.setBindGroup(1, bindGroup100);
} catch {}
try {
computePassEncoder149.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder61.setBindGroup(2, bindGroup67);
} catch {}
try {
renderPassEncoder48.beginOcclusionQuery(11);
} catch {}
try {
renderPassEncoder35.setIndexBuffer(buffer73, 'uint16', 188, 738);
} catch {}
try {
renderPassEncoder55.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder24.setPipeline(pipeline2);
} catch {}
try {
renderBundleEncoder24.setVertexBuffer(5, buffer18, 0, 398);
} catch {}
try {
device0.queue.submit([commandBuffer16]);
} catch {}
try {
if (!arrayBuffer10.detached) { new Uint8Array(arrayBuffer10).fill(0x55); };
} catch {}
let shaderModule12 = device0.createShaderModule({
  code: `
diagnostic(info, xyz);

requires unrestricted_pointer_parameters;

enable f16;

var<workgroup> vw28: FragmentOutput11;

override override8: i32;

var<workgroup> vw41: array<atomic<u32>, 1>;

var<workgroup> vw42: array<FragmentOutput11, 7>;

fn fn0(a0: FragmentOutput11) -> mat3x3h {
  var out: mat3x3h;
  var vf291: FragmentOutput11 = a0;
  vp11.f2 ^= bitcast<i32>(a0.f0);
  var vf292: vec4f = max(vec4f(unconst_f32(0.2350), unconst_f32(0.1917), unconst_f32(0.03802), unconst_f32(-0.3243)), vec4f(unconst_f32(0.2805), unconst_f32(0.2390), unconst_f32(0.02448), unconst_f32(0.2424)));
  let vf293: f32 = vp12[2][u32(unconst_u32(144))];
  let ptr82: ptr<private, i32> = &vp14.exp;
  vp11 = FragmentOutput11(u32(vp15[33].whole), i32(vp15[33].whole), i32(vp15[33].whole));
  let vf294: f32 = vp12[2][u32(unconst_u32(107))];
  let ptr83: ptr<private, i32> = &vp11.f2;
  let ptr84 = &vp15[u32(override7)];
  let ptr85: ptr<function, vec4f> = &vf292;
  var vf295: f32 = vp13[1][u32(unconst_u32(159))];
  let ptr86: ptr<function, i32> = &vf291.f1;
  vf295 = bitcast<f32>(vp11.f1);
  let ptr87: ptr<function, i32> = &vf291.f2;
  let vf296: vec4u = extractBits(vec4u(u32((*ptr84).fract)), u32(unconst_u32(9)), u32(unconst_u32(171)));
  let ptr88: ptr<private, f16> = &vp10[18].fract;
  vf292 -= (*ptr85);
  let ptr89 = &vp14;
  vp14 = frexp(f16((*ptr86)));
  return out;
  _ = override7;
}

var<private> vp11: FragmentOutput11 = FragmentOutput11(u32(), i32(), i32());

var<workgroup> vw31: mat3x2f;

var<workgroup> vw33: vec2<bool>;

fn unconst_i32(v: i32) -> i32 { return v; }

@id(10039) override override7: f16 = 838.3;

var<workgroup> vw26: array<FragmentOutput11, 1>;

struct FragmentOutput11 {
  @builtin(sample_mask) f0: u32,
  @location(1) f1: i32,
  @location(0) f2: i32,
}

var<private> vp13: mat2x4f = mat2x4f();

var<workgroup> vw35: FragmentOutput11;

var<workgroup> vw29: vec2h;

@group(0) @binding(182) var sam12: sampler;

fn unconst_u32(v: u32) -> u32 { return v; }

var<private> vp15 = array(modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()));

var<workgroup> vw30: array<vec2i, 6>;

fn unconst_f32(v: f32) -> f32 { return v; }

@id(43625) override override6: u32;

alias vec3b = vec3<bool>;

var<private> vp12: mat3x2f = mat3x2f();

var<private> vp14 = frexp(f16());

var<private> vp10 = array(modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()), modf(f16()));

var<workgroup> vw39: atomic<i32>;

fn unconst_bool(v: bool) -> bool { return v; }

var<workgroup> vw40: vec2u;

@group(0) @binding(48) var st14: texture_storage_2d_array<r32float, read_write>;

@id(52957) override override9: f16;

var<workgroup> vw32: FragmentOutput11;

var<workgroup> vw37: array<FragmentOutput11, 8>;

var<workgroup> vw36: mat3x2h;

var<workgroup> vw38: FragmentOutput11;

var<workgroup> vw27: array<vec2i, 28>;

fn unconst_f16(v: f16) -> f16 { return v; }

struct T0 {
  @size(16) f0: array<u32>,
}

var<workgroup> vw34: mat2x3h;

var<private> vp16: array<u32, 30> = array<u32, 30>(u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32(), u32());

@vertex
fn vertex13(@location(7) a0: vec4i) -> @builtin(position) vec4f {
  var out: vec4f;
  fn0(FragmentOutput11(pack2x16float(vp12[1]), bitcast<vec2i>(vp12[0]).y, i32(vp12[1][1])));
  fn0(FragmentOutput11(pack4xU8Clamp(vec4u(a0)), a0[2], a0[0]));
  let ptr90: ptr<private, u32> = &vp11.f0;
  vp15[u32(unconst_u32(4))].whole = vp15[33].whole;
  vp15[bitcast<u32>(pow(f32(vp14.fract), vec4f(radians(vec4h(unconst_f16(24156.0), unconst_f16(-2574.6), unconst_f16(18108.2), unconst_f16(15676.5)))).w))] = modf(f16(vp12[u32(unconst_u32(41))][u32(abs(vec3h(unconst_f16(-17200.9), unconst_f16(10549.4), unconst_f16(9596.2)))[2])]));
  fn0(FragmentOutput11(vp16[u32(vp10[vp16[29]].fract)], bitcast<i32>(vp16[u32(vp10[vp16[29]].fract)]), i32(vp16[u32(vp10[vp16[29]].fract)])));
  out = vec4f(f32(override9));
  vp16[u32(vp15[33].whole)] = override6;
  return out;
  _ = override6;
  _ = override9;
  _ = override7;
}

@vertex
fn vertex14() -> @builtin(position) vec4f {
  var out: vec4f;
  var vf297: i32 = override8;
  vp15[u32(vp10[18].fract)].fract = vec4h(vp13[1]).a;
  vf297 |= vec2i(unpack2x16unorm(u32(vp10[u32(unconst_u32(84))].fract)))[0];
  fn0(FragmentOutput11(u32(vp14.exp), vp14.exp, vp14.exp));
  let vf298: f32 = vp13[u32(unconst_u32(95))][u32(vp11.f1)];
  let vf299: u32 = pack2x16unorm(vec2f(unconst_f32(0.02883), unconst_f32(0.1969)));
  vp11.f1 = vp14.exp;
  vp16[u32(vp12[0].g)] += vf299;
  var vf300 = fn0(FragmentOutput11(vp16[29], i32(vp16[29]), i32(vp16[29])));
  vp14.fract *= vp14.fract;
  return out;
  _ = override8;
  _ = override7;
}

@fragment
fn fragment11() -> FragmentOutput11 {
  var out: FragmentOutput11;
  var vf301: u32 = textureNumLayers(st14);
  out.f1 -= i32(vp10[18].fract);
  let ptr91: ptr<private, u32> = &vp16[29];
  var vf302 = fn0(FragmentOutput11(u32(exp2(vec4f(unconst_f32(0.08142), unconst_f32(0.1696), unconst_f32(0.07901), unconst_f32(0.6419)))[1]), vec4i(exp2(vec4f(unconst_f32(0.08142), unconst_f32(0.1696), unconst_f32(0.07901), unconst_f32(0.6419)))).y, vec4i(exp2(vec4f(unconst_f32(0.08142), unconst_f32(0.1696), unconst_f32(0.07901), unconst_f32(0.6419))))[3]));
  vp11.f1 -= i32(vp10[u32(unpack2x16float(pack4xU8Clamp(bitcast<vec4u>(vp13[1])))[0])].whole);
  out.f1 ^= vp11.f2;
  return out;
  _ = override7;
}

@compute @workgroup_size(1, 1, 2)
fn compute11(@builtin(local_invocation_id) a0: vec3u) {
  let ptr92: ptr<private, i32> = &vp14.exp;
  vw30[u32(unconst_u32(264))] *= vec2i((*&vw28).f1);
  let vf303: f32 = determinant(mat2x2f(unconst_f32(-0.4344), unconst_f32(0.1944), unconst_f32(0.04607), unconst_f32(-0.1076)));
}`,
  sourceMap: {},
  hints: {},
});
let bindGroup135 = device0.createBindGroup({
  layout: bindGroupLayout0,
  entries: [{binding: 182, resource: sampler76}, {binding: 48, resource: textureView4}],
});
let textureView212 = texture50.createView({dimension: '2d', baseArrayLayer: 2});
let renderBundle24 = renderBundleEncoder24.finish({});
let sampler118 = device0.createSampler({
  label: '\u341c\ua035',
  addressModeU: 'repeat',
  addressModeV: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 3.633,
  lodMaxClamp: 33.95,
});
try {
renderPassEncoder66.setBindGroup(2, bindGroup24);
} catch {}
try {
renderPassEncoder48.endOcclusionQuery();
} catch {}
let arrayBuffer14 = buffer91.getMappedRange(3600, 384);
try {
gpuCanvasContext6.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  alphaMode: 'opaque',
});
} catch {}
document.body.prepend(img2);
let bindGroupLayout30 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 71,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'uint', multisampled: false },
    },
    {
      binding: 244,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
  ],
});
let buffer122 = device0.createBuffer({
  size: 4344,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture193 = device0.createTexture({
  size: [380],
  sampleCount: 1,
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_SRC,
  viewFormats: [],
});
try {
renderPassEncoder17.setIndexBuffer(buffer11, 'uint16', 32, 100);
} catch {}
try {
renderPassEncoder61.setPipeline(pipeline2);
} catch {}
offscreenCanvas0.width = 122;
let textureView213 = texture35.createView({format: 'r32float'});
let sampler119 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 68.71,
  lodMaxClamp: 78.56,
});
try {
renderPassEncoder62.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder63.setVertexBuffer(0, buffer49, 0, 146);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let arrayBuffer15 = buffer91.getMappedRange(3328, 0);
try {
computePassEncoder84.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder34.setBindGroup(0, bindGroup94);
} catch {}
try {
renderPassEncoder67.setBindGroup(0, bindGroup92, new Uint32Array(363), 162, 0);
} catch {}
try {
renderPassEncoder20.executeBundles([renderBundle2]);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 3960, height: 1, depthOrArrayLayers: 1}
*/
{
  source: canvas2,
  origin: { x: 33, y: 115 },
  flipY: true,
}, {
  texture: texture117,
  mipLevel: 0,
  origin: {x: 393, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 17, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await promise17;
} catch {}
let bindGroup136 = device0.createBindGroup({
  layout: bindGroupLayout12,
  entries: [
    {binding: 146, resource: textureView60},
    {binding: 187, resource: {buffer: buffer29, offset: 3584, size: 2316}},
    {binding: 92, resource: textureView85},
    {binding: 4, resource: {buffer: buffer52, offset: 0, size: 44}},
    {binding: 100, resource: {buffer: buffer117, offset: 1024, size: 1680}},
  ],
});
let textureView214 = texture124.createView({});
let sampler120 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  lodMinClamp: 61.07,
  lodMaxClamp: 82.38,
});
try {
computePassEncoder103.setBindGroup(3, bindGroup89);
} catch {}
try {
computePassEncoder38.setBindGroup(2, bindGroup44, new Uint32Array(3736), 319, 0);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: img3,
  origin: { x: 20, y: 3 },
  flipY: true,
}, {
  texture: texture85,
  mipLevel: 0,
  origin: {x: 8, y: 0, z: 1},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup137 = device0.createBindGroup({
  label: '\u02d3\u970a\u0e02\uef3c\u1156',
  layout: bindGroupLayout15,
  entries: [{binding: 45, resource: textureView116}],
});
let buffer123 = device0.createBuffer({
  label: '\u44a8\u{1fd9f}\uc832\u096a\u07d6\u{1fa71}\uf014\u2473',
  size: 7380,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX,
});
let commandEncoder174 = device0.createCommandEncoder({});
let computePassEncoder150 = commandEncoder174.beginComputePass({});
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData11,
  origin: { x: 0, y: 1 },
  flipY: true,
}, {
  texture: texture54,
  mipLevel: 0,
  origin: {x: 10, y: 0, z: 9},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 27, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder150.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder49.setBlendConstant({ r: -405.0, g: -385.1, b: 693.3, a: 871.0, });
} catch {}
try {
  await promise18;
} catch {}
await gc();
let bindGroupLayout31 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 31,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.VERTEX,
      buffer: { type: 'read-only-storage', hasDynamicOffset: false },
    },
  ],
});
let buffer124 = device0.createBuffer({
  size: 19515,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder175 = device0.createCommandEncoder();
let textureView215 = texture144.createView({arrayLayerCount: 1});
try {
renderPassEncoder63.setBindGroup(0, bindGroup27);
} catch {}
try {
renderPassEncoder26.setVertexBuffer(6, buffer118);
} catch {}
try {
buffer39.unmap();
} catch {}
try {
commandEncoder175.copyBufferToTexture({
  /* bytesInLastRow: 528 widthInBlocks: 132 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1168 */
  offset: 1168,
  buffer: buffer54,
}, {
  texture: texture143,
  mipLevel: 0,
  origin: {x: 30, y: 0, z: 0},
  aspect: 'all',
}, {width: 132, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext5.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture2,
  mipLevel: 0,
  origin: {x: 302, y: 0, z: 21},
  aspect: 'all',
}, new Uint8Array(168_500).fill(20), /* required buffer size: 168_500 */
{offset: 16, bytesPerRow: 577, rowsPerImage: 73}, {width: 142, height: 0, depthOrArrayLayers: 5});
} catch {}
let imageBitmap4 = await createImageBitmap(canvas1);
let buffer125 = device0.createBuffer({
  size: 6108,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let computePassEncoder151 = commandEncoder175.beginComputePass({});
try {
computePassEncoder92.setBindGroup(2, bindGroup76);
} catch {}
try {
computePassEncoder97.setBindGroup(0, bindGroup19, new Uint32Array(1262), 81, 0);
} catch {}
try {
computePassEncoder151.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder42.setBindGroup(3, bindGroup43, []);
} catch {}
let commandEncoder176 = device0.createCommandEncoder();
let texture194 = device0.createTexture({
  size: {width: 402, height: 405, depthOrArrayLayers: 1},
  sampleCount: 1,
  format: 'astc-6x5-unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView216 = texture179.createView({});
let computePassEncoder152 = commandEncoder176.beginComputePass({});
let sampler121 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 54.79,
  lodMaxClamp: 84.21,
});
try {
{ clearResourceUsages(device0, computePassEncoder97); computePassEncoder97.dispatchWorkgroupsIndirect(buffer105, 296); };
} catch {}
try {
renderPassEncoder2.setBindGroup(2, bindGroup125, new Uint32Array(1084), 67, 0);
} catch {}
try {
renderPassEncoder49.setIndexBuffer(buffer28, 'uint16', 38, 27);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroup138 = device0.createBindGroup({layout: bindGroupLayout3, entries: [{binding: 433, resource: textureView9}]});
let commandEncoder177 = device0.createCommandEncoder({});
let textureView217 = texture181.createView({});
try {
computePassEncoder84.setBindGroup(0, bindGroup111);
} catch {}
try {
computePassEncoder152.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder32.setBindGroup(2, bindGroup50, new Uint32Array(229), 19, 0);
} catch {}
try {
commandEncoder177.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 218 */
  offset: 218,
  rowsPerImage: 94,
  buffer: buffer107,
}, {
  texture: texture20,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let textureView218 = texture59.createView({mipLevelCount: 1, baseArrayLayer: 0});
let computePassEncoder153 = commandEncoder177.beginComputePass();
try {
computePassEncoder124.setBindGroup(2, bindGroup55);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder97); computePassEncoder97.dispatchWorkgroupsIndirect(buffer41, 180); };
} catch {}
try {
computePassEncoder25.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder34.beginOcclusionQuery(100);
} catch {}
try {
renderPassEncoder34.endOcclusionQuery();
} catch {}
try {
renderPassEncoder53.setVertexBuffer(6, buffer28, 32, 150);
} catch {}
try {
device0.lost.then(({reason, message}) => { log('device0 lost!'); log(message, reason); });
} catch {}
let promise20 = device0.queue.onSubmittedWorkDone();
try {
  await promise20;
} catch {}
let textureView219 = texture138.createView({dimension: '1d'});
try {
{ clearResourceUsages(device0, computePassEncoder97); computePassEncoder97.dispatchWorkgroups(1, 2); };
} catch {}
try {
computePassEncoder153.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder20.setBindGroup(3, bindGroup1);
} catch {}
try {
buffer49.unmap();
} catch {}
let textureView220 = texture16.createView({dimension: '2d', mipLevelCount: 1});
let sampler122 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 96.98,
  lodMaxClamp: 97.70,
  maxAnisotropy: 2,
});
try {
computePassEncoder127.setBindGroup(2, bindGroup126, [1536, 0]);
} catch {}
try {
renderPassEncoder66.setViewport(381.38057631583956, 0.7662540054813508, 226.28277544698162, 0.0554622338269939, 0.04574479499666151, 0.9562111346129276);
} catch {}
try {
renderPassEncoder57.setVertexBuffer(0, buffer30, 500, 900);
} catch {}
let bindGroup139 = device0.createBindGroup({
  layout: bindGroupLayout14,
  entries: [
    {binding: 154, resource: {buffer: buffer32, offset: 768, size: 260}},
    {binding: 570, resource: textureView97},
  ],
});
let commandEncoder178 = device0.createCommandEncoder({});
let computePassEncoder154 = commandEncoder178.beginComputePass({label: '\ue8b8\u{1f7e5}\uffdb\u0b72\u{1fc6d}\uda3e\u38ec\ue7f7\u{1fda5}'});
try {
computePassEncoder90.setBindGroup(0, bindGroup40);
} catch {}
try {
computePassEncoder154.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder36.setBindGroup(0, bindGroup22, new Uint32Array(926), 151, 0);
} catch {}
try {
renderPassEncoder54.setScissorRect(181, 0, 953, 0);
} catch {}
try {
gpuCanvasContext6.unconfigure();
} catch {}
let bindGroup140 = device0.createBindGroup({layout: bindGroupLayout15, entries: [{binding: 45, resource: textureView108}]});
try {
renderPassEncoder17.setBindGroup(3, bindGroup62);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
let commandEncoder179 = device0.createCommandEncoder({});
let texture195 = device0.createTexture({
  size: {width: 3960, height: 1, depthOrArrayLayers: 8},
  mipLevelCount: 3,
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder97.end();
} catch {}
try {
renderPassEncoder37.setBindGroup(1, bindGroup125, []);
} catch {}
let commandEncoder180 = device0.createCommandEncoder({});
let texture196 = device0.createTexture({
  size: [495],
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder155 = commandEncoder180.beginComputePass();
let externalTexture26 = device0.importExternalTexture({source: videoFrame14});
try {
computePassEncoder11.setBindGroup(0, bindGroup14, new Uint32Array(111), 49, 0);
} catch {}
try {
renderPassEncoder64.setBindGroup(1, bindGroup118);
} catch {}
let buffer126 = device0.createBuffer({
  size: 3862,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM,
});
let commandEncoder181 = device0.createCommandEncoder({label: '\u9701\u0d16\u53fa\u{1f6f3}\u{1fd1f}\u96dc\u{1f6a0}\u1795\udfa5\u0ed1'});
let texture197 = device0.createTexture({
  size: [3960, 1, 1],
  mipLevelCount: 3,
  sampleCount: 1,
  format: 'rgba16float',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder156 = commandEncoder181.beginComputePass();
try {
computePassEncoder115.setBindGroup(0, bindGroup102);
} catch {}
try {
computePassEncoder155.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder12.setBindGroup(3, bindGroup119);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(6, buffer36, 0);
} catch {}
try {
commandEncoder80.copyBufferToTexture({
  /* bytesInLastRow: 0 widthInBlocks: 0 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 807 */
  offset: 807,
  buffer: buffer22,
}, {
  texture: texture79,
  mipLevel: 1,
  origin: {x: 8, y: 0, z: 0},
  aspect: 'all',
}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let commandBuffer17 = commandEncoder80.finish({});
let textureView221 = texture175.createView({});
let computePassEncoder157 = commandEncoder179.beginComputePass({label: '\u250c\uf5f5\u0ca8\ub005\uba17\u0163\u0568\ufb76\u{1fb99}\u5565'});
let sampler123 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 56.03,
  lodMaxClamp: 86.03,
});
try {
computePassEncoder130.setBindGroup(3, bindGroup111, new Uint32Array(1130), 111, 0);
} catch {}
try {
renderPassEncoder62.setPipeline(pipeline2);
} catch {}
let sampler124 = device0.createSampler({
  label: '\ufea3\uebb7\u849e\u038b\u68c4\ud7c7\u013b\u00e8\uc58e\u0e9b\u{1fc73}',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 84.09,
  lodMaxClamp: 91.27,
  compare: 'always',
});
try {
computePassEncoder91.setBindGroup(3, bindGroup91, new Uint32Array(60), 34, 0);
} catch {}
try {
computePassEncoder91.end();
} catch {}
try {
renderPassEncoder39.setBindGroup(3, bindGroup131);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageBitmap4,
  origin: { x: 9, y: 31 },
  flipY: false,
}, {
  texture: texture89,
  mipLevel: 0,
  origin: {x: 17, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 39, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup141 = device0.createBindGroup({
  layout: bindGroupLayout28,
  entries: [
    {binding: 91, resource: externalTexture26},
    {binding: 39, resource: textureView217},
    {binding: 40, resource: {buffer: buffer93, offset: 2048, size: 1304}},
    {binding: 26, resource: textureView82},
    {binding: 129, resource: textureView91},
    {binding: 51, resource: textureView15},
  ],
});
let computePassEncoder158 = commandEncoder12.beginComputePass();
try {
computePassEncoder158.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder61.setBindGroup(1, bindGroup73, new Uint32Array(1074), 182, 0);
} catch {}
try {
renderPassEncoder12.setVertexBuffer(2, buffer27, 712);
} catch {}
try {
device0.pushErrorScope('validation');
} catch {}
try {
renderPassEncoder37.insertDebugMarker('\ud548');
} catch {}
let imageData19 = new ImageData(12, 132);
let bindGroup142 = device0.createBindGroup({
  label: '\u1e5f\ubaf8\u0fff\u1fbd\ua7cc\u4ee1\u{1fb95}\u{1f8cf}\u0873\ue611\u{1f663}',
  layout: bindGroupLayout15,
  entries: [{binding: 45, resource: textureView162}],
});
let texture198 = device0.createTexture({
  size: [3960],
  mipLevelCount: 1,
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler125 = device0.createSampler({
  addressModeU: 'clamp-to-edge',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  maxAnisotropy: 15,
});
try {
computePassEncoder133.setBindGroup(3, bindGroup108, new Uint32Array(451), 70, 0);
} catch {}
try {
renderPassEncoder45.setBindGroup(3, bindGroup22);
} catch {}
try {
renderPassEncoder45.setIndexBuffer(buffer5, 'uint32', 1_016, 193);
} catch {}
try {
buffer63.unmap();
} catch {}
let buffer127 = device0.createBuffer({
  size: 6376,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let commandEncoder182 = device0.createCommandEncoder({});
let querySet17 = device0.createQuerySet({label: '\ude8d\ubfa1\u0448\uf23c\uddd0', type: 'occlusion', count: 805});
let textureView222 = texture59.createView({format: 'rgba32float', mipLevelCount: 1});
let renderPassEncoder69 = commandEncoder182.beginRenderPass({
  colorAttachments: [{
  view: textureView128,
  clearValue: { r: -170.4, g: 547.0, b: -910.0, a: -655.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 99537169,
});
let sampler126 = device0.createSampler({
  label: '\u{1fe93}\u898e\u02e5\u{1ffca}\u0bc5\u5008\u0df4\u31b1\u3765\u{1fe60}',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 33.94,
  lodMaxClamp: 92.24,
  maxAnisotropy: 2,
});
try {
computePassEncoder5.setBindGroup(2, bindGroup90, new Uint32Array(537), 74, 0);
} catch {}
try {
renderPassEncoder14.setBindGroup(3, bindGroup132);
} catch {}
try {
device0.queue.submit([commandBuffer17]);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 1}
*/
{
  source: imageData13,
  origin: { x: 38, y: 1 },
  flipY: false,
}, {
  texture: texture165,
  mipLevel: 1,
  origin: {x: 54, y: 1, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 14, height: 0, depthOrArrayLayers: 0});
} catch {}
let img5 = await imageWithData(46, 15, '#10101010', '#20202020');
try {
computePassEncoder157.setPipeline(pipeline4);
} catch {}
await gc();
let textureView223 = texture64.createView({baseArrayLayer: 3, arrayLayerCount: 4});
try {
computePassEncoder113.setBindGroup(3, bindGroup95, new Uint32Array(3219), 492, 0);
} catch {}
try {
computePassEncoder156.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder20.setBindGroup(2, bindGroup99);
} catch {}
try {
renderPassEncoder42.executeBundles([renderBundle2, renderBundle6, renderBundle0, renderBundle3]);
} catch {}
try {
renderPassEncoder2.setPipeline(pipeline2);
} catch {}
try {
buffer69.unmap();
} catch {}
try {
gpuCanvasContext6.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  colorSpace: 'srgb',
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture102,
  mipLevel: 0,
  origin: {x: 9, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(364).fill(52), /* required buffer size: 364 */
{offset: 364}, {width: 25, height: 0, depthOrArrayLayers: 0});
} catch {}
let imageData20 = new ImageData(32, 20);
let externalTexture27 = device0.importExternalTexture({label: '\ufb46\ucf3c\uf332\u9e6b', source: videoFrame12});
try {
computePassEncoder33.setBindGroup(0, bindGroup78);
} catch {}
try {
renderPassEncoder11.setVertexBuffer(4, buffer124, 360, 4_783);
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
  alphaMode: 'premultiplied',
});
} catch {}
let texture199 = device0.createTexture({
  label: '\u0b43\ue056\u3538',
  size: {width: 47},
  dimension: '1d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let sampler127 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'repeat',
  magFilter: 'nearest',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMaxClamp: 86.07,
});
try {
renderPassEncoder26.setPipeline(pipeline1);
} catch {}
let sampler128 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 20.32,
  lodMaxClamp: 85.89,
  maxAnisotropy: 10,
});
try {
computePassEncoder11.setBindGroup(2, bindGroup68, new Uint32Array(1293), 582, 1);
} catch {}
try {
renderPassEncoder69.setBlendConstant({ r: 629.4, g: -716.3, b: 417.7, a: -114.7, });
} catch {}
try {
renderPassEncoder20.setPipeline(pipeline2);
} catch {}
try {
buffer84.unmap();
} catch {}
try {
device0.queue.writeBuffer(buffer86, 3124, new DataView(new ArrayBuffer(24133)), 3624, 836);
} catch {}
let commandEncoder183 = device0.createCommandEncoder();
let texture200 = device0.createTexture({
  size: {width: 190, height: 2, depthOrArrayLayers: 19},
  mipLevelCount: 2,
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder55.setBindGroup(2, bindGroup81, new Uint32Array(153), 5, 0);
} catch {}
try {
renderPassEncoder58.setBindGroup(2, bindGroup13);
} catch {}
try {
renderPassEncoder42.executeBundles([renderBundle6]);
} catch {}
try {
renderPassEncoder56.setIndexBuffer(buffer18, 'uint32', 176, 154);
} catch {}
try {
commandEncoder183.copyTextureToTexture({
  texture: texture9,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture9,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
},
{width: 990, height: 1, depthOrArrayLayers: 0});
} catch {}
try {
computePassEncoder131.setBindGroup(0, bindGroup19);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroups(1); };
} catch {}
try {
renderPassEncoder63.setBindGroup(1, bindGroup89, new Uint32Array(1046), 144, 0);
} catch {}
try {
renderPassEncoder59.setIndexBuffer(buffer65, 'uint16', 5_094, 25_176);
} catch {}
try {
commandEncoder183.copyBufferToTexture({
  /* bytesInLastRow: 220 widthInBlocks: 55 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1160 */
  offset: 1160,
  bytesPerRow: 1536,
  rowsPerImage: 94,
  buffer: buffer7,
}, {
  texture: texture58,
  mipLevel: 0,
  origin: {x: 0, y: 29, z: 0},
  aspect: 'all',
}, {width: 55, height: 6, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
offscreenCanvas0.width = 602;
try {
adapter0.label = '\u8d87\u{1fff5}\ue7fa\u05c0\u{1f88a}';
} catch {}
let commandEncoder184 = device0.createCommandEncoder({});
let textureView224 = texture64.createView({dimension: 'cube-array', baseArrayLayer: 2, arrayLayerCount: 6});
let sampler129 = device0.createSampler({
  label: '\u0895\ub60b',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 48.04,
  lodMaxClamp: 68.76,
  maxAnisotropy: 5,
});
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroupsIndirect(buffer12, 16); };
} catch {}
try {
renderPassEncoder35.executeBundles([renderBundle9, renderBundle10, renderBundle10]);
} catch {}
try {
renderPassEncoder43.setVertexBuffer(6, buffer21, 2_796, 1_768);
} catch {}
let arrayBuffer16 = buffer78.getMappedRange(0, 756);
try {
commandEncoder183.resolveQuerySet(querySet1, 166, 312, buffer46, 1536);
} catch {}
let pipelineLayout18 = device0.createPipelineLayout({bindGroupLayouts: []});
let commandEncoder185 = device0.createCommandEncoder({});
let texture201 = device0.createTexture({
  size: [3960],
  dimension: '1d',
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroups(1); };
} catch {}
try {
buffer10.unmap();
} catch {}
try {
commandEncoder183.copyBufferToBuffer(buffer104, 72, buffer20, 1632, 160);
} catch {}
let bindGroup143 = device0.createBindGroup({
  label: '\u193a\u6803\u7f7f\u{1f8dc}\u236c\uee86',
  layout: bindGroupLayout17,
  entries: [{binding: 400, resource: textureView123}],
});
let renderBundleEncoder25 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true, stencilReadOnly: true});
try {
computePassEncoder114.setBindGroup(2, bindGroup90, []);
} catch {}
try {
renderPassEncoder42.setIndexBuffer(buffer45, 'uint16', 350, 9);
} catch {}
try {
renderBundleEncoder25.setBindGroup(3, bindGroup4, new Uint32Array(5876), 624, 0);
} catch {}
try {
renderBundleEncoder25.setIndexBuffer(buffer50, 'uint32', 60, 2);
} catch {}
try {
renderBundleEncoder25.setVertexBuffer(1, buffer43, 24, 2_762);
} catch {}
try {
commandEncoder183.copyBufferToBuffer(buffer3, 1064, buffer67, 780, 164);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture86,
  mipLevel: 0,
  origin: {x: 10, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(502_926).fill(175), /* required buffer size: 502_926 */
{offset: 96, bytesPerRow: 5587, rowsPerImage: 90}, {width: 349, height: 0, depthOrArrayLayers: 2});
} catch {}
let textureView225 = texture41.createView({mipLevelCount: 1, arrayLayerCount: 3});
let renderBundle25 = renderBundleEncoder25.finish({});
try {
computePassEncoder157.setBindGroup(2, bindGroup124);
} catch {}
try {
renderPassEncoder33.setBindGroup(1, bindGroup72, new Uint32Array(4929), 2_301, 0);
} catch {}
try {
renderPassEncoder41.setViewport(2412.1365218756705, 0.8280458980426324, 1465.5886593866273, 0.16062321627488121, 0.21748890330605186, 0.28356613456407687);
} catch {}
try {
renderPassEncoder53.setVertexBuffer(3, buffer35, 508, 1_467);
} catch {}
try {
buffer66.unmap();
} catch {}
try {
computePassEncoder142.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder64.setBindGroup(2, bindGroup42, new Uint32Array(983), 45, 0);
} catch {}
let arrayBuffer17 = buffer78.getMappedRange(760, 2188);
try {
commandEncoder185.copyBufferToTexture({
  /* bytesInLastRow: 16 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 3916 */
  offset: 3916,
  bytesPerRow: 6400,
  buffer: buffer3,
}, {
  texture: texture11,
  mipLevel: 0,
  origin: {x: 50, y: 0, z: 1},
  aspect: 'all',
}, {width: 4, height: 0, depthOrArrayLayers: 1});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
await gc();
let imageData21 = new ImageData(12, 16);
let videoFrame15 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'bt2020-cl', primaries: 'bt470m', transfer: 'log'} });
let commandEncoder186 = device0.createCommandEncoder({label: '\u8cc5\u{1fc83}\u07ef\u8bb2\u0463\u7763\u9703\u{1fa19}\u0d82\u0b3a\u0f04'});
let texture202 = device0.createTexture({
  size: [190],
  dimension: '1d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING,
});
let textureView226 = texture111.createView({baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: 0, arrayLayerCount: 1});
try {
renderPassEncoder58.setBindGroup(0, bindGroup51, [0, 0]);
} catch {}
try {
commandEncoder183.copyTextureToBuffer({
  texture: texture99,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'stencil-only',
}, {
  /* bytesInLastRow: 95 widthInBlocks: 95 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 300 */
  offset: 300,
  bytesPerRow: 15104,
  buffer: buffer60,
}, {width: 95, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer85, 780, new DataView(new ArrayBuffer(1020)), 56, 108);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 95, height: 1, depthOrArrayLayers: 27}
*/
{
  source: img4,
  origin: { x: 21, y: 0 },
  flipY: true,
}, {
  texture: texture75,
  mipLevel: 0,
  origin: {x: 4, y: 0, z: 4},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 20, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup144 = device0.createBindGroup({
  layout: bindGroupLayout11,
  entries: [{binding: 295, resource: textureView135}, {binding: 76, resource: textureView75}],
});
let texture203 = device0.createTexture({
  size: {width: 990, height: 1, depthOrArrayLayers: 9},
  mipLevelCount: 2,
  dimension: '2d',
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
});
let textureView227 = texture13.createView({format: 'r8sint', baseMipLevel: 0, mipLevelCount: 1, arrayLayerCount: 3});
try {
computePassEncoder92.setBindGroup(0, bindGroup19);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder92); computePassEncoder92.dispatchWorkgroupsIndirect(buffer101, 3_708); };
} catch {}
try {
renderPassEncoder48.setBindGroup(0, bindGroup104, new Uint32Array(4944), 2_174, 0);
} catch {}
try {
renderPassEncoder53.setBlendConstant({ r: -360.4, g: 289.2, b: 972.6, a: -977.1, });
} catch {}
try {
renderPassEncoder52.setPipeline(pipeline1);
} catch {}
try {
commandEncoder186.copyBufferToTexture({
  /* bytesInLastRow: 7848 widthInBlocks: 981 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 2912 */
  offset: 2912,
  buffer: buffer107,
}, {
  texture: texture156,
  mipLevel: 0,
  origin: {x: 88, y: 0, z: 0},
  aspect: 'all',
}, {width: 981, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder184.resolveQuerySet(querySet11, 1, 0, buffer119, 4864);
} catch {}
let imageData22 = new ImageData(8, 132);
let buffer128 = device0.createBuffer({
  label: '\u9c3a\u0067\u3eb5\ubb37\u0e98',
  size: 38576,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let commandEncoder187 = device0.createCommandEncoder();
let sampler130 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  magFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 3.572,
  lodMaxClamp: 61.24,
});
try {
computePassEncoder83.setBindGroup(3, bindGroup46, new Uint32Array(125), 3, 0);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroupsIndirect(buffer8, 1_860); };
} catch {}
try {
renderPassEncoder68.setBindGroup(0, bindGroup118, new Uint32Array(1052), 91, 0);
} catch {}
try {
renderPassEncoder58.setPipeline(pipeline2);
} catch {}
try {
commandEncoder185.copyBufferToBuffer(buffer115, 2088, buffer52, 560, 28);
} catch {}
try {
commandEncoder185.copyTextureToTexture({
  texture: texture199,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture87,
  mipLevel: 0,
  origin: {x: 38, y: 0, z: 4},
  aspect: 'all',
},
{width: 1, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext3.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture163,
  mipLevel: 1,
  origin: {x: 16, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(1_480).fill(99), /* required buffer size: 1_480 */
{offset: 184, bytesPerRow: 72, rowsPerImage: 18}, {width: 1, height: 0, depthOrArrayLayers: 2});
} catch {}
try {
globalThis.someLabel = externalTexture5.label;
} catch {}
let textureView228 = texture184.createView({label: '\u0c74\u{1f9dd}\u2f39\u{1fd99}\u{1fef8}\u3eaf\u{1f6af}\uf976\u{1f98a}', dimension: '1d'});
let externalTexture28 = device0.importExternalTexture({source: videoFrame3});
try {
computePassEncoder81.setBindGroup(0, bindGroup111, new Uint32Array(376), 28, 0);
} catch {}
try {
renderPassEncoder30.setBindGroup(0, bindGroup113, new Uint32Array(1609), 79, 0);
} catch {}
try {
renderPassEncoder20.setIndexBuffer(buffer29, 'uint32', 12, 3_602);
} catch {}
try {
commandEncoder185.copyBufferToTexture({
  /* bytesInLastRow: 1328 widthInBlocks: 332 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 40 */
  offset: 40,
  bytesPerRow: 8448,
  rowsPerImage: 324,
  buffer: buffer26,
}, {
  texture: texture117,
  mipLevel: 0,
  origin: {x: 951, y: 0, z: 0},
  aspect: 'all',
}, {width: 332, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext2.configure({
  device: device0,
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
  colorSpace: 'srgb',
  alphaMode: 'premultiplied',
});
} catch {}
document.body.prepend(canvas0);
let imageData23 = new ImageData(32, 28);
let buffer129 = device0.createBuffer({size: 4361, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM});
let texture204 = device0.createTexture({
  label: '\u58f8\u0755\u8629\u001d\u035e',
  size: [190],
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView229 = texture204.createView({format: 'rgba32float'});
let computePassEncoder159 = commandEncoder186.beginComputePass({});
let renderPassEncoder70 = commandEncoder185.beginRenderPass({
  colorAttachments: [{view: textureView222, loadOp: 'load', storeOp: 'store'}],
  occlusionQuerySet: querySet17,
});
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroups(2); };
} catch {}
try {
computePassEncoder159.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder25.executeBundles([renderBundle14, renderBundle17]);
} catch {}
try {
renderPassEncoder23.setVertexBuffer(3, buffer48, 176, 2_883);
} catch {}
try {
commandEncoder184.copyBufferToBuffer(buffer83, 88, buffer102, 3516, 60);
} catch {}
try {
commandEncoder184.copyBufferToTexture({
  /* bytesInLastRow: 29 widthInBlocks: 29 aspectSpecificFormat.texelBlockSize: 1 */
  /* end: 749 */
  offset: 749,
  bytesPerRow: 18176,
  buffer: buffer106,
}, {
  texture: texture70,
  mipLevel: 0,
  origin: {x: 124, y: 0, z: 0},
  aspect: 'all',
}, {width: 29, height: 0, depthOrArrayLayers: 0});
} catch {}
let videoFrame16 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt470bg', primaries: 'smpte432', transfer: 'unspecified'} });
let pipelineLayout19 = device0.createPipelineLayout({bindGroupLayouts: []});
let querySet18 = device0.createQuerySet({label: '\u273f\u8114\u677e\u{1f7d1}\u931f\u044a\u2dd5\uf9d7\u60ef', type: 'occlusion', count: 378});
let textureView230 = texture32.createView({
  label: '\u{1ff33}\u{1f6b1}\u0cc1\u{1f722}\u332a\u90c9',
  aspect: 'all',
  baseArrayLayer: 7,
  arrayLayerCount: 27,
});
let computePassEncoder160 = commandEncoder183.beginComputePass({});
let renderPassEncoder71 = commandEncoder187.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: 772.5, g: 771.9, b: 515.5, a: -501.9, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  maxDrawCount: 198963463,
});
try {
computePassEncoder110.end();
} catch {}
try {
computePassEncoder160.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder25.executeBundles([renderBundle18, renderBundle10, renderBundle10, renderBundle4, renderBundle4]);
} catch {}
try {
renderPassEncoder69.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder39.setVertexBuffer(5, buffer63, 1_476);
} catch {}
let arrayBuffer18 = buffer78.getMappedRange(2952, 1216);
try {
renderPassEncoder69.insertDebugMarker('\u03de');
} catch {}
try {
device0.queue.writeTexture({
  texture: texture69,
  mipLevel: 1,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(90).fill(87), /* required buffer size: 90 */
{offset: 90, bytesPerRow: 161}, {width: 8, height: 0, depthOrArrayLayers: 0});
} catch {}
let computePassEncoder161 = commandEncoder132.beginComputePass({});
let sampler131 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 27.36,
  lodMaxClamp: 64.27,
  maxAnisotropy: 19,
});
try {
computePassEncoder161.setPipeline(pipeline4);
} catch {}
try {
commandEncoder184.copyBufferToBuffer(buffer19, 168, buffer113, 252, 480);
} catch {}
let texture205 = device0.createTexture({
  size: {width: 47},
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ['rgba32float'],
});
let computePassEncoder162 = commandEncoder184.beginComputePass({});
try {
computePassEncoder128.setBindGroup(3, bindGroup104, new Uint32Array(2573), 399, 0);
} catch {}
try {
renderPassEncoder40.executeBundles([renderBundle2]);
} catch {}
try {
renderPassEncoder31.setBlendConstant({ r: -771.3, g: 229.2, b: -618.0, a: 273.5, });
} catch {}
try {
renderPassEncoder32.setIndexBuffer(buffer29, 'uint32', 776, 360);
} catch {}
try {
renderPassEncoder51.setVertexBuffer(2, buffer21, 3_848);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
let bindGroup145 = device0.createBindGroup({
  layout: bindGroupLayout19,
  entries: [{binding: 64, resource: textureView4}, {binding: 12, resource: textureView131}],
});
let texture206 = gpuCanvasContext6.getCurrentTexture();
try {
computePassEncoder162.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder50.end();
} catch {}
try {
renderPassEncoder9.beginOcclusionQuery(121);
} catch {}
try {
renderPassEncoder9.endOcclusionQuery();
} catch {}
try {
renderPassEncoder31.setVertexBuffer(2, buffer49);
} catch {}
try {
device0.queue.writeBuffer(buffer119, 1816, new Int16Array(54577), 6012, 664);
} catch {}
let bindGroup146 = device0.createBindGroup({layout: bindGroupLayout17, entries: [{binding: 400, resource: textureView190}]});
let texture207 = device0.createTexture({
  size: [1980, 1, 5],
  dimension: '3d',
  format: 'r8sint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let textureView231 = texture22.createView({dimension: 'cube', format: 'r32float', baseArrayLayer: 0});
let computePassEncoder163 = commandEncoder114.beginComputePass({});
let sampler132 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 50.60,
  lodMaxClamp: 64.44,
  maxAnisotropy: 5,
});
try {
renderPassEncoder67.beginOcclusionQuery(112);
} catch {}
try {
renderPassEncoder67.endOcclusionQuery();
} catch {}
try {
renderPassEncoder67.setVertexBuffer(0, buffer37, 260, 1_542);
} catch {}
try {
buffer44.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture88,
  mipLevel: 1,
  origin: {x: 45, y: 0, z: 1},
  aspect: 'all',
}, new Uint8Array(47_651).fill(65), /* required buffer size: 47_651 */
{offset: 371, bytesPerRow: 985, rowsPerImage: 8}, {width: 123, height: 0, depthOrArrayLayers: 7});
} catch {}
let buffer130 = device0.createBuffer({
  size: 22005,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let commandEncoder188 = device0.createCommandEncoder({});
let textureView232 = texture81.createView({label: '\u16a4\u0fa4\u894c\u0b84\u{1fde5}\u08d6\u8966\u710d\u{1fc1e}\u{1f8ee}'});
try {
computePassEncoder103.setBindGroup(0, bindGroup112, new Uint32Array(617), 122, 0);
} catch {}
try {
computePassEncoder163.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder30.setBindGroup(1, bindGroup37);
} catch {}
try {
renderPassEncoder17.setPipeline(pipeline1);
} catch {}
try {
renderPassEncoder34.setVertexBuffer(1, buffer124, 0, 1_777);
} catch {}
try {
commandEncoder188.resolveQuerySet(querySet1, 750, 93, buffer45, 0);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: img5,
  origin: { x: 2, y: 1 },
  flipY: false,
}, {
  texture: texture14,
  mipLevel: 0,
  origin: {x: 29, y: 0, z: 7},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: true,
}, {width: 9, height: 0, depthOrArrayLayers: 0});
} catch {}
let bindGroup147 = device0.createBindGroup({
  label: '\ue87e\ua4fe\u1014\u{1fa88}\u9f7b\ub527\u0c75',
  layout: bindGroupLayout17,
  entries: [{binding: 400, resource: textureView86}],
});
let commandEncoder189 = device0.createCommandEncoder({label: '\u06b5\u{1f8f0}\u{1f917}\u06f1\u{1fc74}\uc334\u7c2a'});
let texture208 = gpuCanvasContext2.getCurrentTexture();
let textureView233 = texture202.createView({dimension: '1d'});
try {
computePassEncoder8.setBindGroup(0, bindGroup12, []);
} catch {}
try {
renderPassEncoder18.setBindGroup(1, bindGroup56, new Uint32Array(153), 12, 0);
} catch {}
try {
renderPassEncoder18.setIndexBuffer(buffer21, 'uint32', 6_140, 6_148);
} catch {}
try {
renderPassEncoder27.setVertexBuffer(3, buffer45, 1_052, 83);
} catch {}
let commandEncoder190 = device0.createCommandEncoder({});
let computePassEncoder164 = commandEncoder189.beginComputePass({});
try {
computePassEncoder38.setBindGroup(3, bindGroup120, new Uint32Array(316), 68, 0);
} catch {}
try {
computePassEncoder134.setPipeline(pipeline3);
} catch {}
try {
computePassEncoder164.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder54.setVertexBuffer(7, buffer40, 468);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 1}
*/
{
  source: imageData17,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture69,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer131 = device0.createBuffer({size: 2274, usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX});
let commandEncoder191 = device0.createCommandEncoder({label: '\u08a1\u{1ffe2}\ua848\uad33\u43d6\u3cb4\u0cee\u4e70'});
let externalTexture29 = device0.importExternalTexture({source: videoFrame15});
try {
computePassEncoder92.end();
} catch {}
try {
renderPassEncoder4.setBindGroup(1, bindGroup101, new Uint32Array(1332), 94, 0);
} catch {}
try {
renderPassEncoder43.beginOcclusionQuery(171);
} catch {}
try {
renderPassEncoder43.endOcclusionQuery();
} catch {}
try {
renderPassEncoder20.setViewport(8.897255475751873, 0.09398337600527562, 17.263560458432, 0.5947700570689416, 0.12991162635484566, 0.8748296066601472);
} catch {}
try {
renderPassEncoder52.setIndexBuffer(buffer40, 'uint16', 418, 322);
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
  alphaMode: 'opaque',
});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 8, height: 8, depthOrArrayLayers: 15}
*/
{
  source: videoFrame9,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture131,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 1},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder192 = device0.createCommandEncoder();
let renderPassEncoder72 = commandEncoder188.beginRenderPass({
  colorAttachments: [{
  view: textureView19,
  clearValue: { r: -259.4, g: -177.9, b: 716.0, a: -809.7, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
try {
computePassEncoder63.setBindGroup(1, bindGroup138, new Uint32Array(2936), 91, 0);
} catch {}
try {
renderPassEncoder54.setBindGroup(2, bindGroup104);
} catch {}
try {
renderPassEncoder64.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder58.setVertexBuffer(7, buffer109, 0);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture138,
  mipLevel: 0,
  origin: {x: 1, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(146).fill(206), /* required buffer size: 146 */
{offset: 146}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder193 = device0.createCommandEncoder();
let textureView234 = texture143.createView({});
let computePassEncoder165 = commandEncoder104.beginComputePass({label: '\u0502\u0fe1\u2df5\ua5e9\u9863\u0d84\u72f7\u186e\u0da9\u067b\u6e45'});
let sampler133 = device0.createSampler({
  label: '\u734e\ud786\u47e6\u{1fd07}\u{1fadf}',
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  lodMinClamp: 49.86,
  lodMaxClamp: 81.99,
});
try {
{ clearResourceUsages(device0, computePassEncoder131); computePassEncoder131.dispatchWorkgroupsIndirect(buffer102, 7_768); };
} catch {}
try {
renderPassEncoder64.executeBundles([renderBundle15]);
} catch {}
try {
commandEncoder191.copyBufferToBuffer(buffer120, 492, buffer101, 3180, 256);
} catch {}
try {
commandEncoder191.copyBufferToTexture({
  /* bytesInLastRow: 48 widthInBlocks: 3 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 2192 */
  offset: 2192,
  bytesPerRow: 22016,
  buffer: buffer98,
}, {
  texture: texture75,
  mipLevel: 0,
  origin: {x: 2, y: 0, z: 7},
  aspect: 'all',
}, {width: 3, height: 0, depthOrArrayLayers: 0});
} catch {}
let commandEncoder194 = device0.createCommandEncoder({});
let textureView235 = texture178.createView({label: '\u0ae0\u97fd\u59ed\u0b7c\u{1f9da}\u09b9\u9d19\u{1fde2}\u187d\u03b0\u3612'});
let textureView236 = texture11.createView({});
let computePassEncoder166 = commandEncoder194.beginComputePass({});
let renderPassEncoder73 = commandEncoder190.beginRenderPass({
  colorAttachments: [{
  view: textureView205,
  clearValue: { r: -425.0, g: -38.10, b: -220.4, a: -503.6, },
  loadOp: 'load',
  storeOp: 'discard',
}],
});
let sampler134 = device0.createSampler({
  addressModeV: 'clamp-to-edge',
  addressModeW: 'clamp-to-edge',
  minFilter: 'nearest',
  mipmapFilter: 'nearest',
  lodMinClamp: 37.65,
  lodMaxClamp: 54.55,
});
try {
computePassEncoder84.setBindGroup(3, bindGroup52, new Uint32Array(1727), 136, 2);
} catch {}
try {
renderPassEncoder38.setIndexBuffer(buffer21, 'uint16', 140, 399);
} catch {}
try {
renderPassEncoder33.setVertexBuffer(0, buffer119, 0, 6_520);
} catch {}
let commandEncoder195 = device0.createCommandEncoder({label: '\u64c0\u{1fe16}\u80e3'});
let texture209 = device0.createTexture({
  size: [95, 1, 1],
  format: 'r32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: [],
});
let computePassEncoder167 = commandEncoder191.beginComputePass({});
let renderPassEncoder74 = commandEncoder195.beginRenderPass({
  colorAttachments: [{view: textureView95, loadOp: 'clear', storeOp: 'discard'}],
  occlusionQuerySet: querySet0,
});
let sampler135 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'mirror-repeat',
  mipmapFilter: 'nearest',
  lodMinClamp: 87.37,
  lodMaxClamp: 92.98,
});
try {
computePassEncoder166.setPipeline(pipeline4);
} catch {}
try {
buffer63.unmap();
} catch {}
try {
commandEncoder192.copyBufferToTexture({
  /* bytesInLastRow: 32 widthInBlocks: 4 aspectSpecificFormat.texelBlockSize: 8 */
  /* end: 1384 */
  offset: 1384,
  bytesPerRow: 35328,
  buffer: buffer82,
}, {
  texture: texture184,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 190, height: 2, depthOrArrayLayers: 55}
*/
{
  source: imageData11,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture85,
  mipLevel: 0,
  origin: {x: 33, y: 0, z: 9},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 9, height: 0, depthOrArrayLayers: 0});
} catch {}
let pipelineLayout20 = device0.createPipelineLayout({bindGroupLayouts: []});
let texture210 = device0.createTexture({
  size: [990],
  dimension: '1d',
  format: 'rgba16float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
});
let computePassEncoder168 = commandEncoder192.beginComputePass({});
try {
computePassEncoder131.end();
} catch {}
try {
renderPassEncoder15.executeBundles([renderBundle4]);
} catch {}
try {
renderPassEncoder11.setViewport(1126.9496274579412, 0.18276426086301534, 152.9445608899822, 0.7926727426738819, 0.05040177226317377, 0.5740036516131504);
} catch {}
try {
renderPassEncoder65.setIndexBuffer(buffer131, 'uint32', 340, 1_491);
} catch {}
try {
commandEncoder193.resolveQuerySet(querySet4, 315, 111, buffer88, 1280);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
device0.queue.writeBuffer(buffer25, 1376, new Int16Array(9665), 3693, 2552);
} catch {}
let pipelineLayout21 = device0.createPipelineLayout({bindGroupLayouts: []});
let buffer132 = device0.createBuffer({label: '\u{1fb78}\u0c33', size: 14767, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM});
let textureView237 = texture68.createView({baseArrayLayer: 0});
let texture211 = device0.createTexture({
  size: [1980, 1, 1],
  format: 'rg32sint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING,
});
let renderPassEncoder75 = commandEncoder193.beginRenderPass({
  colorAttachments: [{
  view: textureView10,
  clearValue: { r: 283.9, g: -763.2, b: 203.1, a: 519.1, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
});
try {
renderPassEncoder70.setBindGroup(2, bindGroup24);
} catch {}
try {
commandEncoder115.copyBufferToTexture({
  /* bytesInLastRow: 96 widthInBlocks: 6 aspectSpecificFormat.texelBlockSize: 16 */
  /* end: 912 */
  offset: 912,
  bytesPerRow: 36608,
  rowsPerImage: 212,
  buffer: buffer4,
}, {
  texture: texture63,
  mipLevel: 0,
  origin: {x: 46, y: 0, z: 0},
  aspect: 'all',
}, {width: 6, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
gpuCanvasContext1.configure({
  device: device0,
  format: 'bgra8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
});
} catch {}
try {
device0.queue.writeBuffer(buffer85, 1220, new Float32Array(1343), 140, 52);
} catch {}
let buffer133 = device0.createBuffer({size: 3625, usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.VERTEX});
let commandEncoder196 = device0.createCommandEncoder({});
let textureView238 = texture125.createView({});
let renderPassEncoder76 = commandEncoder115.beginRenderPass({
  colorAttachments: [{
  view: textureView71,
  depthSlice: 39,
  clearValue: { r: 521.0, g: -278.2, b: 265.3, a: 870.2, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  maxDrawCount: 106449996,
});
try {
computePassEncoder76.setBindGroup(0, bindGroup68, new Uint32Array(35), 2, 1);
} catch {}
try {
renderPassEncoder46.setBindGroup(0, bindGroup57);
} catch {}
try {
renderPassEncoder12.setVertexBuffer(4, buffer87);
} catch {}
try {
buffer2.unmap();
} catch {}
try {
commandEncoder196.resolveQuerySet(querySet6, 0, 0, buffer11, 0);
} catch {}
let renderPassEncoder77 = commandEncoder196.beginRenderPass({
  colorAttachments: [{
  view: textureView51,
  clearValue: { r: -581.1, g: 731.9, b: 112.4, a: 130.9, },
  loadOp: 'clear',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet2,
  maxDrawCount: 261834149,
});
try {
computePassEncoder69.setBindGroup(0, bindGroup116);
} catch {}
try {
computePassEncoder168.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder58.setBindGroup(1, bindGroup66, new Uint32Array(449), 36, 0);
} catch {}
try {
renderPassEncoder42.setPipeline(pipeline2);
} catch {}
let commandEncoder197 = device0.createCommandEncoder({label: '\u0f91\u0d50\u2776'});
let texture212 = device0.createTexture({
  size: [495, 1, 1],
  mipLevelCount: 3,
  format: 'rg11b10ufloat',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
let renderPassEncoder78 = commandEncoder197.beginRenderPass({
  colorAttachments: [{
  view: textureView58,
  clearValue: { r: -529.8, g: 762.2, b: 838.8, a: -640.5, },
  loadOp: 'load',
  storeOp: 'discard',
}],
  occlusionQuerySet: querySet0,
});
try {
computePassEncoder72.setBindGroup(3, bindGroup101, new Uint32Array(2929), 702, 0);
} catch {}
try {
computePassEncoder165.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder74.setBindGroup(0, bindGroup80, new Uint32Array(4189), 72, 0);
} catch {}
try {
renderPassEncoder63.setPipeline(pipeline1);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture84,
  mipLevel: 0,
  origin: {x: 9, y: 0, z: 3},
  aspect: 'all',
}, new Uint8Array(230).fill(98), /* required buffer size: 230 */
{offset: 70, bytesPerRow: 4, rowsPerImage: 40}, {width: 2, height: 0, depthOrArrayLayers: 2});
} catch {}
let promise21 = device0.queue.onSubmittedWorkDone();
let videoFrame17 = new VideoFrame(videoFrame8, {timestamp: 0});
let commandEncoder198 = device0.createCommandEncoder({});
let textureView239 = texture4.createView({label: '\u663a\u057f\u0eb9\u{1ff0c}\u01a8\u{1fe99}', dimension: '2d-array', mipLevelCount: 1});
let renderBundleEncoder26 = device0.createRenderBundleEncoder({colorFormats: ['rg11b10ufloat'], sampleCount: 1, depthReadOnly: true, stencilReadOnly: false});
let sampler136 = device0.createSampler({
  label: '\u80a7\uedc9\u{1f60d}\u1856\u62bd\u07eb\u648d\u08c8',
  addressModeU: 'clamp-to-edge',
  addressModeV: 'repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 5.811,
  lodMaxClamp: 92.67,
});
try {
renderPassEncoder26.setVertexBuffer(3, buffer119, 0);
} catch {}
try {
renderBundleEncoder26.setBindGroup(2, bindGroup40, new Uint32Array(1418), 26, 0);
} catch {}
try {
  await buffer83.mapAsync(GPUMapMode.WRITE);
} catch {}
try {
renderBundleEncoder26.insertDebugMarker('\u010e');
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 95, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas1,
  origin: { x: 76, y: 9 },
  flipY: false,
}, {
  texture: texture127,
  mipLevel: 0,
  origin: {x: 0, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'display-p3',
  premultipliedAlpha: false,
}, {width: 4, height: 0, depthOrArrayLayers: 0});
} catch {}
await gc();
let commandEncoder199 = device0.createCommandEncoder({});
let textureView240 = texture99.createView({
  label: '\u012d\u63bb\uc39e\u36ac\u522f\u5072\u0e94\ua147\u1d48',
  dimension: '2d',
  baseMipLevel: 0,
  baseArrayLayer: 0,
});
let computePassEncoder169 = commandEncoder198.beginComputePass();
let renderPassEncoder79 = commandEncoder199.beginRenderPass({
  colorAttachments: [{
  view: textureView201,
  depthSlice: 2,
  clearValue: { r: -285.2, g: -620.2, b: -880.8, a: -586.0, },
  loadOp: 'load',
  storeOp: 'store',
}],
});
let renderBundle26 = renderBundleEncoder26.finish({});
let buffer134 = device0.createBuffer({size: 4102, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});
let texture213 = device0.createTexture({
  size: [990, 1, 28],
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
  viewFormats: ['rgb10a2uint', 'rgb10a2uint'],
});
try {
computePassEncoder169.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder73.setBindGroup(1, bindGroup36);
} catch {}
try {
renderPassEncoder12.setPipeline(pipeline1);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture159,
  mipLevel: 0,
  origin: {x: 927, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(310).fill(116), /* required buffer size: 310 */
{offset: 310}, {width: 19, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer135 = device0.createBuffer({
  size: 13069,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
let texture214 = device0.createTexture({
  size: {width: 495},
  dimension: '1d',
  format: 'rgba32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder167.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder73.setIndexBuffer(buffer110, 'uint16', 676, 196);
} catch {}
try {
renderPassEncoder14.setPipeline(pipeline2);
} catch {}
try {
buffer128.unmap();
} catch {}
let bindGroup148 = device0.createBindGroup({
  layout: bindGroupLayout12,
  entries: [
    {binding: 100, resource: {buffer: buffer12, offset: 0, size: 52}},
    {binding: 187, resource: {buffer: buffer108, offset: 768, size: 6128}},
    {binding: 4, resource: {buffer: buffer10, offset: 1280, size: 1780}},
    {binding: 92, resource: textureView94},
    {binding: 146, resource: textureView53},
  ],
});
try {
renderPassEncoder74.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder58.setVertexBuffer(2, buffer60);
} catch {}
let arrayBuffer19 = buffer83.getMappedRange(0, 8);
let texture215 = device0.createTexture({
  label: '\u01f3\u04b9\u02f6\u0479\u07ef\u08b3',
  size: {width: 380, height: 5, depthOrArrayLayers: 7},
  format: 'astc-10x5-unorm',
  usage: GPUTextureUsage.TEXTURE_BINDING,
});
let textureView241 = texture139.createView({label: '\ud758\u059a\u0b4d', dimension: '2d-array', aspect: 'all'});
try {
computePassEncoder121.setBindGroup(0, bindGroup113);
} catch {}
try {
renderPassEncoder49.setVertexBuffer(3, buffer63);
} catch {}
try {
gpuCanvasContext1.unconfigure();
} catch {}
await gc();
let bindGroup149 = device0.createBindGroup({
  label: '\u7394\u86cf\u4593',
  layout: bindGroupLayout3,
  entries: [{binding: 433, resource: textureView96}],
});
let pipelineLayout22 = device0.createPipelineLayout({label: '\u0f42\u{1fc83}\u4b21\u{1fc0b}\u{1ff7c}\ue3df\u0db7', bindGroupLayouts: []});
let sampler137 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'mirror-repeat',
  magFilter: 'nearest',
  lodMinClamp: 85.45,
  lodMaxClamp: 98.30,
  compare: 'equal',
});
try {
computePassEncoder124.setBindGroup(2, bindGroup72, []);
} catch {}
try {
renderPassEncoder43.setBindGroup(2, bindGroup29, new Uint32Array(900), 68, 0);
} catch {}
try {
renderPassEncoder23.setIndexBuffer(buffer11, 'uint16', 48, 33);
} catch {}
try {
renderPassEncoder12.setVertexBuffer(6, buffer124, 2_508, 2_415);
} catch {}
let pipeline5 = device0.createRenderPipeline({
  layout: pipelineLayout13,
  fragment: {
  module: shaderModule10,
  entryPoint: 'fragment9',
  targets: [{format: 'rgba32float', writeMask: GPUColorWrite.ALPHA | GPUColorWrite.RED}],
},
  vertex: {module: shaderModule10, constants: {}, buffers: []},
  primitive: {topology: 'triangle-strip', stripIndexFormat: 'uint16', cullMode: 'back'},
});
try {
textureView51.label = '\u4faa\ud90d\ue958\ud024\u9aba\u2af6';
} catch {}
let buffer136 = device0.createBuffer({
  size: 556,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.UNIFORM | GPUBufferUsage.VERTEX,
});
let texture216 = device0.createTexture({
  label: '\ube2a\u{1fc72}\u160e\u0cb7\u{1fa92}\u9551',
  size: {width: 95, height: 1, depthOrArrayLayers: 1},
  sampleCount: 1,
  format: 'r32float',
  usage: GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
try {
computePassEncoder167.setBindGroup(2, bindGroup31, new Uint32Array(1356), 143, 0);
} catch {}
try {
renderPassEncoder73.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder75.setVertexBuffer(0, buffer127, 804, 29);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture156,
  mipLevel: 0,
  origin: {x: 572, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(380).fill(203), /* required buffer size: 380 */
{offset: 380, rowsPerImage: 20}, {width: 555, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let videoFrame18 = videoFrame1.clone();
let texture217 = device0.createTexture({
  size: {width: 380, height: 5, depthOrArrayLayers: 110},
  mipLevelCount: 2,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.TEXTURE_BINDING,
});
try {
computePassEncoder129.setBindGroup(0, bindGroup57, new Uint32Array(2937), 34, 0);
} catch {}
try {
renderPassEncoder36.setBindGroup(3, bindGroup10, new Uint32Array(3612), 817, 2);
} catch {}
try {
renderPassEncoder77.pushDebugGroup('\ud1ed');
} catch {}
let bindGroupLayout32 = device0.createBindGroupLayout({
  label: '\u0d52\u27ec\ua5af\u0d4e\ud7a1\u06b4\u680f\u1a4b\u742c',
  entries: [
    {
      binding: 144,
      visibility: GPUShaderStage.COMPUTE,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
    {
      binding: 267,
      visibility: GPUShaderStage.FRAGMENT,
      storageTexture: { format: 'rg32float', access: 'write-only', viewDimension: '2d' },
    },
  ],
});
let buffer137 = device0.createBuffer({size: 3466, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC});
let commandEncoder200 = device0.createCommandEncoder({});
let texture218 = device0.createTexture({
  label: '\ue3e8\u08bf\u3062\u8088\u61d1\u0a73\ue150\uba9c\ufe1d\u9d74',
  size: [380, 5, 17],
  format: 'rg32float',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING,
  viewFormats: [],
});
let computePassEncoder170 = commandEncoder200.beginComputePass({});
try {
computePassEncoder133.setBindGroup(1, bindGroup16);
} catch {}
try {
device0.queue.writeBuffer(buffer134, 1176, new Float32Array(18425), 559, 152);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture96,
  mipLevel: 0,
  origin: {x: 731, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(6_601).fill(113), /* required buffer size: 6_601 */
{offset: 304, bytesPerRow: 2099, rowsPerImage: 3}, {width: 127, height: 0, depthOrArrayLayers: 2});
} catch {}
document.body.append(img4);
let bindGroupLayout33 = device0.createBindGroupLayout({
  label: '\u0654\u00f5',
  entries: [
    {
      binding: 162,
      visibility: GPUShaderStage.COMPUTE | GPUShaderStage.FRAGMENT,
      buffer: { type: 'storage', hasDynamicOffset: false },
    },
  ],
});
let textureView242 = texture218.createView({dimension: '2d', aspect: 'all', format: 'rg32float', baseMipLevel: 0, baseArrayLayer: 12});
try {
computePassEncoder141.setBindGroup(3, bindGroup54);
} catch {}
try {
renderPassEncoder23.executeBundles([renderBundle17, renderBundle9, renderBundle9]);
} catch {}
try {
renderPassEncoder62.setIndexBuffer(buffer73, 'uint32', 160, 2_331);
} catch {}
try {
renderPassEncoder57.setPipeline(pipeline1);
} catch {}
try {
device0.addEventListener('uncapturederror', e => {  });
} catch {}
let videoFrame19 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'I420A',  timestamp: 0, colorSpace: {fullRange: false, matrix: 'fcc', primaries: 'smpte432', transfer: 'logSqrt'} });
let bindGroup150 = device0.createBindGroup({
  layout: bindGroupLayout28,
  entries: [
    {binding: 39, resource: textureView195},
    {binding: 129, resource: textureView131},
    {binding: 26, resource: textureView64},
    {binding: 40, resource: {buffer: buffer114, offset: 768, size: 948}},
    {binding: 51, resource: textureView136},
    {binding: 91, resource: externalTexture29},
  ],
});
let textureView243 = texture139.createView({label: '\u04fa\u{1fef2}\u{1ff36}'});
let texture219 = device0.createTexture({
  size: [47, 1, 13],
  sampleCount: 1,
  dimension: '3d',
  format: 'rgb10a2uint',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
  viewFormats: ['rgb10a2uint', 'rgb10a2uint'],
});
try {
computePassEncoder3.setBindGroup(2, bindGroup66);
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder8); computePassEncoder8.dispatchWorkgroups(1, 1); };
} catch {}
try {
{ clearResourceUsages(device0, computePassEncoder8); computePassEncoder8.dispatchWorkgroupsIndirect(buffer70, 3_432); };
} catch {}
try {
computePassEncoder170.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder63.setBindGroup(1, bindGroup142, new Uint32Array(660), 356, 0);
} catch {}
try {
renderPassEncoder17.executeBundles([renderBundle10, renderBundle10, renderBundle9]);
} catch {}
try {
renderPassEncoder43.setScissorRect(6, 0, 43, 0);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let imageData24 = new ImageData(44, 8);
let bindGroup151 = device0.createBindGroup({
  layout: bindGroupLayout18,
  entries: [
    {binding: 575, resource: sampler36},
    {binding: 490, resource: {buffer: buffer106, offset: 768, size: 1316}},
    {binding: 54, resource: textureView155},
    {binding: 72, resource: textureView44},
    {binding: 67, resource: sampler10},
  ],
});
let sampler138 = device0.createSampler({
  addressModeV: 'mirror-repeat',
  addressModeW: 'clamp-to-edge',
  magFilter: 'nearest',
  lodMinClamp: 49.68,
  lodMaxClamp: 52.21,
});
try {
renderPassEncoder12.setScissorRect(41, 0, 1, 0);
} catch {}
try {
renderPassEncoder75.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder35.setVertexBuffer(1, buffer37, 2_756);
} catch {}
let buffer138 = device0.createBuffer({
  size: 4508,
  usage: GPUBufferUsage.INDEX | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX,
});
try {
computePassEncoder72.setBindGroup(1, bindGroup106);
} catch {}
try {
renderPassEncoder75.setIndexBuffer(buffer60, 'uint32', 27_228, 3_302);
} catch {}
let textureView244 = texture38.createView({dimension: '2d'});
try {
computePassEncoder100.setBindGroup(0, bindGroup110);
} catch {}
try {
computePassEncoder116.setBindGroup(0, bindGroup119, new Uint32Array(2737), 89, 0);
} catch {}
try {
computePassEncoder8.end();
} catch {}
try {
renderPassEncoder37.setIndexBuffer(buffer73, 'uint32', 500, 335);
} catch {}
try {
commandEncoder11.copyBufferToTexture({
  /* bytesInLastRow: 156 widthInBlocks: 39 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 572 */
  offset: 572,
  buffer: buffer3,
}, {
  texture: texture188,
  mipLevel: 0,
  origin: {x: 47, y: 0, z: 0},
  aspect: 'all',
}, {width: 39, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer139 = device0.createBuffer({size: 4487, usage: GPUBufferUsage.INDEX | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE});
let commandEncoder201 = device0.createCommandEncoder();
let textureView245 = texture112.createView({dimension: '2d-array', baseArrayLayer: 6, arrayLayerCount: 1});
let computePassEncoder171 = commandEncoder201.beginComputePass({});
try {
{ clearResourceUsages(device0, computePassEncoder121); computePassEncoder121.dispatchWorkgroups(1, 1); };
} catch {}
try {
computePassEncoder171.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder58.setBindGroup(0, bindGroup6);
} catch {}
try {
renderPassEncoder20.setBindGroup(1, bindGroup7, new Uint32Array(694), 134, 0);
} catch {}
try {
renderPassEncoder29.setIndexBuffer(buffer133, 'uint32', 812, 510);
} catch {}
try {
renderPassEncoder11.setPipeline(pipeline2);
} catch {}
try {
commandEncoder11.copyBufferToTexture({
  /* bytesInLastRow: 188 widthInBlocks: 47 aspectSpecificFormat.texelBlockSize: 4 */
  /* end: 1264 */
  offset: 1264,
  bytesPerRow: 10752,
  buffer: buffer33,
}, {
  texture: texture58,
  mipLevel: 0,
  origin: {x: 19, y: 24, z: 0},
  aspect: 'all',
}, {width: 47, height: 16, depthOrArrayLayers: 0});
} catch {}
let bindGroup152 = device0.createBindGroup({
  layout: bindGroupLayout21,
  entries: [{binding: 125, resource: textureView81}, {binding: 285, resource: {buffer: buffer76, offset: 512}}],
});
let commandEncoder202 = device0.createCommandEncoder();
try {
computePassEncoder69.setBindGroup(3, bindGroup94);
} catch {}
try {
renderPassEncoder68.setBindGroup(1, bindGroup27, []);
} catch {}
try {
renderPassEncoder17.setIndexBuffer(buffer15, 'uint16', 52, 199);
} catch {}
try {
device0.queue.copyExternalImageToTexture(/*
{width: 990, height: 1, depthOrArrayLayers: 1}
*/
{
  source: videoFrame14,
  origin: { x: 0, y: 0 },
  flipY: true,
}, {
  texture: texture101,
  mipLevel: 0,
  origin: {x: 298, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: false,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
let buffer140 = device0.createBuffer({
  size: 8907,
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT | GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM,
});
let renderBundleEncoder27 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], depthReadOnly: true});
try {
computePassEncoder164.setBindGroup(0, bindGroup128);
} catch {}
try {
computePassEncoder63.setBindGroup(1, bindGroup131, new Uint32Array(3359), 1_678, 0);
} catch {}
try {
renderPassEncoder51.executeBundles([renderBundle14, renderBundle14, renderBundle18]);
} catch {}
try {
renderBundleEncoder27.setBindGroup(3, bindGroup124);
} catch {}
try {
renderBundleEncoder27.setIndexBuffer(buffer10, 'uint32', 2_644, 1_119);
} catch {}
try {
renderBundleEncoder27.setPipeline(pipeline2);
} catch {}
try {
buffer25.unmap();
} catch {}
try {
device0.queue.writeTexture({
  texture: texture102,
  mipLevel: 0,
  origin: {x: 3, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(29).fill(71), /* required buffer size: 29 */
{offset: 29, bytesPerRow: 304}, {width: 68, height: 0, depthOrArrayLayers: 0});
} catch {}
requestAnimationFrame(startTime => globalThis.startTime=startTime);
try {
computePassEncoder57.setBindGroup(3, bindGroup97, new Uint32Array(841), 162, 0);
} catch {}
try {
renderPassEncoder55.setBindGroup(2, bindGroup66, []);
} catch {}
try {
renderPassEncoder27.executeBundles([renderBundle6, renderBundle19, renderBundle13, renderBundle0]);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(7, buffer45, 0, 1_850);
} catch {}
try {
renderBundleEncoder27.setBindGroup(3, bindGroup75, new Uint32Array(4062), 191, 0);
} catch {}
try {
renderBundleEncoder27.setIndexBuffer(buffer124, 'uint16', 1_206, 3_415);
} catch {}
try {
commandEncoder11.copyBufferToBuffer(buffer78, 2564, buffer103, 404, 2716);
} catch {}
document.body.append(img3);
let querySet19 = device0.createQuerySet({type: 'occlusion', count: 102});
let commandBuffer18 = commandEncoder11.finish({});
let computePassEncoder172 = commandEncoder202.beginComputePass({});
let renderBundle27 = renderBundleEncoder27.finish({});
try {
renderPassEncoder11.setBindGroup(1, bindGroup10, [256, 0]);
} catch {}
try {
renderPassEncoder72.setPipeline(pipeline2);
} catch {}
try {
renderPassEncoder69.setVertexBuffer(7, buffer138);
} catch {}
try {
renderPassEncoder77.popDebugGroup();
} catch {}
try {
externalTexture12.label = '\u040f\u8ead\u0858\ud3bd\u06bb';
} catch {}
try {
renderPassEncoder46.setBindGroup(0, bindGroup12, new Uint32Array(117), 3, 0);
} catch {}
try {
renderPassEncoder14.setIndexBuffer(buffer65, 'uint32', 88, 12_111);
} catch {}
try {
device0.queue.submit([]);
} catch {}
try {
device0.queue.writeTexture({
  texture: texture42,
  mipLevel: 0,
  origin: {x: 85, y: 0, z: 0},
  aspect: 'all',
}, new Uint8Array(111_550).fill(152), /* required buffer size: 111_550 */
{offset: 208, bytesPerRow: 2651, rowsPerImage: 7}, {width: 165, height: 0, depthOrArrayLayers: 7});
} catch {}
document.body.prepend(img5);
let imageData25 = new ImageData(44, 52);
let buffer141 = device0.createBuffer({size: 11222, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.UNIFORM});
let textureView246 = texture156.createView({format: 'rgba16float'});
try {
computePassEncoder172.setPipeline(pipeline3);
} catch {}
try {
renderPassEncoder16.setIndexBuffer(buffer101, 'uint32', 688, 1_488);
} catch {}
try {
buffer15.unmap();
} catch {}
try {
computePassEncoder124.setBindGroup(1, bindGroup53, new Uint32Array(1113), 289, 0);
} catch {}
try {
renderPassEncoder66.setBindGroup(0, bindGroup29);
} catch {}
try {
renderPassEncoder26.setStencilReference(2269);
} catch {}
try {
renderPassEncoder40.setPipeline(pipeline2);
} catch {}
try {
buffer132.unmap();
} catch {}
try {
gpuCanvasContext0.configure({
  device: device0,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
} catch {}
try {
device0.queue.writeTexture({
  texture: texture155,
  mipLevel: 0,
  origin: {x: 12, y: 0, z: 2},
  aspect: 'all',
}, new Uint8Array(487).fill(175), /* required buffer size: 487 */
{offset: 487, bytesPerRow: 2}, {width: 0, height: 0, depthOrArrayLayers: 1});
} catch {}
let bindGroup153 = device0.createBindGroup({
  layout: bindGroupLayout5,
  entries: [
    {binding: 29, resource: textureView68},
    {binding: 313, resource: textureView33},
    {binding: 89, resource: sampler92},
    {binding: 487, resource: textureView213},
    {binding: 359, resource: {buffer: buffer10, offset: 512, size: 598}},
    {binding: 173, resource: {buffer: buffer57, offset: 256, size: 92}},
    {binding: 140, resource: textureView43},
    {binding: 150, resource: textureView17},
    {binding: 298, resource: {buffer: buffer76, offset: 0, size: 2668}},
  ],
});
try {
computePassEncoder89.setBindGroup(2, bindGroup92);
} catch {}
try {
computePassEncoder134.setBindGroup(3, bindGroup140, new Uint32Array(2150), 565, 0);
} catch {}
try {
computePassEncoder121.end();
} catch {}
try {
renderPassEncoder32.executeBundles([renderBundle4, renderBundle18]);
} catch {}
try {
commandEncoder144.copyTextureToTexture({
  texture: texture211,
  mipLevel: 0,
  origin: {x: 240, y: 0, z: 0},
  aspect: 'all',
},
{
  texture: texture141,
  mipLevel: 0,
  origin: {x: 3, y: 1, z: 0},
  aspect: 'all',
},
{width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
device0.queue.writeBuffer(buffer52, 380, new Float32Array(17199), 4097, 32);
} catch {}
let textureView247 = texture45.createView({label: '\u5515\u0842\u7f99\u0b60', format: 'rgba8sint', mipLevelCount: 1});
let computePassEncoder173 = commandEncoder144.beginComputePass();
try {
computePassEncoder147.setBindGroup(0, bindGroup15, []);
} catch {}
try {
renderPassEncoder27.setIndexBuffer(buffer15, 'uint32', 168, 3);
} catch {}
try {
  await promise21;
} catch {}
let bindGroup154 = device0.createBindGroup({
  label: '\u{1fdba}\u9a57\u{1fc8d}\uc256\ubb46\u39bf\uf732\u01af',
  layout: bindGroupLayout30,
  entries: [
    {binding: 71, resource: textureView240},
    {binding: 244, resource: {buffer: buffer64, offset: 256, size: 1212}},
  ],
});
try {
computePassEncoder173.setPipeline(pipeline4);
} catch {}
try {
renderPassEncoder52.setPipeline(pipeline1);
} catch {}
try {
buffer29.unmap();
} catch {}
try {
renderPassEncoder2.setBindGroup(3, bindGroup119, new Uint32Array(1394), 0, 0);
} catch {}
try {
renderPassEncoder79.setIndexBuffer(buffer35, 'uint16', 14_508, 1_939);
} catch {}
try {
renderPassEncoder12.setPipeline(pipeline1);
} catch {}
try {
gpuCanvasContext0.unconfigure();
} catch {}
let bindGroup155 = device0.createBindGroup({
  layout: bindGroupLayout21,
  entries: [
    {binding: 125, resource: textureView75},
    {binding: 285, resource: {buffer: buffer14, offset: 8192, size: 592}},
  ],
});
let querySet20 = device0.createQuerySet({type: 'occlusion', count: 270});
try {
renderPassEncoder4.setIndexBuffer(buffer15, 'uint16', 386, 79);
} catch {}
let videoFrame20 = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBA',  timestamp: 0, colorSpace: {fullRange: true, matrix: 'bt2020-ncl', primaries: 'bt470m', transfer: 'unspecified'} });
let commandEncoder203 = device0.createCommandEncoder({});
let textureView248 = texture22.createView({dimension: 'cube', baseArrayLayer: 4});
let sampler139 = device0.createSampler({
  addressModeU: 'mirror-repeat',
  addressModeV: 'clamp-to-edge',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 83.31,
  lodMaxClamp: 96.11,
  maxAnisotropy: 18,
});
try {
{ clearResourceUsages(device0, computePassEncoder129); computePassEncoder129.dispatchWorkgroupsIndirect(buffer7, 112); };
} catch {}
try {
renderPassEncoder78.setIndexBuffer(buffer28, 'uint16', 26, 0);
} catch {}
try {
renderPassEncoder2.setVertexBuffer(2, buffer43, 0, 4_601);
} catch {}
try {
  await device0.queue.onSubmittedWorkDone();
} catch {}
let bindGroupLayout34 = device0.createBindGroupLayout({
  entries: [
    {
      binding: 6,
      visibility: GPUShaderStage.FRAGMENT,
      texture: { viewDimension: '2d', sampleType: 'float', multisampled: false },
    },
  ],
});
let renderPassEncoder80 = commandEncoder203.beginRenderPass({
  colorAttachments: [{
  view: textureView128,
  clearValue: { r: 404.5, g: 613.9, b: 103.3, a: -910.8, },
  loadOp: 'load',
  storeOp: 'store',
}],
  occlusionQuerySet: querySet18,
});
let renderBundleEncoder28 = device0.createRenderBundleEncoder({colorFormats: ['r8sint'], stencilReadOnly: true});
try {
computePassEncoder129.end();
} catch {}
try {
renderPassEncoder77.setPipeline(pipeline1);
} catch {}
try {
renderBundleEncoder28.setBindGroup(2, bindGroup51, [256, 0]);
} catch {}
try {
renderBundleEncoder28.setBindGroup(3, bindGroup110, new Uint32Array(4447), 336, 0);
} catch {}
try {
renderBundleEncoder28.setIndexBuffer(buffer133, 'uint32', 2_148, 22);
} catch {}
try {
commandEncoder153.copyTextureToTexture({
  texture: texture8,
  mipLevel: 2,
  origin: {x: 30, y: 0, z: 3},
  aspect: 'all',
},
{
  texture: texture8,
  mipLevel: 2,
  origin: {x: 152, y: 0, z: 0},
  aspect: 'all',
},
{width: 60, height: 0, depthOrArrayLayers: 0});
} catch {}
try {
commandEncoder153.insertDebugMarker('\udd17');
} catch {}
try {
device0.queue.writeBuffer(buffer15, 376, new Int16Array(10019), 1226, 112);
} catch {}
let textureView249 = texture128.createView({label: '\u0adc\u2ad3\u09f9\u65cf\u9872\u2682\u{1f6ec}\u32ab\u2f7d\u06c9\ub528', aspect: 'all'});
let computePassEncoder174 = commandEncoder153.beginComputePass({});
let renderBundle28 = renderBundleEncoder28.finish({label: '\u2a37\u934e\ua034\ud9a3\u{1f9a4}\u071d\u{1fa6b}\u03c6'});
let sampler140 = device0.createSampler({
  addressModeU: 'repeat',
  addressModeV: 'repeat',
  addressModeW: 'repeat',
  magFilter: 'linear',
  minFilter: 'linear',
  mipmapFilter: 'linear',
  lodMinClamp: 79.73,
  lodMaxClamp: 94.52,
  maxAnisotropy: 7,
});
try {
renderPassEncoder20.setIndexBuffer(buffer63, 'uint16', 1_846, 1_280);
} catch {}
try {
device0.pushErrorScope('out-of-memory');
} catch {}
let imageData26 = new ImageData(128, 160);
let commandEncoder204 = device0.createCommandEncoder({});
try {
computePassEncoder64.setBindGroup(1, bindGroup143, new Uint32Array(176), 0, 0);
} catch {}
try {
computePassEncoder174.setPipeline(pipeline0);
} catch {}
try {
renderPassEncoder63.setIndexBuffer(buffer47, 'uint16', 758, 1_681);
} catch {}
let promise22 = device0.queue.onSubmittedWorkDone();
try {
device0.queue.copyExternalImageToTexture(/*
{width: 47, height: 1, depthOrArrayLayers: 1}
*/
{
  source: offscreenCanvas2,
  origin: { x: 0, y: 32 },
  flipY: false,
}, {
  texture: texture33,
  mipLevel: 0,
  origin: {x: 6, y: 0, z: 0},
  aspect: 'all',
  colorSpace: 'srgb',
  premultipliedAlpha: true,
}, {width: 0, height: 0, depthOrArrayLayers: 0});
} catch {}
document.body.prepend(canvas3);
videoFrame0.close();
videoFrame1.close();
videoFrame2.close();
videoFrame3.close();
videoFrame4.close();
videoFrame5.close();
videoFrame6.close();
videoFrame7.close();
videoFrame8.close();
videoFrame10.close();
videoFrame11.close();
videoFrame12.close();
videoFrame13.close();
videoFrame14.close();
videoFrame15.close();
videoFrame16.close();
videoFrame17.close();
videoFrame19.close();
videoFrame20.close();
}

onload = async () => {
  try {
  let sharedScript = document.querySelector('#shared').textContent;

  let workers = [

  ];
  let promises = [ window0(), window1() ];
  log('promises created');
  let results = await Promise.allSettled(promises);
  for (let result of results) {
    if (result.status === 'rejected') { throw result.reason; }
  }
  log('the end')
  log(location);
  } catch (e) {
    log('error');
    log(e);
    log(e[Symbol.toStringTag]);
    log(e.stack);
    if (e instanceof GPUPipelineError) {
      log(`${e} - ${e.reason}`);
      
    } else if (e instanceof DOMException) {
      if (e.name === 'OperationError') {
      log(e.message);
      
      } else if (e.name === 'InvalidStateError') {
      } else {
        log(e);
        
      }
    } else if (e instanceof GPUValidationError) {
      
    } else if (e instanceof GPUOutOfMemoryError) {
      
    } else if (e instanceof TypeError) {
      log(e);
      
    } else {
      log('unexpected error type');
      log(e);
      
    }
  }
  debug('Pass')
    globalThis.testRunner?.notifyDone();
};
</script>

