From 552f6f926a2b0c46a13d74db0b48c61debf90c7e Mon Sep 17 00:00:00 2001 From: JeremyFriesenGitHub Date: Sun, 8 Dec 2024 14:11:46 -0500 Subject: [PATCH] chore(tools): create script to spam submissions This commit is to be removed when merging into main. --- tools/risk-form-filler/eslint.config.js | 16 +++++++ tools/risk-form-filler/package.json | 8 ++++ tools/risk-form-filler/playwright.config.ts | 45 +++++++++++++++++++ tools/risk-form-filler/project.json | 28 ++++++++++++ .../src/defs/online-input-defs.ts | 6 +++ .../src/input/online-input.ts | 20 +++++++++ tools/risk-form-filler/src/online.ts | 9 ++++ tools/risk-form-filler/src/pom.ts | 38 ++++++++++++++++ tools/risk-form-filler/tsconfig.json | 18 ++++++++ 9 files changed, 188 insertions(+) create mode 100644 tools/risk-form-filler/eslint.config.js create mode 100644 tools/risk-form-filler/package.json create mode 100644 tools/risk-form-filler/playwright.config.ts create mode 100644 tools/risk-form-filler/project.json create mode 100644 tools/risk-form-filler/src/defs/online-input-defs.ts create mode 100644 tools/risk-form-filler/src/input/online-input.ts create mode 100644 tools/risk-form-filler/src/online.ts create mode 100644 tools/risk-form-filler/src/pom.ts create mode 100644 tools/risk-form-filler/tsconfig.json diff --git a/tools/risk-form-filler/eslint.config.js b/tools/risk-form-filler/eslint.config.js new file mode 100644 index 00000000..2015c83a --- /dev/null +++ b/tools/risk-form-filler/eslint.config.js @@ -0,0 +1,16 @@ +import playwright from 'eslint-plugin-playwright' +import baseConfigPromise from '../../eslint.config.js' + +export default (async () => { + const baseConfig = await baseConfigPromise + + return [ + playwright.configs['flat/recommended'], + ...baseConfig, + { + files: ['**/*.ts', '**/*.js'], + // Override or add rules here + rules: {}, + }, + ] +})() diff --git a/tools/risk-form-filler/package.json b/tools/risk-form-filler/package.json new file mode 100644 index 00000000..5e305702 --- /dev/null +++ b/tools/risk-form-filler/package.json @@ -0,0 +1,8 @@ +{ + "name": "risk-form-filler", + "type": "module", + "description": "", + "license": "", + "sideEffects": false, + "scripts": {} +} diff --git a/tools/risk-form-filler/playwright.config.ts b/tools/risk-form-filler/playwright.config.ts new file mode 100644 index 00000000..530f4222 --- /dev/null +++ b/tools/risk-form-filler/playwright.config.ts @@ -0,0 +1,45 @@ +// TODO: Investigate node global process usage + +import { fileURLToPath } from 'node:url' +import { nxE2EPreset } from '@nx/playwright/preset' + +import { defineConfig, devices } from '@playwright/test' + +const __filename = fileURLToPath(import.meta.url) + +// // For CI, you may want to set BASE_URL to the deployed application. +// const baseURL = process.env.BASE_URL || 'http://127.0.0.1:3000' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + retries: 2, + use: { + // baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'pnpm nx start risk-form-filler', + // // url: 'http://127.0.0.1:3000', + // // reuseExistingServer: !process.env.CI, + // cwd: workspaceRoot, + // timeout: 120 * 1000, + // }, + projects: [ + { + name: 'chromium (desktop)', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/tools/risk-form-filler/project.json b/tools/risk-form-filler/project.json new file mode 100644 index 00000000..01ad037f --- /dev/null +++ b/tools/risk-form-filler/project.json @@ -0,0 +1,28 @@ +{ + "name": "risk-form-filler", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "tools/risk-form-filler", + "projectType": "application", + "tags": [], + "// targets": "to see all targets run: nx show project risk-form-filler --web", + "targets": { + "online": { + "command": "npx tsx src/input/online-input.ts", + "options": { + "cwd": "tools/risk-form-filler" + } + }, + "in-person": { + "command": "npx tsx src/input/in-person-input.ts", + "options": { + "cwd": "tools/risk-form-filler" + } + }, + "hybrid": { + "command": "npx tsx src/input/hybrid-input.ts", + "options": { + "cwd": "tools/risk-form-filler" + } + } + } +} diff --git a/tools/risk-form-filler/src/defs/online-input-defs.ts b/tools/risk-form-filler/src/defs/online-input-defs.ts new file mode 100644 index 00000000..57460bdf --- /dev/null +++ b/tools/risk-form-filler/src/defs/online-input-defs.ts @@ -0,0 +1,6 @@ +export interface ScheduleOnlineParams { + name: string + email: string + subject: string + message: string +} diff --git a/tools/risk-form-filler/src/input/online-input.ts b/tools/risk-form-filler/src/input/online-input.ts new file mode 100644 index 00000000..3883dd6d --- /dev/null +++ b/tools/risk-form-filler/src/input/online-input.ts @@ -0,0 +1,20 @@ +import type { ScheduleOnlineParams } from '../defs/online-input-defs' +import { chromium } from '@playwright/test' +import { scheduleOnline } from '../online' +import { FormsLayout } from '../pom' + +(async function getInputAndRunPlaywright() { + const params: ScheduleOnlineParams = { + name: '¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!', + email: 'getpwned@gmail.com', + subject: '¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!', + message: '¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!¡getpwned!', + } + + const browser = await chromium.launch({ headless: false }) + const page = await browser.newPage() + const formLayout = new FormsLayout(page) + for (let i = 0; i < 100; i++) { + await scheduleOnline(params, formLayout) + } +})() diff --git a/tools/risk-form-filler/src/online.ts b/tools/risk-form-filler/src/online.ts new file mode 100644 index 00000000..0d32e44c --- /dev/null +++ b/tools/risk-form-filler/src/online.ts @@ -0,0 +1,9 @@ +import type { ScheduleOnlineParams } from './input/schedule-online-params' + +import type { FormsLayout } from './pom' + +export async function scheduleOnline(params: ScheduleOnlineParams, formLayout: FormsLayout) { + await formLayout.goto() + await formLayout.fillContactPage(formLayout, params.name, params.email, params.subject, params.message) + await formLayout.submitButton.click() +} diff --git a/tools/risk-form-filler/src/pom.ts b/tools/risk-form-filler/src/pom.ts new file mode 100644 index 00000000..fe417be2 --- /dev/null +++ b/tools/risk-form-filler/src/pom.ts @@ -0,0 +1,38 @@ +import type { Locator, Page } from '@playwright/test' + +export class FormsLayout { + // Page object + readonly page: Page + + // textboxes + readonly nameTextBox: Locator + readonly emailTextBox: Locator + readonly subjectTextBox: Locator + readonly messageTextBox: Locator + + // buttons + readonly submitButton: Locator + + constructor(page: Page) { + this.page = page + + this.nameTextBox = page.getByPlaceholder('Your Name') + this.emailTextBox = page.getByPlaceholder('Your Email') + this.subjectTextBox = page.getByPlaceholder('Subject') + this.messageTextBox = page.getByPlaceholder('Your Message') + + this.submitButton = page.getByRole('button', { name: 'Send Message' }) + } + + // goto + async goto() { + await this.page.goto('http://localhost:3000/#contactpage') + } + + async fillContactPage(formLayout: FormsLayout, NAME: string, EMAIL: string, SUBJECT: string, MESSAGE: string) { + await formLayout.nameTextBox.fill(NAME) + await formLayout.emailTextBox.fill(EMAIL) + await formLayout.subjectTextBox.fill(SUBJECT) + await formLayout.messageTextBox.fill(MESSAGE) + } +} diff --git a/tools/risk-form-filler/tsconfig.json b/tools/risk-form-filler/tsconfig.json new file mode 100644 index 00000000..76cca254 --- /dev/null +++ b/tools/risk-form-filler/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "node", + "outDir": "../../dist/out-tsc", + "esModuleInterop": true + }, + "include": [ + "**/*.ts", + "**/*.js", + "playwright.config.ts", + "src/**/*.spec.ts", + "src/**/*.spec.js", + "src/**/*.test.ts", + "src/**/*.test.js", + "src/**/*.d.ts" + ] +}