From 121a02b487fb7bb6b3a1b2b4a9eb01c3161b6eda Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Fri, 22 May 2026 00:04:56 -0400 Subject: [PATCH 1/2] feat(shaders): add RadialProgress shader for circular progress / countdown UIs A new sibling to LinearGradient / RadialGradient that draws a stroked ring filled to a `progress` value, with a gradient swept along the arc, a background track, and configurable round/butt end caps. Implemented for both WebGL and Canvas2D backends. Single-node, one draw call, animatable via `progress: 0..1`. Co-Authored-By: Claude Opus 4.7 (1M context) --- examples/common/installShaders.ts | 1 + examples/tests/shader-radial-progress.ts | 121 +++++++++++++ exports/canvas-shaders.ts | 1 + exports/webgl-shaders.ts | 1 + src/core/shaders/canvas/RadialProgress.ts | 113 ++++++++++++ .../templates/RadialProgressTemplate.test.ts | 125 ++++++++++++++ .../templates/RadialProgressTemplate.ts | 112 ++++++++++++ src/core/shaders/webgl/RadialProgress.ts | 163 ++++++++++++++++++ 8 files changed, 637 insertions(+) create mode 100644 examples/tests/shader-radial-progress.ts create mode 100644 src/core/shaders/canvas/RadialProgress.ts create mode 100644 src/core/shaders/templates/RadialProgressTemplate.test.ts create mode 100644 src/core/shaders/templates/RadialProgressTemplate.ts create mode 100644 src/core/shaders/webgl/RadialProgress.ts diff --git a/examples/common/installShaders.ts b/examples/common/installShaders.ts index 7f42c7f..ee2ae7b 100644 --- a/examples/common/installShaders.ts +++ b/examples/common/installShaders.ts @@ -25,4 +25,5 @@ export async function installShaders(stage: Stage, renderMode: string) { stage.shManager.registerShaderType('HolePunch', shaders.HolePunch); stage.shManager.registerShaderType('RadialGradient', shaders.RadialGradient); stage.shManager.registerShaderType('LinearGradient', shaders.LinearGradient); + stage.shManager.registerShaderType('RadialProgress', shaders.RadialProgress); } diff --git a/examples/tests/shader-radial-progress.ts b/examples/tests/shader-radial-progress.ts new file mode 100644 index 0000000..568e28a --- /dev/null +++ b/examples/tests/shader-radial-progress.ts @@ -0,0 +1,121 @@ +import type { ExampleSettings } from '../common/ExampleSettings.js'; + +export async function automation(settings: ExampleSettings) { + await test(settings); + await settings.snapshot(); +} + +export default async function test({ renderer, testRoot }: ExampleSettings) { + // 1. Fill-up animation: progress 0 → 1, looping. Cyan ring on a dim track. + const fillRing = renderer.createNode({ + x: 40, + y: 40, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 16, + progress: 0, + colors: [0x4aff80ff], + trackColor: 0x1c3a2aff, + }), + parent: testRoot, + }); + + // fillRing + // .animate( + // { shaderProps: { progress: 1 } }, + // { duration: 2000, loop: true, easing: 'linear' }, + // ) + // .start(); + + // 2. Countdown animation: progress 1 → 0, looping. Matches the reference + // screenshot recipe (blue arc, dim blue track). + const countdownRing = renderer.createNode({ + x: 380, + y: 40, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 14, + progress: 1, + colors: [0x4aa3ffff], + trackColor: 0x1f3a5cff, + }), + parent: testRoot, + }); + + // countdownRing + // .animate( + // { shaderProps: { progress: 0 } }, + // { duration: 2000, loop: true, easing: 'linear' }, + // ) + // .start(); + + // 3. Multi-stop gradient swept along the arc, 50% progress + renderer.createNode({ + x: 720, + y: 40, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 24, + progress: 0.5, + colors: [0x4aa3ffff, 0x9ad6ffff, 0xffffffff], + trackColor: 0x1f3a5c66, + }), + parent: testRoot, + }); + + // 4. Counter-clockwise, butt caps, partial sweep + renderer.createNode({ + x: 40, + y: 380, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 20, + progress: 0.35, + direction: -1, + cap: 0, + colors: [0xff66aaff, 0xffaa66ff], + trackColor: 0x33333366, + }), + parent: testRoot, + }); + + // 5. Full ring with multi-stop sweep (no track) + renderer.createNode({ + x: 380, + y: 380, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 18, + progress: 1, + colors: [0xff0080ff, 0xffaa00ff, 0x00ffaaff, 0xff0080ff], + }), + parent: testRoot, + }); + + // 6. Custom startAngle (9 o'clock), 80% progress + renderer.createNode({ + x: 720, + y: 380, + w: 300, + h: 300, + color: 0x00000000, + shader: renderer.createShader('RadialProgress', { + width: 12, + progress: 0.8, + startAngle: Math.PI, + colors: [0xffffffff], + trackColor: 0x33333366, + }), + parent: testRoot, + }); +} diff --git a/exports/canvas-shaders.ts b/exports/canvas-shaders.ts index 5d530e7..9544802 100644 --- a/exports/canvas-shaders.ts +++ b/exports/canvas-shaders.ts @@ -9,3 +9,4 @@ export { Shadow } from '../src/core/shaders/canvas/Shadow.js'; export { HolePunch } from '../src/core/shaders/canvas/HolePunch.js'; export { LinearGradient } from '../src/core/shaders/canvas/LinearGradient.js'; export { RadialGradient } from '../src/core/shaders/canvas/RadialGradient.js'; +export { RadialProgress } from '../src/core/shaders/canvas/RadialProgress.js'; diff --git a/exports/webgl-shaders.ts b/exports/webgl-shaders.ts index e701037..5616991 100644 --- a/exports/webgl-shaders.ts +++ b/exports/webgl-shaders.ts @@ -9,4 +9,5 @@ export { Shadow } from '../src/core/shaders/webgl/Shadow.js'; export { HolePunch } from '../src/core/shaders/webgl/HolePunch.js'; export { LinearGradient } from '../src/core/shaders/webgl/LinearGradient.js'; export { RadialGradient } from '../src/core/shaders/webgl/RadialGradient.js'; +export { RadialProgress } from '../src/core/shaders/webgl/RadialProgress.js'; export { Default } from '../src/core/shaders/webgl/Default.js'; diff --git a/src/core/shaders/canvas/RadialProgress.ts b/src/core/shaders/canvas/RadialProgress.ts new file mode 100644 index 0000000..9cffdcf --- /dev/null +++ b/src/core/shaders/canvas/RadialProgress.ts @@ -0,0 +1,113 @@ +import type { CanvasShaderType } from '../../renderers/canvas/CanvasShaderNode.js'; +import { + RadialProgressTemplate, + type RadialProgressProps, +} from '../templates/RadialProgressTemplate.js'; + +export interface ComputedRadialProgressValues { + cx: number; + cy: number; + radius: number; + colorChannels: number[][]; // [r,g,b,a] per stop color, 0..255 (a in 0..1) + trackColor: string | null; +} + +const SEGMENTS = 64; + +function lerpColor(a: number[], b: number[], t: number): string { + const r = Math.round(a[0]! + (b[0]! - a[0]!) * t); + const g = Math.round(a[1]! + (b[1]! - a[1]!) * t); + const bl = Math.round(a[2]! + (b[2]! - a[2]!) * t); + const al = a[3]! + (b[3]! - a[3]!) * t; + return `rgba(${r},${g},${bl},${al})`; +} + +function colorAt(channels: number[][], stops: number[], t: number): string { + const last = channels.length - 1; + if (t <= stops[0]!) return lerpColor(channels[0]!, channels[0]!, 0); + if (t >= stops[last]!) return lerpColor(channels[last]!, channels[last]!, 0); + for (let i = 0; i < last; i++) { + const left = stops[i]!; + const right = stops[i + 1]!; + if (t >= left && t <= right) { + const lt = (t - left) / (right - left); + return lerpColor(channels[i]!, channels[i + 1]!, lt); + } + } + return lerpColor(channels[last]!, channels[last]!, 0); +} + +function toChannels(rgba: number): number[] { + return [ + (rgba >>> 24) & 0xff, + (rgba >>> 16) & 0xff, + (rgba >>> 8) & 0xff, + (rgba & 0xff) / 255, + ]; +} + +export const RadialProgress: CanvasShaderType< + RadialProgressProps, + ComputedRadialProgressValues +> = { + props: RadialProgressTemplate.props, + update(node) { + const props = this.props!; + const autoRadius = Math.min(node.w, node.h) * 0.5 - props.width * 0.5; + const radius = props.radius > 0 ? props.radius : autoRadius; + + const colorChannels: number[][] = []; + for (let i = 0; i < props.colors.length; i++) { + colorChannels.push(toChannels(props.colors[i]!)); + } + + this.computed = { + cx: node.w * 0.5, + cy: node.h * 0.5, + radius, + colorChannels, + trackColor: + props.trackColor !== 0 ? this.toColorString(props.trackColor) : null, + }; + }, + render(ctx, node, renderContext) { + renderContext(); + const { cx, cy, radius, colorChannels, trackColor } = this + .computed as ComputedRadialProgressValues; + const { tx, ty } = node.globalTransform!; + const props = this.props!; + const { width, progress, startAngle, direction, cap } = props; + const stops = props.stops; + + const ax = tx + cx; + const ay = ty + cy; + + ctx.lineWidth = width; + ctx.lineCap = cap === 1 ? 'round' : 'butt'; + + if (trackColor !== null) { + ctx.strokeStyle = trackColor; + ctx.beginPath(); + ctx.arc(ax, ay, radius, 0, Math.PI * 2); + ctx.stroke(); + } + + if (progress <= 0) return; + + const sweep = Math.PI * 2 * progress * direction; + const step = sweep / SEGMENTS; + // Overlap segments by a tiny amount so the seams don't show on canvas AA + const overlap = Math.abs(step) * 0.02; + + for (let i = 0; i < SEGMENTS; i++) { + const t = i / (SEGMENTS - 1); + ctx.strokeStyle = colorAt(colorChannels, stops, t); + ctx.beginPath(); + const a0 = startAngle + step * i; + const a1 = + startAngle + step * (i + 1) + (direction === 1 ? overlap : -overlap); + ctx.arc(ax, ay, radius, a0, a1, direction === -1); + ctx.stroke(); + } + }, +}; diff --git a/src/core/shaders/templates/RadialProgressTemplate.test.ts b/src/core/shaders/templates/RadialProgressTemplate.test.ts new file mode 100644 index 0000000..732bbd6 --- /dev/null +++ b/src/core/shaders/templates/RadialProgressTemplate.test.ts @@ -0,0 +1,125 @@ +import { describe, it, expect } from 'vitest'; +import { + RadialProgressTemplate, + type RadialProgressProps, +} from './RadialProgressTemplate.js'; +import { + isAdvancedShaderProp, + resolveShaderProps, +} from '../../renderers/CoreShaderNode.js'; + +function resolve(input: Partial): RadialProgressProps { + const props = { ...input } as Record; + resolveShaderProps(props, RadialProgressTemplate.props as never); + return props as unknown as RadialProgressProps; +} + +describe('RadialProgressTemplate', () => { + describe('progress', () => { + const cfg = RadialProgressTemplate.props!.progress; + if (!isAdvancedShaderProp(cfg)) + throw new Error('progress should be advanced'); + + it('clamps values below 0 to 0', () => { + expect(cfg.resolve!(-0.5, {} as never)).toBe(0); + }); + + it('clamps values above 1 to 1', () => { + expect(cfg.resolve!(2, {} as never)).toBe(1); + }); + + it('passes through in-range values', () => { + expect(cfg.resolve!(0.42, {} as never)).toBe(0.42); + }); + + it('returns default when undefined', () => { + expect(cfg.resolve!(undefined as never, {} as never)).toBe(1); + }); + }); + + describe('colors', () => { + const cfg = RadialProgressTemplate.props!.colors; + if (!isAdvancedShaderProp(cfg)) + throw new Error('colors should be advanced'); + + it('falls back to default on undefined', () => { + expect(cfg.resolve!(undefined as never, {} as never)).toEqual([ + 0xffffffff, + ]); + }); + + it('falls back to default on empty array', () => { + expect(cfg.resolve!([] as never, {} as never)).toEqual([0xffffffff]); + }); + + it('passes through user-provided colors', () => { + const input = [0xff0000ff, 0x00ff00ff]; + expect(cfg.resolve!(input, {} as never)).toEqual(input); + }); + }); + + describe('stops', () => { + const cfg = RadialProgressTemplate.props!.stops; + if (!isAdvancedShaderProp(cfg)) throw new Error('stops should be advanced'); + + it('auto-distributes when omitted (n=3)', () => { + const out = cfg.resolve!( + undefined as never, + { + colors: [1, 2, 3], + } as never, + ); + expect(out).toEqual([0, 0.5, 1]); + }); + + it('auto-distributes when length mismatches', () => { + const out = cfg.resolve!( + [0, 1] as never, + { + colors: [1, 2, 3], + } as never, + ); + expect(out).toEqual([0, 0.5, 1]); + }); + + it('handles single color (n=1) without NaN', () => { + const out = cfg.resolve!(undefined as never, { colors: [1] } as never); + expect(out).toEqual([0]); + }); + + it('passes through valid stops', () => { + const out = cfg.resolve!( + [0, 0.3, 1] as never, + { + colors: [1, 2, 3], + } as never, + ); + expect(out).toEqual([0, 0.3, 1]); + }); + }); + + describe('defaults via resolveShaderProps', () => { + it('applies all defaults when no props given', () => { + const r = resolve({}); + expect(r.width).toBe(8); + expect(r.radius).toBe(0); + expect(r.progress).toBe(1); + expect(r.startAngle).toBeCloseTo(-Math.PI / 2); + expect(r.direction).toBe(1); + expect(r.colors).toEqual([0xffffffff]); + expect(r.stops).toEqual([0]); + expect(r.trackColor).toBe(0x00000000); + expect(r.cap).toBe(1); + }); + + it('clamps progress through full resolution path', () => { + const r = resolve({ progress: 1.5 }); + expect(r.progress).toBe(1); + }); + + it('auto-distributes stops through full resolution path', () => { + const r = resolve({ colors: [0xff0000ff, 0x00ff00ff, 0x0000ffff] }); + expect(r.stops).toEqual([0, 0.5, 1]); + }); + }); +}); diff --git a/src/core/shaders/templates/RadialProgressTemplate.ts b/src/core/shaders/templates/RadialProgressTemplate.ts new file mode 100644 index 0000000..f6cced5 --- /dev/null +++ b/src/core/shaders/templates/RadialProgressTemplate.ts @@ -0,0 +1,112 @@ +import type { CoreShaderType } from '../../renderers/CoreShaderNode.js'; + +/** + * Properties of the {@link RadialProgress} shader + */ +export interface RadialProgressProps { + /** + * Stroke width of the ring in pixels + * + * @default 8 + */ + width: number; + /** + * Outer radius of the ring in pixels. When 0, auto-fits the node: + * `min(node.w, node.h) / 2 - width / 2` + * + * @default 0 + */ + radius: number; + /** + * Portion of the ring that is filled, in `[0, 1]` + * + * @default 1 + */ + progress: number; + /** + * Angle (in radians) where the filled arc starts. `-PI/2` is 12 o'clock. + * + * @default -Math.PI / 2 + */ + startAngle: number; + /** + * Sweep direction. `1` = clockwise, `-1` = counter-clockwise. + * + * @default 1 + */ + direction: 1 | -1; + /** + * Colors swept along the filled arc. + * + * @default [0xffffffff] + */ + colors: number[]; + /** + * Color stops along the filled arc, in `[0, 1]`. Auto-distributed when omitted + * or when length doesn't match `colors`. + */ + stops: number[]; + /** + * Background ring color (drawn under the full circle). `0x00000000` disables. + * + * @default 0x00000000 + */ + trackColor: number; + /** + * Arc end-cap style. `0` = butt, `1` = round. + * + * @default 1 + */ + cap: 0 | 1; +} + +export const RadialProgressTemplate: CoreShaderType = { + props: { + width: 8, + radius: 0, + progress: { + default: 1, + resolve(value) { + if (value === undefined) return this.default; + if (value < 0) return 0; + if (value > 1) return 1; + return value; + }, + }, + startAngle: -Math.PI / 2, + direction: 1, + colors: { + default: [0xffffffff], + resolve(value) { + if (value !== undefined && value.length > 0) { + return value; + } + return ([] as number[]).concat(this.default); + }, + }, + stops: { + default: [0], + resolve(value, props) { + if (value !== undefined && value.length === props.colors.length) { + return value; + } + if (value === undefined) { + value = []; + } + const len = props.colors.length; + if (len === 1) { + value[0] = 0; + value.length = 1; + return value; + } + for (let i = 0; i < len; i++) { + value[i] = i * (1 / (len - 1)); + } + value.length = len; + return value; + }, + }, + trackColor: 0x00000000, + cap: 1, + }, +}; diff --git a/src/core/shaders/webgl/RadialProgress.ts b/src/core/shaders/webgl/RadialProgress.ts new file mode 100644 index 0000000..36772a3 --- /dev/null +++ b/src/core/shaders/webgl/RadialProgress.ts @@ -0,0 +1,163 @@ +import type { CoreNode } from '../../CoreNode.js'; +import { getNormalizedRgbaComponents } from '../../lib/utils.js'; +import { + RadialProgressTemplate, + type RadialProgressProps, +} from '../templates/RadialProgressTemplate.js'; +import type { WebGlShaderType } from '../../renderers/webgl/WebGlShaderNode.js'; +import type { WebGlRenderer } from '../../renderers/webgl/WebGlRenderer.js'; + +export const RadialProgress: WebGlShaderType = { + props: RadialProgressTemplate.props, + update(node: CoreNode) { + const props = this.props!; + + const autoRadius = Math.min(node.w, node.h) * 0.5 - props.width * 0.5; + const radius = props.radius > 0 ? props.radius : autoRadius; + + this.uniform2f('u_center', node.w * 0.5, node.h * 0.5); + this.uniform1f('u_radius', radius); + this.uniform1f('u_width', props.width); + this.uniform1f('u_progress', props.progress); + this.uniform1f('u_startAngle', props.startAngle); + this.uniform1f('u_direction', props.direction); + this.uniform1fv('u_stops', new Float32Array(props.stops)); + + const colors: number[] = []; + for (let i = 0; i < props.colors.length; i++) { + const norm = getNormalizedRgbaComponents(props.colors[i]!); + colors.push(norm[0]!, norm[1]!, norm[2]!, norm[3]!); + } + this.uniform4fv('u_colors', new Float32Array(colors)); + + const trackNorm = getNormalizedRgbaComponents(props.trackColor); + this.uniform4f( + 'u_trackColor', + trackNorm[0]!, + trackNorm[1]!, + trackNorm[2]!, + trackNorm[3]!, + ); + }, + getCacheMarkers(props: RadialProgressProps) { + return `colors:${props.colors.length}|cap:${props.cap}|track:${ + props.trackColor !== 0 ? 1 : 0 + }`; + }, + fragment(renderer: WebGlRenderer, props: RadialProgressProps) { + const maxStops = Math.max(props.colors.length, 1); + return ` + # ifdef GL_FRAGMENT_PRECISION_HIGH + precision highp float; + # else + precision mediump float; + # endif + + #define MAX_STOPS ${maxStops} + #define LAST_STOP ${maxStops - 1} + #define CAP_ROUND ${props.cap} + #define HAS_TRACK ${props.trackColor !== 0 ? 1 : 0} + + #define TWO_PI 6.28318530717958647692 + + uniform float u_alpha; + uniform vec2 u_dimensions; + uniform sampler2D u_texture; + + uniform vec2 u_center; + uniform float u_radius; + uniform float u_width; + uniform float u_progress; + uniform float u_startAngle; + uniform float u_direction; + + uniform float u_stops[MAX_STOPS]; + uniform vec4 u_colors[MAX_STOPS]; + uniform vec4 u_trackColor; + + varying vec4 v_color; + varying vec2 v_textureCoords; + varying vec2 v_nodeCoords; + + vec4 getGradientColor(float dist) { + dist = clamp(dist, 0.0, 1.0); + + if (dist <= u_stops[0]) { + return u_colors[0]; + } + if (dist >= u_stops[LAST_STOP]) { + return u_colors[LAST_STOP]; + } + for (int i = 0; i < LAST_STOP; i++) { + float left = u_stops[i]; + float right = u_stops[i + 1]; + if (dist >= left && dist <= right) { + float lDist = smoothstep(left, right, dist); + return mix(u_colors[i], u_colors[i + 1], lDist); + } + } + return u_colors[LAST_STOP]; + } + + // Coverage of a disc centered at \`c\` with radius \`r\` at pixel \`p\` (with 1px AA) + float discCoverage(vec2 p, vec2 c, float r) { + return 1.0 - smoothstep(r - 1.0, r + 1.0, length(p - c)); + } + + void main() { + vec4 base = texture2D(u_texture, v_textureCoords) * v_color; + + vec2 p = v_nodeCoords.xy * u_dimensions - u_center; + float dist = length(p); + float halfW = u_width * 0.5; + + // Ring coverage: 1 inside the stroke band, 0 outside (with 1px AA on both edges) + float ringCoverage = + smoothstep(u_radius - halfW - 1.0, u_radius - halfW + 1.0, dist) * + (1.0 - smoothstep(u_radius + halfW - 1.0, u_radius + halfW + 1.0, dist)); + + // Angle along the arc, normalized to [0, 1) starting at u_startAngle + float ang = atan(p.y, p.x); + float t = mod((ang - u_startAngle) * u_direction, TWO_PI) / TWO_PI; + + // Filled arc coverage (1 if in filled arc, else 0). When progress >= 1 the + // whole ring is filled regardless of \`t\` -- guards against the mod() seam. + float arcCoverage = u_progress >= 1.0 ? 1.0 : step(t, u_progress); + float fillCoverage = ringCoverage * arcCoverage; + + #if CAP_ROUND + // Round caps: discs of radius halfW at the start and head of the arc + float a0 = u_startAngle; + float a1 = u_startAngle + u_direction * u_progress * TWO_PI; + vec2 cap0 = vec2(cos(a0), sin(a0)) * u_radius; + vec2 cap1 = vec2(cos(a1), sin(a1)) * u_radius; + float capMask = max(discCoverage(p, cap0, halfW), discCoverage(p, cap1, halfW)); + // Caps only visible when there's something to cap (progress > 0 and < 1). + float capGate = step(0.0001, u_progress) * step(u_progress, 0.9999); + fillCoverage = max(fillCoverage, capMask * capGate); + #endif + + // Sample gradient. Normalize \`t\` to the *filled* portion so the gradient + // spans the visible arc end-to-end regardless of progress. + float gradT = u_progress > 0.0 ? clamp(t / u_progress, 0.0, 1.0) : 0.0; + vec4 fillCol = getGradientColor(gradT); + + // Composite: track under fill (if track enabled), both gated by ringCoverage + vec4 layer = vec4(0.0); + #if HAS_TRACK + float trackCoverage = ringCoverage * (1.0 - fillCoverage); + layer = u_trackColor * trackCoverage + fillCol * fillCoverage; + #else + layer = fillCol * fillCoverage; + #endif + + // Composite layer over base. Output alpha = base.a + layer.a*(1-base.a) + // so the ring is visible even when the node's base color is fully transparent. + float la = clamp(layer.a, 0.0, 1.0); + vec3 blended = mix(base.rgb, layer.rgb, la); + float outA = base.a + la * (1.0 - base.a); + gl_FragColor = vec4(blended, outA); + } + `; + }, +}; From 6a7e211f903054828da280dbcd367fd00b4d7140 Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Fri, 22 May 2026 08:22:58 -0400 Subject: [PATCH 2/2] add screenshot --- .../chromium-ci/shader-radial-progress-1.png | Bin 0 -> 52463 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 visual-regression/certified-snapshots/chromium-ci/shader-radial-progress-1.png diff --git a/visual-regression/certified-snapshots/chromium-ci/shader-radial-progress-1.png b/visual-regression/certified-snapshots/chromium-ci/shader-radial-progress-1.png new file mode 100644 index 0000000000000000000000000000000000000000..84d1bced426d10c4071bd12c74e42cf55ab89cc6 GIT binary patch literal 52463 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 z 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 Ll_bhPnFRemiM}m# literal 0 HcmV?d00001