From 5016fe2bccc9dc9219a66b8cc54471b194949abf Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 2 Aug 2024 10:07:28 +0800 Subject: [PATCH] feat(plugins): add minimap plugin (#6103) * feat(event): before draw, after draw will info whether to be render * feat(plugins): add minimap plugin * refactor(plugins): add container style * refactor(plugins): remove DOMRect, add renderer option * test: adjust minimap demo * chore(test): config playwright test env * test(plugins): add test case for minimap * chore: update test config * refactor: remove useless comment --------- Co-authored-by: antv --- .github/workflows/build.yml | 10 +- .gitignore | 4 + package.json | 2 + packages/g6/__tests__/demos/index.ts | 1 + packages/g6/__tests__/demos/plugin-minimap.ts | 27 + .../unit/runtime/graph/event.spec.ts | 38 ++ packages/g6/jest.config.js | 2 +- packages/g6/src/exports.ts | 2 + packages/g6/src/plugins/index.ts | 2 + packages/g6/src/plugins/minimap/index.ts | 512 ++++++++++++++++++ packages/g6/src/registry/build-in.ts | 2 + packages/g6/src/runtime/element.ts | 18 +- packages/g6/src/runtime/graph.ts | 2 +- playwright.config.ts | 78 +++ tests/g6/plugins/plugins-minimap.spec.ts | 49 ++ ...ugin-minimap-default-1-chromium-darwin.png | Bin 0 -> 16816 bytes ...ugin-minimap-default-2-chromium-darwin.png | Bin 0 -> 15009 bytes ...ugin-minimap-default-3-chromium-darwin.png | Bin 0 -> 13909 bytes ...ugin-minimap-default-4-chromium-darwin.png | Bin 0 -> 12168 bytes ...ugin-minimap-default-5-chromium-darwin.png | Bin 0 -> 11817 bytes ...ugin-minimap-default-6-chromium-darwin.png | Bin 0 -> 12131 bytes 21 files changed, 742 insertions(+), 7 deletions(-) create mode 100644 packages/g6/__tests__/demos/plugin-minimap.ts create mode 100644 packages/g6/src/plugins/minimap/index.ts create mode 100644 playwright.config.ts create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-1-chromium-darwin.png create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-2-chromium-darwin.png create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-3-chromium-darwin.png create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-4-chromium-darwin.png create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-5-chromium-darwin.png create mode 100644 tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-6-chromium-darwin.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d36542e0d1..5395ca2ca46 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,13 +31,19 @@ jobs: run: | npm run ci + - name: Run Playwright tests + run: | + pnpm exec playwright install chromium + pnpm exec playwright test + - name: Upload blob report to GitHub Actions Artifacts if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: snapshots + name: report path: | packages/g6/__tests__/snapshots/**/*-actual.svg + playwright-report/ retention-days: 1 - name: Coveralls GitHub Action diff --git a/.gitignore b/.gitignore index abe4bc6e984..ab956c19dac 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ stats.html # Tools .turbo **/tmp/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/package.json b/package.json index e234b397e8d..61f07b7f80c 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "build": "turbo build --filter=!@antv/g6-site", "ci": "turbo run ci --filter=!@antv/g6-site", "contribute": "node ./scripts/contribute.mjs", + "dev:g6": "cd ./packages/g6 && npm run dev", "postinstall": "husky install", "prepare": "husky install", "publish": "pnpm publish -r --publish-branch v5", @@ -30,6 +31,7 @@ "@changesets/cli": "^2.27.7", "@commitlint/cli": "^18.6.1", "@commitlint/config-conventional": "^18.6.3", + "@playwright/test": "^1.45.3", "@rollup/plugin-commonjs": "^25.0.8", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", diff --git a/packages/g6/__tests__/demos/index.ts b/packages/g6/__tests__/demos/index.ts index 6a390c24ce2..8433f1dbfe9 100644 --- a/packages/g6/__tests__/demos/index.ts +++ b/packages/g6/__tests__/demos/index.ts @@ -112,6 +112,7 @@ export { pluginGridLine } from './plugin-grid-line'; export { pluginHistory } from './plugin-history'; export { pluginHull } from './plugin-hull'; export { pluginLegend } from './plugin-legend'; +export { pluginMinimap } from './plugin-minimap'; export { pluginTimebar } from './plugin-timebar'; export { pluginToolbarBuildIn } from './plugin-toolbar-build-in'; export { pluginToolbarIconfont } from './plugin-toolbar-iconfont'; diff --git a/packages/g6/__tests__/demos/plugin-minimap.ts b/packages/g6/__tests__/demos/plugin-minimap.ts new file mode 100644 index 00000000000..5e603d95a0b --- /dev/null +++ b/packages/g6/__tests__/demos/plugin-minimap.ts @@ -0,0 +1,27 @@ +import { Graph } from '@/src'; +import { Renderer } from '@antv/g-svg'; + +export const pluginMinimap: TestCase = async (context) => { + const graph = new Graph({ + ...context, + data: { nodes: Array.from({ length: 20 }).map((_, i) => ({ id: `node${i}` })) }, + behaviors: ['drag-canvas', 'zoom-canvas', 'drag-element'], + plugins: [ + { + key: 'minimap', + type: 'minimap', + size: [240, 160], + renderer: new Renderer(), + }, + ], + node: { + palette: 'spectral', + }, + layout: { type: 'circular' }, + autoFit: 'view', + }); + + await graph.render(); + + return graph; +}; diff --git a/packages/g6/__tests__/unit/runtime/graph/event.spec.ts b/packages/g6/__tests__/unit/runtime/graph/event.spec.ts index 91321bbb5f8..afc1187fe15 100644 --- a/packages/g6/__tests__/unit/runtime/graph/event.spec.ts +++ b/packages/g6/__tests__/unit/runtime/graph/event.spec.ts @@ -183,4 +183,42 @@ describe('event', () => { expect(beforeRendererChange).toHaveBeenCalledTimes(1); expect(afterRendererChange).toHaveBeenCalledTimes(1); }); + + it('draw event', async () => { + const graph = createGraph({ + data: { + nodes: [{ id: 'node-1' }, { id: 'node-2' }], + edges: [{ id: 'edge-1', source: 'node-1', target: 'node-2' }], + }, + }); + + const beforeDraw = jest.fn(); + const afterDraw = jest.fn(); + + graph.on(GraphEvent.BEFORE_DRAW, (event: any) => { + beforeDraw(event.data.render); + }); + graph.on(GraphEvent.AFTER_DRAW, (event: any) => { + afterDraw(event.data.render); + }); + + await graph.render(); + + expect(beforeDraw).toHaveBeenCalledTimes(1); + expect(beforeDraw.mock.calls[0][0]).toBe(true); + expect(afterDraw).toHaveBeenCalledTimes(1); + expect(afterDraw.mock.calls[0][0]).toBe(true); + + beforeDraw.mockClear(); + afterDraw.mockClear(); + + graph.addNodeData([{ id: 'node-3' }]); + + await graph.draw(); + + expect(beforeDraw).toHaveBeenCalledTimes(1); + expect(beforeDraw.mock.calls[0][0]).toBe(false); + expect(afterDraw).toHaveBeenCalledTimes(1); + expect(afterDraw.mock.calls[0][0]).toBe(false); + }); }); diff --git a/packages/g6/jest.config.js b/packages/g6/jest.config.js index b283adbbce2..4ecf9952329 100644 --- a/packages/g6/jest.config.js +++ b/packages/g6/jest.config.js @@ -21,7 +21,7 @@ module.exports = { '^.+\\.svg$': ['/__tests__/utils/svg-transformer.js'], }, collectCoverageFrom: ['src/**/*.ts'], - coveragePathIgnorePatterns: ['/src/elements/nodes/html.ts'], + coveragePathIgnorePatterns: ['/src/elements/nodes/html.ts', '/src/plugins/minimap'], moduleFileExtensions: ['ts', 'tsx', 'js', 'json'], collectCoverage: true, testRegex: '(/__tests__/.*\\.(test|spec))\\.(ts|tsx|js)$', diff --git a/packages/g6/src/exports.ts b/packages/g6/src/exports.ts index d75c7405946..c73077ce131 100644 --- a/packages/g6/src/exports.ts +++ b/packages/g6/src/exports.ts @@ -72,6 +72,7 @@ export { History, Hull, Legend, + Minimap, Timebar, Toolbar, Tooltip, @@ -168,6 +169,7 @@ export type { HistoryOptions, HullOptions, LegendOptions, + MinimapOptions, TimebarOptions, ToolbarOptions, TooltipOptions, diff --git a/packages/g6/src/plugins/index.ts b/packages/g6/src/plugins/index.ts index d76e5fe39d4..7b90388106f 100644 --- a/packages/g6/src/plugins/index.ts +++ b/packages/g6/src/plugins/index.ts @@ -8,6 +8,7 @@ export { GridLine } from './grid-line'; export { History } from './history'; export { Hull } from './hull'; export { Legend } from './legend'; +export { Minimap } from './minimap'; export { Timebar } from './timebar'; export { Toolbar } from './toolbar'; export { Tooltip } from './tooltip'; @@ -23,6 +24,7 @@ export type { GridLineOptions } from './grid-line'; export type { HistoryOptions } from './history'; export type { HullOptions } from './hull'; export type { LegendOptions } from './legend'; +export type { MinimapOptions } from './minimap'; export type { TimebarOptions } from './timebar'; export type { ToolbarOptions } from './toolbar'; export type { TooltipOptions } from './tooltip'; diff --git a/packages/g6/src/plugins/minimap/index.ts b/packages/g6/src/plugins/minimap/index.ts new file mode 100644 index 00000000000..6cbd7af6d66 --- /dev/null +++ b/packages/g6/src/plugins/minimap/index.ts @@ -0,0 +1,512 @@ +import { Canvas, DisplayObject, IRenderer } from '@antv/g'; +import { Renderer } from '@antv/g-canvas'; +import { throttle } from '@antv/util'; +import { GraphEvent } from '../../constants'; +import type { RuntimeContext } from '../../runtime/types'; +import { GraphData } from '../../spec'; +import type { ElementDatum, ElementType, ID, IGraphLifeCycleEvent, Padding, Placement } from '../../types'; +import { idOf } from '../../utils/id'; +import { parsePadding } from '../../utils/padding'; +import { parsePlacement } from '../../utils/placement'; +import { toPointObject } from '../../utils/point'; +import type { BasePluginOptions } from '../base-plugin'; +import { BasePlugin } from '../base-plugin'; + +/** + * 缩略图插件的配置项 + * + * The configuration item of the Minimap plugin + */ +export interface MinimapOptions extends BasePluginOptions { + /** + * 宽度和高度 + * + * Width and height + */ + size?: [number, number]; + /** + * 内边距 + * + * Padding + * @defaultValue 10 + */ + padding?: Padding; + /** + * 缩略图相对于画布的位置 + * + * The position of the minimap relative to the canvas + * @defaultValue 'right-bottom' + */ + position?: Placement; + /** + * 过滤器,用于过滤不必显示的元素 + * + * Filter, used to filter elements that do not need to be displayed + * @param id - 元素的 id | The id of the element + * @param elementType - 元素的类型 | The type of the element + * @returns 是否显示 | Whether to display + */ + filter?: (id: string, elementType: ElementType) => boolean; + /** + * 元素缩略图形的生成方法 + * + * The method of generating the thumbnail of the element + * @defaultValue 'key' + * @remarks + * + * - 'key' 使用元素的主图形作为缩略图形 + * - 也可以传入一个函数,接收元素的 id 和类型,返回一个图形 + * + * + * - 'key' uses the key shape of the element as the thumbnail graphic + * - You can also pass in a function that receives the id and type of the element and returns a shape + */ + shape?: 'key' | ((id: string, elementType: ElementType) => DisplayObject); + /** + * 缩略图画布类名 + * + * The class name of the minimap canvas + */ + className?: string; + /** + * 缩略图挂载的容器,无则挂载到 Graph 所在容器 + * + * The container where the minimap is mounted, if not, it will be mounted to the container where the Graph is located + */ + container?: HTMLElement | string; + /** + * 缩略图的容器样式,传入外置容器时不生效 + * + * The style of the minimap container, which does not take effect when an external container is passed in + */ + containerStyle?: Partial; + /** + * 遮罩的样式 + * + * The style of the mask + */ + maskStyle?: Partial; + /** + * 渲染器,默认使用 Canvas 渲染器 + * + * Renderer, default to use Canvas renderer + */ + renderer?: IRenderer; +} + +export class Minimap extends BasePlugin { + static defaultOptions: Partial = { + size: [240, 160], + shape: 'key', + padding: 10, + position: 'right-bottom', + maskStyle: { + border: '1px solid #ddd', + background: 'rgba(0, 0, 0, 0.1)', + }, + containerStyle: { + border: '1px solid #ddd', + background: '#fff', + }, + }; + + private canvas!: Canvas; + + constructor(context: RuntimeContext, options: MinimapOptions) { + super(context, Object.assign({}, Minimap.defaultOptions, options)); + this.bindEvents(); + } + + private bindEvents() { + const { graph } = this.context; + graph.on(GraphEvent.AFTER_DRAW, this.onDraw); + graph.on(GraphEvent.AFTER_RENDER, this.onRender); + graph.on(GraphEvent.AFTER_TRANSFORM, this.onTransform); + } + + private unbindEvents() { + const { graph } = this.context; + graph.off(GraphEvent.AFTER_DRAW, this.onDraw); + graph.off(GraphEvent.AFTER_RENDER, this.onRender); + graph.off(GraphEvent.AFTER_TRANSFORM, this.onTransform); + } + + private onDraw = (event: IGraphLifeCycleEvent) => { + if (event?.data?.render) return; + this.onRender(); + }; + + private onRender = throttle( + () => { + this.renderMinimap(); + this.renderMask(); + }, + 32, + { leading: true }, + ) as () => void; + + private shapes = new Map(); + + /** + * 创建或更新缩略图 + * + * Create or update the minimap + */ + private renderMinimap() { + const data = this.getElements(); + const canvas = this.initCanvas(); + this.setShapes(canvas, data); + } + + private getElements(): Required { + const { filter } = this.options; + const { model } = this.context; + const data = model.getData(); + + if (!filter) return data; + + const { nodes, edges, combos } = data; + + return { + nodes: nodes.filter((node) => filter(idOf(node), 'node')), + edges: edges.filter((edge) => filter(idOf(edge), 'edge')), + combos: combos.filter((combo) => filter(idOf(combo), 'combo')), + }; + } + + private setShapes(canvas: Canvas, data: Required) { + const { nodes, edges, combos } = data; + + const { shape } = this.options; + const { element } = this.context; + + if (shape === 'key') { + const ids = new Set(); + + const iterate = (datum: ElementDatum) => { + const id = idOf(datum); + ids.add(id); + + const target = element!.getElement(id)!; + const shape = target.getShape('key'); + const cloneShape = this.shapes.get(id) || shape.cloneNode(); + + cloneShape.setPosition(shape.getPosition()); + // keep zIndex / id + if (target.style.zIndex) cloneShape.style.zIndex = target.style.zIndex; + cloneShape.id = target.id; + + if (!this.shapes.has(id)) { + canvas.appendChild(cloneShape); + this.shapes.set(id, cloneShape); + } else this.shapes.get(id)!.attr(shape.attributes); + }; + + // 注意执行顺序 / Note the execution order + edges.forEach(iterate); + combos.forEach(iterate); + nodes.forEach(iterate); + + this.shapes.forEach((shape, id) => { + if (!ids.has(id)) { + canvas.removeChild(shape); + this.shapes.delete(id); + } + }); + + return; + } + + const setPosition = (id: ID, shape: DisplayObject) => { + const target = element!.getElement(id)!; + const position = target.getPosition(); + shape.setPosition(position); + return shape; + }; + + canvas.removeChildren(); + + edges.forEach((datum) => canvas.appendChild(shape(idOf(datum), 'edge'))); + combos.forEach((datum) => { + canvas.appendChild(setPosition(idOf(datum), shape(idOf(datum), 'combo'))); + }); + nodes.forEach((datum) => { + canvas.appendChild(setPosition(idOf(datum), shape(idOf(datum), 'node'))); + }); + } + + private container!: HTMLElement; + + private calculatePosition(): [number, number] { + const { + position, + size: [w, h], + } = this.options; + + const { canvas } = this.context; + const [width, height] = canvas.getSize(); + const [x, y] = parsePlacement(position); + return [x * (width - w), y * (height - h)]; + } + + private createContainer(): HTMLElement { + const { + container, + className, + size: [width, height], + containerStyle, + } = this.options; + if (container) { + return typeof container === 'string' ? document.querySelector(container)! : container; + } + + const $container = document.createElement('div'); + $container.classList.add('g6-minimap'); + if (className) $container.classList.add(className); + + const [x, y] = this.calculatePosition(); + Object.assign($container.style, { + position: 'absolute', + left: x + 'px', + top: y + 'px', + width: width + 'px', + height: height + 'px', + ...containerStyle, + }); + + return this.context.canvas.getContainer()!.appendChild($container); + } + + private initCanvas() { + const { + renderer, + size: [width, height], + } = this.options; + + if (this.canvas) { + this.canvas.resize(width, height); + if (renderer) this.canvas.setRenderer(renderer); + } else { + const dom = document.createElement('div'); + + const container = this.createContainer(); + this.container = container; + container.appendChild(dom); + + this.canvas = new Canvas({ + width, + height, + container: dom, + renderer: renderer || new Renderer(), + }); + } + + this.setCamera(); + + return this.canvas; + } + + private setCamera() { + const { canvas } = this.context; + + const camera = this.canvas?.getCamera(); + if (!camera) return; + + const { + size: [minimapWidth, minimapHeight], + padding, + } = this.options; + const [top, right, bottom, left] = parsePadding(padding); + const { min: boundsMin, max: boundsMax, center } = canvas.getBounds(); + const boundsWidth = boundsMax[0] - boundsMin[0]; + const boundsHeight = boundsMax[1] - boundsMin[1]; + + const availableWidth = minimapWidth - left - right; + const availableHeight = minimapHeight - top - bottom; + + const scaleX = availableWidth / boundsWidth; + const scaleY = availableHeight / boundsHeight; + const scale = Math.min(scaleX, scaleY); + + camera.setPosition(center); + camera.setFocalPoint(center); + camera.setZoom(scale); + } + + private mask: HTMLElement | null = null; + + private get maskBBox(): [number, number, number, number] { + const { canvas: graphCanvas } = this.context; + const canvasSize = graphCanvas.getSize(); + const canvasMin = graphCanvas.getCanvasByViewport([0, 0]); + const canvasMax = graphCanvas.getCanvasByViewport(canvasSize); + + const maskMin = this.canvas.canvas2Viewport(toPointObject(canvasMin)); + const maskMax = this.canvas.canvas2Viewport(toPointObject(canvasMax)); + + const width = maskMax.x - maskMin.x; + const height = maskMax.y - maskMin.y; + + const zoom = this.context.canvas.getCamera().getZoom(); + + // magic number + const ratio = zoom * 0.5; + const x = maskMin.x - width * ratio; + const y = maskMin.y - height * ratio; + + return [x, y, width, height]; + } + + /** + * 计算遮罩包围盒 + * + * Calculate the bounding box of the mask + * @returns 遮罩包围盒 | Mask bounding box + */ + private calculateMaskBBox(): [number, number, number, number] { + const { + size: [minimapWidth, minimapHeight], + } = this.options; + + let [x, y, width, height] = this.maskBBox; + + // clamp x, y, width, height + if (x < 0) (width = upper(width + x, minimapWidth)), (x = 0); + if (y < 0) (height = upper(height + y, minimapHeight)), (y = 0); + if (x + width > minimapWidth) width = lower(minimapWidth - x, 0); + if (y + height > minimapHeight) height = lower(minimapHeight - y, 0); + + return [upper(x, minimapWidth), upper(y, minimapHeight), lower(width, 0), lower(height, 0)]; + } + + /** + * 创建或更新遮罩 + * + * Create or update the mask + */ + private renderMask() { + const { maskStyle } = this.options; + + if (!this.mask) { + this.mask = document.createElement('div'); + this.mask.addEventListener('pointerdown', this.onMaskDragStart); + } + + this.container.appendChild(this.mask); + + Object.assign(this.mask.style, { + ...maskStyle, + cursor: 'move', + position: 'absolute', + pointerEvents: 'auto', + }); + + this.updateMask(); + } + + private isMaskDragging = false; + + private onMaskDragStart = (event: PointerEvent) => { + if (!this.mask) return; + this.isMaskDragging = true; + this.mask.setPointerCapture(event.pointerId); + this.mask.addEventListener('pointermove', this.onMaskDrag); + this.mask.addEventListener('pointerup', this.onMaskDragEnd); + this.mask.addEventListener('pointercancel', this.onMaskDragEnd); + }; + + private onMaskDrag = (event: PointerEvent) => { + if (!this.mask || !this.isMaskDragging) return; + const { + size: [minimapWidth, minimapHeight], + } = this.options; + const { movementX, movementY } = event; + + const { left, top, width: w, height: h } = this.mask.style; + const [, , fullWidth, fullHeight] = this.maskBBox; + + let x = parseInt(left) + movementX; + let y = parseInt(top) + movementY; + let width = parseInt(w); + let height = parseInt(h); + + // 确保 mask 在 minimap 内部 + // Ensure that the mask is inside the minimap + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x + width > minimapWidth) x = lower(minimapWidth - width, 0); + if (y + height > minimapHeight) y = lower(minimapHeight - height, 0); + + // 当拖拽画布导致 mask 缩小时,拖拽 mask 时,能够恢复到实际大小 + // When dragging the canvas causes the mask to shrink, dragging the mask will restore it to its actual size + if (width < fullWidth) { + if (movementX > 0) (x = lower(x - movementX, 0)), (width = upper(width + movementX, minimapWidth)); + else if (movementX < 0) width = upper(width - movementX, minimapWidth); + } + if (height < fullHeight) { + if (movementY > 0) (y = lower(y - movementY, 0)), (height = upper(height + movementY, minimapHeight)); + else if (movementY < 0) height = upper(height - movementY, minimapHeight); + } + + Object.assign(this.mask.style, { + left: x + 'px', + top: y + 'px', + width: width + 'px', + height: height + 'px', + }); + + // 基于 movement 进行相对移动 + // Move relative to movement + const deltaX = parseInt(left) - x; + const deltaY = parseInt(top) - y; + if (deltaX === 0 && deltaY === 0) return; + + const zoom1 = this.context.canvas.getCamera().getZoom(); + const zoom2 = this.canvas.getCamera().getZoom(); + const ratio = zoom1 / zoom2; + + this.context.graph.translateBy([deltaX * ratio, deltaY * ratio], false); + }; + + private onMaskDragEnd = (event: PointerEvent) => { + if (!this.mask) return; + this.isMaskDragging = false; + this.mask.releasePointerCapture(event.pointerId); + this.mask.removeEventListener('pointermove', this.onMaskDrag); + this.mask.removeEventListener('pointerup', this.onMaskDragEnd); + this.mask.removeEventListener('pointercancel', this.onMaskDragEnd); + }; + + private onTransform = throttle( + () => { + if (this.isMaskDragging) return; + this.updateMask(); + this.setCamera(); + }, + 32, + { leading: true }, + ) as () => void; + + private updateMask() { + if (!this.mask) return; + const [x, y, width, height] = this.calculateMaskBBox(); + + Object.assign(this.mask.style, { + top: y + 'px', + left: x + 'px', + width: width + 'px', + height: height + 'px', + }); + } + + public destroy(): void { + this.unbindEvents(); + this.canvas.destroy(); + this.mask?.remove(); + super.destroy(); + } +} + +const upper = (value: number, max: number) => Math.min(value, max); + +const lower = (value: number, min: number) => Math.max(value, min); diff --git a/packages/g6/src/registry/build-in.ts b/packages/g6/src/registry/build-in.ts index db05397f325..ba9f9fe8a16 100644 --- a/packages/g6/src/registry/build-in.ts +++ b/packages/g6/src/registry/build-in.ts @@ -64,6 +64,7 @@ import { History, Hull, Legend, + Minimap, Timebar, Toolbar, Tooltip, @@ -178,6 +179,7 @@ export const BUILT_IN_EXTENSIONS: ExtensionRegistry = { toolbar: Toolbar, tooltip: Tooltip, watermark: Watermark, + minimap: Minimap, }, transform: { 'update-related-edges': UpdateRelatedEdge, diff --git a/packages/g6/src/runtime/element.ts b/packages/g6/src/runtime/element.ts index 7dbc06e1d0a..850d07fac34 100644 --- a/packages/g6/src/runtime/element.ts +++ b/packages/g6/src/runtime/element.ts @@ -285,18 +285,28 @@ export class ElementController { const { animation, silence } = context; + const { type = 'draw' } = context; + const willRender = type === 'render'; + return this.context.animation!.animate( animation, silence ? {} : { before: () => - this.emit(new GraphLifeCycleEvent(GraphEvent.BEFORE_DRAW, { dataChanges, animation }), context), + this.emit( + new GraphLifeCycleEvent(GraphEvent.BEFORE_DRAW, { dataChanges, animation, render: willRender }), + context, + ), beforeAnimate: (animation) => this.emit(new AnimateEvent(GraphEvent.BEFORE_ANIMATE, AnimationType.DRAW, animation, drawData), context), afterAnimate: (animation) => this.emit(new AnimateEvent(GraphEvent.AFTER_ANIMATE, AnimationType.DRAW, animation, drawData), context), - after: () => this.emit(new GraphLifeCycleEvent(GraphEvent.AFTER_DRAW, { dataChanges, animation }), context), + after: () => + this.emit( + new GraphLifeCycleEvent(GraphEvent.AFTER_DRAW, { dataChanges, animation, render: willRender }), + context, + ), }, ); } @@ -793,11 +803,13 @@ export class ElementController { export interface DrawContext { /** 是否使用动画,默认为 true | Whether to use animation, default is true */ - animation: boolean; + animation?: boolean; /** 当前绘制阶段 | Current draw stage */ stage?: AnimationStage; /** 是否不抛出事件 | Whether not to dispatch events */ silence?: boolean; /** 收起/展开的对象 ID | ID of the object to collapse/expand */ collapseExpandTarget?: ID; + /** 绘制类型 | Draw type */ + type?: 'render' | 'draw'; } diff --git a/packages/g6/src/runtime/graph.ts b/packages/g6/src/runtime/graph.ts index 884174f2692..5da05e3040f 100644 --- a/packages/g6/src/runtime/graph.ts +++ b/packages/g6/src/runtime/graph.ts @@ -1078,7 +1078,7 @@ export class Graph extends EventEmitter { public async render(): Promise { await this.prepare(); emit(this, new GraphLifeCycleEvent(GraphEvent.BEFORE_RENDER)); - const animation = this.context.element!.draw(); + const animation = this.context.element!.draw({ type: 'render' }); await Promise.all([animation?.finished, this.context.layout!.layout()]); await this.autoFit(); emit(this, new GraphLifeCycleEvent(GraphEvent.AFTER_RENDER)); diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000000..c1ee7dd59e3 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,78 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 5 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:8080', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run dev:g6', + url: 'http://localhost:8080', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/tests/g6/plugins/plugins-minimap.spec.ts b/tests/g6/plugins/plugins-minimap.spec.ts new file mode 100644 index 00000000000..7825f6e49ff --- /dev/null +++ b/tests/g6/plugins/plugins-minimap.spec.ts @@ -0,0 +1,49 @@ +import { expect, test } from '@playwright/test'; + +test.describe('plugin minimap', () => { + test('default', async ({ page }) => { + page.goto('/?Demo=pluginMinimap&Renderer=canvas&GridLine=true&Theme=light&Animation=false'); + + await page.waitForSelector('.g6-minimap'); + + const clip = { x: 0, y: 0, width: 500, height: 500 }; + + await expect(page).toHaveScreenshot({ clip }); + + // wheel on to zoom + await page.mouse.move(250, 250); + + // 在 github action 中执行时,滚动的距离需要更大 + // In github action, the scroll distance needs to be larger + await page.mouse.wheel(0, process.env.CI ? 20 : 10); + + await expect(page).toHaveScreenshot({ clip, maxDiffPixels: 100 }); + + await page.mouse.wheel(0, process.env.CI ? -40 : -20); + + await expect(page).toHaveScreenshot({ clip, maxDiffPixels: 100 }); + + // drag minimap mask + await page.mouse.move(400, 425); + await page.mouse.down(); + await page.mouse.move(425, 450, { steps: 10 }); + await page.mouse.up(); + await expect(page).toHaveScreenshot({ clip, maxDiffPixels: 100 }); + + // drag mask overflow + await page.mouse.move(425, 450); + await page.mouse.down(); + await page.mouse.move(550, 550, { steps: 10 }); + await page.mouse.up(); + await expect(page).toHaveScreenshot({ clip, maxDiffPixels: 100 }); + + // drag canvas + // playwright mouse 模拟操作无法正常触发 g canvas 的 drag 事件 + // 因此这里直接调用 graph 实例的方法 + // playwright mouse simulation operation cannot trigger the drag event of g canvas normally + // So here directly call the method of the graph instance + await page.evaluate(() => (window as any).graph.translateTo([100, 100])); + + await expect(page).toHaveScreenshot({ clip, maxDiffPixels: 100 }); + }); +}); diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-1-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-1-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..6271b79d8dff2a430b4f9bc7a2937cb8b9ccd1cc GIT binary patch literal 16816 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�()YoQLr}c#4#Yrzg>6TKE>j32N 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 CDyv-p literal 0 HcmV?d00001 diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-2-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-2-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..77b5441aaec0ec53fbd1d4a55eecee039cad7078 GIT binary patch literal 15009 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 literal 0 HcmV?d00001 diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-3-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-3-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..5f43d0f4112b75f300713c88388fb038c259fa3b GIT binary patch literal 13909 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 GZ~qq|NW#Ye literal 0 HcmV?d00001 diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-4-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-4-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..908a3ab62a1b3903b38fc0702ab8767a57a05032 GIT binary patch literal 12168 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 LlP`a2{_g((AAfL4 literal 0 HcmV?d00001 diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-5-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-5-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..c792d816fbed0bc11f158b1d751f9016b50a8a2f GIT binary patch literal 11817 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 literal 0 HcmV?d00001 diff --git a/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-6-chromium-darwin.png b/tests/g6/plugins/plugins-minimap.spec.ts-snapshots/plugin-minimap-default-6-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..1096bdf05ce08c773a3786996891f4596507381a GIT binary patch literal 12131 zcmch71z3~c|Mn0S1*MUY(9td3;8#iM&H+jzFzFa+(4EpsH`0t6f^mZU@%|| z-ua97U+@2V>;Jyjwrkh+oae;nIp;q2=RS9YmWI+pLOMbK0Ps*nSzZSKz(f7{+`EPQ zN4{Pej{CxM*HL-_s2Zi;0RWx=ROJ8C^T|4Zd;32|2izQu;Sszed8az{gjL&g=36L& zqjuwIUoAsltkMKq>}0d?sQtu|Y7#1~(N`F@U#||AES;Q*rRWn{Y?QV!trg)hhG?6v zkt&e=y7jyQgMF%>${K$=LW=%(`|Jt-(Y-bpllD~Ruhr0*LRq6^7 zec>-pra-AJKhKB|WW583*XQsCXptg_0fc!=c+dYzmI82uyAc5HXdeQ;JQ-vFP|8E` zgWvyO7Xry&1;RLuL!Ngg)8~Z)BRTRW3ZlZtwuHE2IsW`EaSDIa^x*$Z+y8MC6AC|& z=*&c_d$-jFp5pov4&+jA2|xFjty}wB-@*q&IlP7d{{`dzAGCeI2zc%lj#k+YCzItI zpCsSo)O<3EhLf%$(sRj}afOH<5z$=FviLli?jy*Iv8E_rp?y2l&x-z}< zDaFM1gWlLXDh+ahgP)rZp4~MO`u5S_r~N5c5gq9c<^6C}LY#Rdn2RAppC;du6TPiVHToi(!ArAWpUtnr+TLuy41IINOH}Pp2BKcNvjlb4S zP9G4l32Am+f(B@ffS|wxEOHq?Detp#opMt@%FMT1P^{=SkMPeVAFNdV+cWp~*}W~u z!j$;?8RV)3`7f<8B^lVRkIq1Y4t{6GL59&sacrVjMlHmJxz5ar)~ zYK71#P>rIg`23p?~$Q5v4TbQoKulqVen=taT4^3cPzwF6G z#S3URH2Nh!9dG7{TJ)!w1K2a6pVApkiXp6u<;E;7j+SA{QKcc9`Ae&M3FcN~lSRdJ z46QNwMIfzNwTpE9eZ}H^uHpMqPZB3%`$8`ojiiS+Na|nq} zWT@6E8=eKBVofO?Q%k&7ua&?RO?*wGG-E=w?9C+=mo*+~i?H{hlawFs_;Dm1TNu2m*E)Px5DQA} zeS9!uCMu)OS8dQZ6=_-NRH`p0Ix(HHevz;Ar!paeO3)Lsl&bC-J^{(XD3+l21L+qO z1s(|l>6_a%*TJa2s{Ts8gX^0nFefB`JjQ&ex=UQr1mU^HC(JtvD$zH$GszgJSUNcy zB{yza%ytVq`AE?E$db59kg!Fwyv0~psEWIA$7FgW&+ecwj)2m{=7$H_5oScqQ^cF!1$m1%+!%ZLS4N(8?Gb&bZjK&@HLBZx`regNqgC@U^y2Np z>4=ur&s;F}4w;|dRYmeUfs<|1O8RivV>P{4aLtW|~F}!ea@Rep9?LvC-T@Y;@Ju0tzC5a-h+!Wne zeC+{_HyQ*#*ex`fr_%9HZ>URW7Q&_$@@5oT;XOKj6w#y%#LiUd=s7!g7)SC?M)D_h zWGmh<-Y4-Lw7K@Fv@fC@8(4DM8SG@xlLj*G8PYx+WY8!`5u;&fGO~6r7KC>f9psvE;5CELqBrtq!2a3!m?#ZZg~GOXSG; z{i(sa!a!=V#mBiTW#*F=%WlPkYSMvakbbgMmSe5{mcHY|A@@zV-YFs~x`szus@fum z7(pC1;kadg`pAr|2Qgj*cM9ZD1m}q;81lYBoE}Xo;#N!jymw@A|HiNcQ)1UEccFwF z{{&83yIo+?$fz(af|!82V(O9q(huoM*H5Ajg%Kgo28wPz`;)88$ zBe#JL=8?Xk%3jM{XK#|Fo-CYmH>?Rn9Kc9#`m6H_p$$W_1?nxmi366kr9cHBfs!ZL znN9*Hu+Sjd=FT7kDH)kX{@b3}m`xGIlRClpUH$s{h@pB1G523q8l}{wloDKtmk&+b zfa?mqrjn^U9NxbeOeRkklJ$FQW(#cU#%t_;_N7GA{vP4^>=i?4>KFTfCy`&Uy|}oo zUYKJ-V&h?^KTyPgkrVuMkikbxeUh#!F|@qiXzn*t>ays4Z&m;2!c9J^1tlijxf}}9 zuVJt+;*e_Y_pf`_eSx09B>5M>0N~SvlJKW%kB%ZKBa>nF{tIab%#b&wjHkrV@`E4hW%T`uKYH*H$$xd137yW3874lYs z+gVX=efB@RE8<+tC{`|dElGZd-&W;D-Qh+RmV>P51f>{$+1GrOqghmiT3N3_L=|!{ zzH8gdubCWB9tyLv3?NK>herdt7g9e_(eaV-OYlds{g@7_=mSKGlp@>l6n5M&NM^#W zXW5^v1M7)A$epD&cOEeVuuw|PQGn8(-5m`qi3(pqim^(P-us;RQcqOz6Xvupa9gs? z%40zBoA<9(@EuM1=<4R~;nF|shKwu%>fML(hCec*CZhm;MP81lk(_{+pvIO*HZLy`1^5vvcSQJOnq7~}D+AliTfu_Adq(uC`| zs*df&G?(Hff#`mw8>tRRetL-Jb*8Z#7a%N(P0|mzmlPQ3)~7|@hgO=s>O#%+Bd;e> zYMmi|z{htnl!(}`@;Nt!R5eE*q~2s&)B|bX#cEYZB-%gTuS=G?n8T7>?KbfY_3YA=A@vY~E$Pom`& z4Fm*h2)}%$yk6HjRMr^cAMEG)M2jmEUE~`Y@Bk6JQGe_>H2V(PQ2T1g5HERsCNk6+ zjO&=quVtUAnwURr53bW~&e$ePCAv>*PDH-q1$D_dG!|Y2cePcud}Vr$8}y;Ep-~p> z$Atg$*S?4MU&;l$^?gAN@wOpK4J3MHtP(sgf)|dL*5M0UFjL(_nq)}t3&U=;s4f{~ z08C*Z_$B4eODwuzNq`dR$y5uR(HEIIQ!48pu4;Wj|sSS`Xm};%>l)0EVz)@^$pzaKgb+>jgY0p#X8-2y@7^3_@62;r zWye5Fkqi%d(K?4T0+ru>xOc;I9v{XsEir-9Z&hiwW&g^G34N*8Uy8o^ ze20LhPrXQp#5F=>3!mq{fLfuJbT?ayht)4jzpNky!Tc=232$=$|7Kimk7+6Xgo-TX zq4s_%-aisO_#xiA8f8_}^Pl7P5T&*ziwE8MM!!l+2j6DJ%R#>%jsrFx49b{(L^Bb# zeQN|`i0&RE9o%_!Z8!?+DWaQXcv(Y*^d_Z14@rV zpg`2r&aXz$3xSYD6=+-@OqBoujEu;c>&yy}YBGKSqY1l)a+3{l)kDS|TvJj*E~{O9F? zO!3iO*0vdbT-ExJXNQaTr}m1QM)z> zi|b@s3Op@BgiB_I+>J7v`bIkYbWT~=iB z*!}kUru>id3%RT6orD3<7`G_sa@05GZB#o-v*K8M-DVkA!hK0p)Hyc;6|nNza=@u^8s;; zHM!#X6U$e`xCQ;s$9IxWrSxZkE9i;J*O=b@uTpUSqmuD&1*4sRrzYSKh7Ba|FPm%Z z`gg_2=4G^shTH)%vsly0>B}X#mOSJsjHbr$~#r)FIW)2P! z_^$NK6&w%+~3#SLv|YVU`2p(teYlqX}*1rAP#vmzyu8GC?KKP-gO9gt-42K z+US4!{c?|b+z6M zj*-;vN4y~95Ytuf_083XQg^&gd#ytt@F-+kmFXN-EOw|aw;Q90-TukU|5<<%5Y33- z10G+>tVp!Kjx% zTp25EalnI-aYW#i*j_h75$MB#juImiHY5cQPpp&%89K@29RUY8ysh{CvGo$~`6WH* zkYSVITKw~5rkc1HBS3L*9Kkr}zO>8Qf;R5B4KN#oA{b@i+2Qh)=B#rwHmBr(cbr?P z5FVP*POhVCwTfE+YF8I%t8{wvQq88Toh22ZIoy3n2F69vG&oevHPp!kct^IC+B&qy znPY#^F7k>kuEFmq#y6?PnF8 zbNz$ne+5M?UH%Q=pj3!$xFAsQgs90ldC6l8GguVU#6b@T-9))nL)~VkAcmQYd&kXN z*Kj4ZxI4j=xVS1YV6hv#V+PY+p{B& z2?2@`Zb5w?GppNt*I{w(hsWB|v)Nn5emB(BS8=d!mV5vjfk7+?*Hc*Fi1*6LB!8Ml zsV3G~7YPbjybdc4+Qb^f;$~-j#L)6)Rw;T}{B-$oob=gXLf=e|zl*Lky~^dc$RRfM zX3zQLxT-Zed_e6(gltJ~tAXfpgO0ogcS(&q?2rDY#`{MhG^sbbgJ() zb`LP1eb`-YE|~8(5M4*TDsaSN1^7mc`9D;PvHPdr)c!?t{5wjhwM{(zJA%!V_PEgg z{}81Az!^?~{*yOx|1EF&J7i|yB$W$)+n&E^_`T-I|%%#1@;z60}Hu zSk=;Vcj)O^E?ZcOh@qOaofcNBs)sxW(8%y&Pw zU{QzD{GiHgMUH{ic8!%9KsoBeV7nBl-*JL-b-T~A6oRG(54ofM#ULNYSzd3DS2uyJ zi5vsq^8hEJ!vR|p#yB@OEA=eT?$e8L3+!0xfvJh?^*py@U$T)XuGBCYxa9h12aXOx zHYA8*d?DVAK_}c}2aBGA`%pk9*KQgnDoFbLyxVm0!Oj73&<&G?q{o+`g0Fy1lgKp8 zWkcA_?+sbqyu5_-?wguZH9Hum1Hh6q1r7DCM_-S@z|RD}Ns$I_hs0Q1Urw{x0?X-T z{l!lSGCi4Z=Y`h-Um@Iru2!3v6Plsviz|-C82^(TUycMbpkyx%DEY>HbtWq zAoSopKBQO%tL>Cg28nfbr@;D#Vtx~7h&yp%sQyxcQ-=Fde1AI2BC{RKBT|_jLsbSK z2&kR#B7u(VFiw;M7pcQ8Kh+bv;Zknip(c;}Po!wsMQK_Y<#ZCQ&qUDDkwzISo68KuEcWr}-UA^TLsS>Usi=o#ML zn$vDM!)j7q<5hdUac&)>R_uFQIb?izLzu<}p9pRjsOorKrZAw7lf*z$J$dh*WYQLU zv8*hoc4hO3G$jwK*S1?%*&k9qg4NHDy=p8cAWXwlK&>8uB*r5*GQqi43Ow=nFJuOq z!gM92)VM*wp1PHWQlCbH7M6wv0?4OPZuAB&%7HW4-eW7*Gb--jUSaRoGTytv?o=-C~zC7&wSsNGzB-Z<+?W$>P?zrtb^;G zE7|;E{R2-i z8_P3y?&O#rw(N(J4A;8}cQV#gR?A=iULlu3NA`(y3_unGs<@{4)~QrcDEXCeR>_n4 zbj25PR3;X?AcGRkItbs8MB$P`K}Fjyid<8_gI$MzV&qRP_MVthe$z&`36b(*D#~LB z6D6fwt<>=z0pC)h_&B}qRqlx#h5-{=E3b(fb_06Qp2_ zDcJRwPSRP?{ZUrRP8BBR>%8+s@na~F-2IegB#isyg+@F?aj zAN;eu6y0KtIc#6XOU*js-PQJ|kwEhxCox1-g#=OWsPUI`7~iwcK6?oTi!r)=@>87X z&k0unwf1Wsy>z97p||po$fiV7+2o-Bk9U6 z^Ho;s7{fc^k(3*|m2lY`dna_JVo+SUZCl5=WWZODQnhJ`Q7$rdP3tO{CPP(P;WCRH zNlrF$2<1_N;%gK_q|1?K6&;I*50QpN2et zHS56^$#Ewyn5P(bSSyxC1SbB3BU+M?Lj-@({)>7Ln~IlAzSK~SnNRBui-QspMN*Gc zww*k3J)+~&52b-zNiAM#DpHIew?%Rm>Xs8Z9xys4b9g^zkm0X>3%h}h28q8z`P?+h ztivwEGQy%ViTPcASU3mNy!~>rABL^zNWESsDzCQZ7?^`A5C4escup2!S+f3JiEn|% zMRw|eql1tnVC3lF%;-5>>rvsW5XpM@oa~_G( zDbpMeNQAerw{rsnf|w)EetG|@hy{#IsWx%w6NlQl4fLc9P$opSl`Xu_YOCf!5SLgD zQ_CjIim!I@QZ-fawOYAS6#xJvxZ}#d^bWZ&Y=f*Zg}Oy)u)WJpgfCT;W9ovKwuv|; zxmK8+6Z{AACIHzIgRi97Oh_2HIX0RpJbw7qZD2pr_f&yGl@iV+u8^HhkOn;4q?Fss}=~$M(t<|=k;n9zlh^96r ze$HDf@1(tU&Q6Po)wwEbt@2iJ+33l|a3phNNmi`j-ltekKjJLq zmUfJ##xfzFVLd_8%1D{WT=tQ%4vud=N!!q8gK=vGDrhY8au`xVjuTz@X{{lmUzS45 z1P?=dRGQ*I4bRr=#QT>9T~(UK%IR})cjAuTp#`h4R1|W}S9vj$auC&#iF8r*jeEL7 zj#W(FM~3H-8NJ+Z+2@7Ff8(BNzkuP@&=%L0SoZnBrR8G!T5n6Qlz~Q@b2|KGDYCH_ z_gE3&9LXiJUEVQnGcy_2p1D#l5)sNlhJG1!wAqTs*r}K1s<^5nUFy`va145m7yp03 zw81X$5N!8$Y+MLijJbQ&j#c;+a(qiO!1o%pkhr_H-)>6^2+Ln0IK5id9YgLJ1)Zz0 zq$*zq7iFxas85THRF(5@vDpD?i4ZwIs+*c*>yPH{2ib3jiFl)MZ>$G4!E`IO9X%M@ zGI6E$@ZQ$0J(7VY90%Fco=xyNaTEV1Yb%~px@KCUysG>URG_e-nyO#k7UJJl?PtSt zPWKKfgO;YR5pOdNKU;w3?ccSuOKD=S2eNtDZvof5TB|w&ch#H58X+8E3&+z0-q>Fe z^1^IDDtC5^>zhLcbjL>8n?@YD?O31wkj)gZU5R72#tA-ai(|-}nGEcs;XD1S_}L^^ z+oyH7P5H=Y?UUV^%tgOw>y}&I!`z#rSg@R5<-!-`Vm_rfL)N{4C!q zT8I+I6s%7KZdR_n(m1u>p5F+DS^AMNz4Nz4+E}PxV6Po*C{7uGsG`A*O&N@jRcS~%T&GY*;xi59#h{j>c09>1XR5rhM?gc|%#JKJl01|H=(BU_JFRRsT2As}U|aDb~SrVO#+{ZvYM| zCKVY3T&f}wTK!J%dg5TeI62$4wfYxq-1l(-`-gYNjk_%0``2{$=9Q)D?&&%f&0GC= zM=$?*vaz;p`_G!LXo&`)%_%o>UD4(%Q}igN7j7I#o|NxBRN*Y^>~K9qP%#pQKRuNa zox7bs@4Pj7VgQmAd7BB}L3CVvZs4Dc&AETv$OSMJZ&^a;)Lz|=55UQqfHXH3sM30b zXkA=z+mwnq6#v@?obW&zY5OL{lFa}wI7+-}$tprEOD8p5AMgt}%8R~=rU%C(S4-{! zMBlkUF@!RVO^6`u?wjgqRX}H9mgymI!pPYEl>A}JA1aP(zyoSwU}1YoUf1_-hXi+% z2bABr;+t@g>q~{NX#s}-r(fHUk}CVMDh`y_9p*=f>WrK#!OG_ufv`Gf=aZeufP~BA z_j^T#7BVTwdbRDq)#*-mekF}Yzq0aI)xO}K%JM&`8q4QR26bLGimDnh)!x8%+E`U8 zhjs@bd+_-W@nj$!1tD_~<5AoY#*@BH?f5 zi}^sUdUA?fk=$zZrGJV~q+ZQ?u{Ov_?ZP=Q3#)ZBQAp_P_&QZ=c)1HZN;|AgBod3g z*uxOovO-;bQ{P>Fji(-*1g&(~oVB^KBZCgKo{=++yH{tMpA@F(?!G$V%_J7z3Qcby z>PxGZ@-O11DdirqnAg+aM#$A7UZwIm`Jve1{Oybm&S*XTWFCv%($ZQ;$=Ba9t~Dee z*~0)K$Dodjb6s!~iugxpz|}#u2yhY`cG7Wr4EysZ7`L2Ay)F4n}{dnD(R9caf# z*LNar>E-=*lb)O8UQ%Aj+SGkC>Ju#!I|xT|9L%d{Bj@t2UNngf=*Jx|wJ30NDROg) z-O5&Jq(*GSOmlcY$=}_rXwfz_t~iD*G%2i6!<1n~fi0dEmq@sb)e}MDwB|PmdujKc7m?gC+`|M|fjipsk z1=vfWig8AU#tNO(8)7#aKzjU`AXlt~7@8WSuP1kv3l|KgI5YJY7BxRD2+Br%iq>sS1cMh-kBkM?smWj~;8zAu zNT0EWapcv?am^}FjFUN!>DT=1Z{(K$y97*+^DlWM8}obATKJkP1Xb`4cvYLA&3GT@ zdej++3asZ_)8VKwdxnnW=|l{Ud#^`5-lyr~T4-j~k$pPA&W8A%U9F3AzG~=!v|7Ji z5`rLGK2RL9XB9!#cyg#VKMFA6VuPL3NNJk>wlg{Pkg^-RNBrqFec4xQw}A1Fjh3n` zvRZ4rmAtq($j@+8xr0t|p1m|wV^ot-c_w$xtya6i+ckZ6na>Zvfi%ddS ze4PEW?0z7t%5=W;-}jk4wAP-E=yLYd^j*8bt>VZSvE}W%YkgPv{IqU| zUox)eV&9Clk&h)l;Bh{;NXk*)y5<4OJZ>m^TxfaxZp@wI42rLu@>>2@Lc^aG)Un;D zRWX0ufI;Vg&)mt$@=qji21*M_F`VaDhbodujb_z)5go@;WKp1wd&!+{(F6==D82ev z5QJ1t^&-VNW0m!nw$)o?QnxiE@{J1+?@9I)GIadRc`i8bDe`?ej(ycf9fAOU~(^=7yECrc%dSRFRZXW_}H|ZxS|IkCQlZDygLQ%nG#gm+HDgW0~KYlF;wS zB%$hDyT!-1a#JK2}iUcD0TAr1SjTUCFtV5GBUk5whg`nPgq-* z>JHFk^uZBjh? zG5K{lcOT^Kj73SY@#2mSIwfs@IEwb240o7*wYhy}r@61ezS@%-5Td+&wh%?~6aXOp zRNoiHKrrcaR<|q}uy4rTlqo<4DAYO>ottt+^$<_;)z|a>yj-+O>rlDVInIGr+l&3k z$S@sv_Eg&4e|GtKD>NP8Mu*68fJrqn(+J%F3t>`&QQiRL7u*rK$Xt6BHlAuA3?e0# yE$gTt7;GjFwVP@=`|v2V$@tg`|2f~~O+oM3S6jgn7|t~hP*Kp3uX