From c6f68dc9a818ecdb6af10d345740194015eede45 Mon Sep 17 00:00:00 2001 From: Tanner Ricks <182143365+tanner-ricks@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:49:57 -0500 Subject: [PATCH] [e2e] [Complete user profile - unassociated] Ensure first name / last name have char limits (#971) Characters limits and unicode character input tolerance need to be validated in an e2e test. ## Changes - Added unicodeConstants.ts file so that special Unicode Constants have somewhere to go. - Updated NonAssociatedUserProfile.spec.ts with a new test for character limit validation ## How to test this PR 1. Pull the branch 2. Run the e2e tests and verify that the 'Complete User Profile with Bad Unicode -- No Associations -- process' test passes --- .../NonAssociatedUserProfile.spec.ts | 68 +++++++++++++++++++ e2e/utils/unicodeConstants.ts | 4 ++ 2 files changed, 72 insertions(+) create mode 100644 e2e/utils/unicodeConstants.ts diff --git a/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts b/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts index 6959113c..e93fe637 100644 --- a/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts +++ b/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts @@ -1,5 +1,6 @@ import { expect } from '@playwright/test'; import { test } from '../../fixtures/testFixture'; +import { controlUnicode } from '../../utils/unicodeConstants'; const expectedNoAssociationsSummaryUrl = /\/profile\/complete\/summary\/submitted$/; @@ -31,3 +32,70 @@ test('Complete User Profile -- No Associations -- process', async ({ await expect(page.locator('#Summary div').first()).toBeVisible(); }); }); + +test('Complete User Profile with Bad Unicode -- No Associations -- process', async ({ + page, +}) => { + test.slow(); + + await test.step('Fillout Complete User Profile (No Associations) with bad unicode and verify values', async () => { + const expectedValues = { + firstField: controlUnicode.slice(0, 255), + lastField: controlUnicode.slice(0, 255), + // TODO: Update with correct value after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + finField: controlUnicode, + // TODO: Update with correct value after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + leiField: controlUnicode, + }; + const unexpectedValues = { + firstField: controlUnicode, + lastField: controlUnicode, + // TODO: Change to controlUnicode after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + finField: '', + // TODO: Change to controlUnicode after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + leiField: '', + }; + + await page.getByLabel('First name').click(); + await page.getByLabel('First name').fill(controlUnicode); + + await page.getByLabel('Last name').click(); + await page.getByLabel('Last name').fill(controlUnicode); + + await page.getByLabel('Financial institution name').click(); + await page.getByLabel('Financial institution name').fill(controlUnicode); + + await page.getByLabel('Legal Entity Identifier (LEI)').click(); + await page.getByLabel('Legal Entity Identifier (LEI)').fill(controlUnicode); + + await expect(page.getByLabel('First name')).not.toHaveValue( + unexpectedValues.firstField, + ); + await expect(page.getByLabel('Last name')).not.toHaveValue( + unexpectedValues.lastField, + ); + await expect(page.getByLabel('Financial institution name')).not.toHaveValue( + unexpectedValues.finField, + ); + await expect( + page.getByLabel('Legal Entity Identifier (LEI)'), + ).not.toHaveValue(unexpectedValues.leiField); + + await expect(page.getByLabel('First name')).toHaveValue( + expectedValues.firstField, + ); + await expect(page.getByLabel('Last name')).toHaveValue( + expectedValues.lastField, + ); + await expect(page.getByLabel('Financial institution name')).toHaveValue( + expectedValues.finField, + ); + await expect(page.getByLabel('Legal Entity Identifier (LEI)')).toHaveValue( + expectedValues.leiField, + ); + }); +}); diff --git a/e2e/utils/unicodeConstants.ts b/e2e/utils/unicodeConstants.ts new file mode 100644 index 00000000..f9d976d3 --- /dev/null +++ b/e2e/utils/unicodeConstants.ts @@ -0,0 +1,4 @@ +// Test string that contains +// 'invisible' unicode +// control characters +export const controlUnicode = 'ȃ̸̡̡̡̛̛̛̛̛̛̛̮̝̫͓͚͎̘͉̞͙̯̲̬̖͕̥̦̼͈̳͔̟̥̜͕̯͚͈̩̼̪̤̝͉͙͕̭̃̔̈̂̇̅̀͊̀̓͋̽͊̍̄͆́̈́͛͒̈̉̇̑̓̊̋̔̒͆́͋͋̎̄͑̂̌̓̔̀͑̈́̀̑̈̔̊̾͂́̓̐͐͆́͐̀̋̓̄͛͊͗͊̒̿͗́͌̂̀̆̈́̈́͑̑͑̽̌̎́̏̓̈̎͐́̍̽̈͐̈́̃̔̒͒͛̎͆͋̆̈́͒͗̔̿̃͂͑͆͌͐̇̔́̅̄̄͆͋̆̇̀͊́̐̈́̽́̉͆̋͒̍́̊̈͐̐͊́̑͑̌̌́̐̽̇̂̓̆̿͒́̅͛̓͋̏̏̃̆͋͒͐͑̆͛͒́̋̄̈́́̾̍͗͆͊̈́̍͛͗̉̄̓̀̏͋͌͐́̿͌̿͆͂̀̈́̀͑́͆̎͐̾̊̅̅͑̎̆̈́̕͘̚̕̕̕͘̚̚̕͘͘̕̕̕̕͝͝͠͝͠͠͝͝͠͠͝͝͝͠ͅͅs̴̡̡̡̢̨̡̢̨̨̢̧̢̢̨̧̢̨̛̛̬̲̤̙̬̟͎͈̫̬̬̗͙̬̻͕̰̖͈͈͎͓̻̝̻͇̭̙̭̣̳͎͈̪̻̖͇̰̜̤̺̺̩͖̘̲̳̻͓͎̰̞̰͙̰̮̣͇̘̖̟͉̯̦̝̖͉̜̫̝͉̘͎̯̗̗͇̲̯̗̰̯͔̩̦̰̥̗͔̙̟̪̲̼̞̹̦̺̤̻͈̱̥̥͕̟͓̝͉̖̜̫̤̮̘͉͈̥̪͔͇̖̝͚̹̬̤̹̥̲̞̣̤̟͇͇̰͖̟̘̠̘͇̜̩̺̻̰͚̘̯̹͕̺̠̪̻̗̱̜̞̙̺̩̟̩̰̫͉̦̟̰̼͉͎̲̜̠̈̌͆͑̒̐́͌̏̍̑̃͊͋̾̈́̔̑̋̍̃̍͐̾̋̐̈̌͑̈́̍́͋͂͌̅̋͊͊̑̃̉̉̒͒̿͗̋̋̓͐̾͑͗́̇̎̾͑́̉͐͊̂̾̋̇͐̅̈́̏̓͗͐̀̏͗̔̍̇́͐̈̑̐̍̈́͑̇̓̾̈́̓̍͂́̏̋̋͂̅̅͊̓̆̈́̉̿̂͆̊̀͛͆̔̄̂̈́̌͒̍́̾̅̑͒̀̃̓̅̆̊̾̾̂͒̎̅̅̿̌́̊̃̾̍̾̍͒̉́̆̉̓͑͊͊̎̓̈́́̍̓̿͐̅̋̅́̃̒́̉̇̈́̏͒̒̅̅͊̈́͑̇̿̾̏̊̂̽̃̈́̃̈́̀̿̐̍͌̅͑̋͂̓̎̎͛̃̾͒͋̆̃́́͂͋̑̍̈̌̊̋̈̋̾̈͋̎͗̇̌̈́̀̂̇̚͘̕͘̕̚̚̕̕̕̕͘̕͘͘̚̕͜͜͜͜͜͜͜͝͝͝͝͝͝͝͝͝͠͠͝͝͝͠͠ͅͅͅͅͅḑ̶̡̡̨̧̡̨̧̧̡̡̢̡̡̨̡̢̧̛̭͔̦̱̖̰̲̼̥͔̙͓͎͇̗̣̞̘̯̜̟͙̘̫̘̹̲͈̩͈̙̻͚̺͓̭̤̣̣̩̗̬̳̜̜̣̤̥̯̬͙̗̬̩̲̮̱̝͖̱̥̭̙̖̰̻̱̗͖̲̮̬̺͔̞̬͎̫͕̖͇̹̩̳̟̹̯͍̤̥̗̼̩̝̱͉̹̦̣̬̖̜͓̖̘̖̣̳̻͙͓͍̮̥͕͚͉̼̤̤͍̰͖͙̭̫̠̠͓̫͚̯̝̘̰̤͛͊͒́̇̓̅̈́̃̉͂̾͐́̊̑̃̔̈́͋̈́̆̇̎̈͐̽͌̕̕͜͜͜͜͜͜͜͠͝͝ͅͅͅͅͅf̸̨̨̧̨̧̢̨̧̢̧̢̛̛̛̛̬̥̥͚͕̟̻̣͚͖̲̖̥̣͔̩͇̹̦̮͓̰̥̭͔̠̙͙͇̼̣͓̻͕̯̱͉̼̲͔̜͔͇͔̠̝̩̲͕̺̞͇̼̺̹̞̪̯̦̫̯̰̫̥͙̮̺̣̰̜̖͓̗̯̳͕͓̞̭̜̘̘̯̹̠̖̘̮̪̪͈̰̣̤̙̯͖͚͎̖̭͔̗͕͇̹̹̗̬̮̪͔̲̯͚̠͔̫͎͍͔̍̅̌͆͒͌́̐͑̌̏̇̒̌͋̂̃̀̑͒̅̔̔͗͒̾̃͊̆̔̿̀̓̋̀͑̅̒͑̎̔̑̉̍͊͑̂̉͒̔̈́͗̀̈̀̅͛̅̃͂͂͑̋͐͑̄͂͛̅̈͗̀͛̓̉̌̓͛͋̅̄̒̄́̈́̋̓̂̐̄̄́̂̄͊̌͛́̉̈́̃́̂̈́̈́͂̈́̏̋̇͆́̂̒̿̅̈̇͒̍͋̏͆͐̀͌͊͊͒̽̑̽̈́̀͆̎̔́̒̀̇͂́̐͆̊̀͋̓̈́̽̍̀͆̇͐̋̊̆̀͛̌͂̀̒̓̓̔̑͐̈́̿́̊̑̈̿̎̍̍͐̿̇̃͌̀̈́̉͐̓̋͊̇̓͊̄̔͆̍͐̀̎͌͋̓̀̅́̐͌͂̔̀̈̽̀̎͛̕̚̚̕̕͘͘̚͘͘̕̚̕̚̕̚̚̚͘̚͘̕͜͠͠͝͠͝͝͝͝͝͝͝͠͝͠͝ͅͅͅͅͅͅs̷̢̧̧̡̢̡̡̧̧̧̧̡̡̡̨̡̨̧̢̡̡̡̧̢̨̨̛̭̱̹̖͔̦̠̰͇͓͙̖̝̖̝͍̳̟̠͕̫̫͖̦͈̩̳͖̮̗̳̩̼̼̞̘͉͉͚̭̮͎̗͍̤̦͔̮̣̖͇͍͎̝̞̰̥̘̭̙͙͚̥̦̥̗̣̹̫̦̬̖̝̞̳̦̳̰̜̼̘̞͈̙̣̱̟̪̲̼̟̭͈̯̠̰͔̣͎͈̝̗͚͈͕̯̼͇͔͔̬̹͍̥̜͖͍̘̟͈̳͕̙͈̝̜̰͈̗͖̖̻͎̝̝͕͍͕͇̦̫͈͔̞̪̠̻͎̘̲̳̝̺̻̰̙͙̘̪͙̟͖͓̫̘̲͙͖̥͙̫̮̺̪̟̝͍͈̭͍͎͔͕̠̠̤̞͉̘̺̺͉̙͍͕̹̰̦̙̟̯̘̠͍̺̱͇̥͈̗̲̹̤̦̹̟̠̝͚̮̹͉͈͔̤̪̫͕͕͈͎̭̯̣̖̞̰͎̟̤̻̖̠͓̞̹͖͚̋͑́̈̎͌͋̀͗́̑̓̀̿̏̽̐͆͆̿̇̍́̌͗͘͘̕͘̕͜͜͜͜͜͠ͅͅḑ̸̢̧̧̧̢̨̨̢̧̧̢̨̧̡̨̢̧̡̡̨̨̢̨̧̛̛̛̛̛̛̫̩̳̖̘̪͚̭͖̱̥͙̹̖̞̗̫̘͕̲͎͍̖̣͍͈̜̮̤̮̩͍̖̜͉̼̮͙͎̤̪͇̗͚̥̟̺̘̗͉̱̟̼̥̞̜̤̫̫͉͇̳̻͇̣͎͔͇̤̼̭̠̗̭̻̘͈͔̣̞͕̜̗͇͓̥̩͖͎͔̪̝̳̦͖̙͕̟̘̜̝̫̥͈̣̬͎̻͈̝̹̼̱͇̞̬̩̹͓̠͇̩̱̗̰͕̖̺̹̪̗̙̞̱̫̻̩̮̣̳̗̣̣̦̖͚̠̝̗͖̯̣̦̜͈̻̫̟̙͎̳̻͕͎̝̥̭͙̰̻̖̲̜̪͔̼̖̰̠̖̙͓͎̬̼̫̙͂̿̇́̓̔͆́̀͐̂͒͛̀̀̃́̌̔̇͑͊́̌͛̎̓̒̈́̐͗̓̀̎̓̊̊̉̓̇̓̊̅̈́̉̈́͑̌̑͐̔͗̉̑̈́̈́͆́̍͂̋̈́̐̋̋͋̀̾͗̓̐͐̍͊͌͆̔̈́̓̒̂̀͋̀͛͌̆͋̒̀̀͌̾̈̉̇̅̀̀̋̃͆͗̕͜͜͜͜͝͝͝͝͝͝͝͝͝͠͝͝͝͝͠ͅͅͅͅf̵̨̧̨̢̧̡̢̨̢̨̡̡̛̛̛̭͎̜̰̩̞̣̣͕͈̤̟̪̥̗̻̹̳͍̝͓͈̲͙̦͈̰͎̣̖̹̥̪̼̜̻̞̫̘͔͙̞͖̝̣̳̖͚͔̺̳͉̳̞͎͉̼̬̠̝̼͙̖̠̯̼̭̙̞̲̙̟̙̺̖̙̻̥̘͎͕͕͍̠̳͉̰̣̺̩͖̦̼͔̪͉͓̹̳̤̦̆̽͒͗͆̓͛̐̉͑͛́͌̃̉̓͒̍̊͑̋̽̓̂̾̉͐͋͌̿͑͒̋̉̆́͋̄̎̓̅̈́̇̇̔͛̀̽̇̔͋̌̈́͌̇̌̈̈́̅̎̓̇̐͘͘̚̚̚͘͝͝͝͠͠͠͠ͅͅͅg̶̢̡̡̨̧̡̨̢̢̧̢̢̡̡̧̧̡̧̧̢̧̧̨̡̡̛̛̛̛̛̠̟͇̝̟̣̤̮̘̞̫̹͙̳̬̤̼̣͎̖̟͉̺̫͙̟̳͎̝̜̩̫͉̱̹͙̲̤̩̯̻̖̱͇̖̥̗̫̻̘̯̥̤̥̘̜̱̣͚̳͓̹̭̫̹̟̠͈̤̰̩̳͎̖͍̗̹͉͔̗͎̯͚̮̩̥̙͔̥͎̹̯͔̖̣͈͍͙̜̺̤̻̤̥̰͇̖̙̙̦̪̙̞̝͓̠͉̭̦͕̟̱͎̝͚̙̰͕̫̙̤̜̬̲̳̳͈̯̹͉̩̬͎̻͖̠͔̮̦͕̙̳̰̹̭̤̳̟̗̺͈̳̦͙̖͖͔̖̱̱̦̱̖͔̦̟̗͈̖̦̯̫͈̤̬̮͈̞͔̼͇̱͔̹̩̺̬̝̜̬͖͕̦̹̪͔̤̼͖̬̪͈̤̥̪̦̞̰̗̲̤̜̳̯̣̲͍̥̩͔͉̗̠̻̻̬͉̦̯̩̤̦͎̟̗͇̠͓͙̤͎̰̝̙͚͖̜̽͛̎̀͛̇̎̒̿̊͂̑̽͋̍͌͋̓̎̄͌͆̍͑͗̈̅͒̀̃̌̃̈͂̃̊̍̊͊̌̃̌́͗͆̀̿̃̀̈̂̐̈͑̍͊̂̓̍̎͒̐̔̔̀̏̇̄̈̓͊͒̽̓̏͌͆̐̍͛̑̌́̀̌̄͛̽̈́̒̉̋̈́̓̉̅̅̈́̋̓͂͌̌̀̽̿͋̈̾͂̉̌͆͛̄̋̏̓̍͌̈́̍̊̀̂͒̐̅̇̌̈́́̊̓̀̋͊̾̈́͌͌̌͌͋͐̓̍̂̔̾͑̿̿̏̇́̂͐́̈͑̑͛̆͌͐̄̒̽̌͌̈̅̀̉̈́̈́͆̏̍̅̈́͆̓́͆̈̅̓̄̍̉̋͌̀͊̐́́̀̓͐̀͌̀͛͂̏͆̽͌̐̅̈̃͌̌̏͒̍̾̈͛̾̆̊͑̃̿̾̃́͘͘̕̕̚͘̚͘̕̚̕̚͜͜͜͜͜͜͜͜͜͜͜͜͜͝͠͝͝͠͝͝͝͝͝͠͠͝͝͝͝ͅͅͅͅͅḑ̶̨̧̡̢̧̨̨̨̡̨̧̡̡̨̢̢̡̧̨̧̧̨̛̛͈͍̲̻͇̟̬̝̺̱͇͖̻͎͙̘̗̰̭͉͔̪͍̬̯͉̰̞̝̩̙̰͎̻̟͚̗̫͓̮̫̱͕͖̠̼̩̜͖̹͕͍͚̭̜̭͍͇͚̤̼͚̠͕̙͙̞̙͇̘͕̻͕͔̻̪̥͉̳̞̮̲̜̠̗͇̤͖̭̤͉͔̮͚͖̦̫̘̙̱͔̖̩̪̠̼͔̻͔͙͔̰̘̠̪̣͉̫̻̪͉͉͈͖̞̮͇͓͖͎͉̼̺̮̼̣̜̩̩̠̯̭̤̠̦̳͙̱͉̺͈̱̙̖̘̠̳̤̼̬̗̠̮͙͈̠̣̜̰̘̣͓̙̗̞̪͍̺̮͙͓̪̭͉̙̳͙̩̟̖̪̬̹̦̮͇̌̽͑̈̐͛̉͛͐̂̿͆́̏́͛̊͂̊̋́̄̅͌́͗͑̓͂͑̐̎̐͛͐̈́̅̓͊̈́̊͊̽̽̒̈́̇̊͒́̓̉̓̀̋͋̃̉̑͌̃͂̿͐̅̊͌̊̓̚̚̕̚͜͜͜͜͜͝͠͠͠͝͝͝͠͝͝ͅͅͅͅͅͅf̴̢̧̢̢̡̡̢̧̧̢̡̡̢̡̡̧̨̛̛̛̛̙͚̭̥͖̜̘̪͉̭̘̱̖̲̘̝̤̣̙̲̙͍̣̤͇̘͔͖̦̥͔͍͎̟͍͎̤̩̘̘͈͕͖̜̲̱̩̭̬̣̪̦͔͚͇͙͎͔͍͈̪͚̝̭͖̰̥̪͕̫̩̼̘͎͔̺̱̙̖̱̲͕̭̯̖͔̞̪̗̤̼̬̟̳̣͓̱̖̟̮̫͙̦̲̙̯͇͎̯̲̲̼̰̱̼͓̣̮̤͇̗̙̫̗̫͓̟̹͖̹͈̠̱̥̩͔͉̐̄͆͑̉̆̅̀̎͛̑̐̆̅̀̓̓͆̿̍̈͆̄̀̍̐͗͂̈́́̾͛͂̊̋͒͆̅̈͂̑͆̅̃̀̇̅̿̍̈̓̈́́̀̉͒̆̾̀́͌̓́̑̈́̓̀̋̈́͌̈̀̾̄̊̑̉̔̓̈͆̾́̊͋̆̓͐́̊̑̌͗͐͌̋̃́̀͗̋̐̄̂͆̾̂̀͑͗̇̐̋͊͂̄̏͊͐̎͆͗̽̐̀̀̃͛̽͆́́̃͌̉̾͊̋͊͌͗͋͒̃́̇͋̉͒̈͆͗͊̐̀̓̈́͗̈́͌͂͋̉͋̔͌̏̈́̊́͂͐́̆̏̅͑͗͌̎͘͘̚̕͘̕̕̕̚͘̚̚̕͘͘̕͜͜͝͠͝͠͝͝͠͠͝͝͠͠͠͝͝ͅͅͅͅġ̶̡̢̢̧̧̧̛̛̛̛͕̮͉̝̜̬̰̙͉̙̺̳͔̺͚̝̝̳̫͖̹̩͓̠̘͕̮̙͎͖̘̜̞̱̙̩͙͇̦̖͓̼̫͔̭̰͔̣̯̗͉̠̭̭̹̼͓̥̤̪̥̖͚̟̱͍͍͚͈̞͎͖̞̝̮̘̺͓̩̼͚̺̩̯̈́͛̃͌̆͋̀͌̽̐̐̏͂̒̐̈́͗̾͆̆̿̉̈̔̂̌̌̀̽̂͐̆̂̂̈̇̎̓̾͗̆͒̒̄̽̅̀̑̿̔̃̇̈́̈́̀̐͋̋͋̔̅̈́́̽̓̈́̇̓̉̀̑͋͑́̅̿͊̊͒̂̊̂̔͛͆͋̎͌͛̃̽̇̀͗͒́̍̓̊̊̓̅́̒͗́̍̃̉͊̓̃̋͗̈̀͌͐̊̊̋͐̓̍́̊̄͛̍͊̐͒͑͑̀͗̈͒̾́͆̊̓̒̆͂̊́̈́͛̾̿̏̽̐̇̎͛̊̾̽͆̅̓̈́̉̋̋́̈́́͑̐̀̽̃̽͂́͛́̿̓̿̀̉̓̈̒̂̈́̿̔͂̐͋͛̀̃̆̐̂͌͑̐͊͗̍̌̒̽͑̚̕͘̕̕͘͘̚̚̕̕͘̚͘̕͘̕͜͜͝͝͝͝͝͝͝͝͝͝͠͝͝͝͝h̷̡̡̨̨̧̨̢̨̢̧̧̧̢̢̡̡̡̡̢̡̢̡̡̡̨̡̨̡̨̛̛̛̛͎̠͚͙̗͍̯͈̻̘̰̖͕̗͎̭̤̬͙̱̙͖̩͇̱͇̠̺̠̫͈̗͔͚̭̹͕̹͕̫̭̳̰͚̪̰̗̘̻̩͕̟̩̲̪̲̞͖̜̹̪̩̟̫̤̯͖͇̹͉̰͎̫̪̲̞̰̰̳̗̲̗̦͔͈̳̟̻̦̤͕̳̞̯̳͉̫̭̰̲̗̟̰͈̼̥̞̖̪̳̯̠͎̭͇̩̠͈̙͙͕͕̖̗͖͓̜̫̪̺̗̟̗̭̣͔̝̳̮̠̭̘̰͙͈̗͕̲̫̘̬͙͓͎̖̱͇͙̯̳͖̜̪̤̝̟̮͓̖̝̠͓̟͇̺̘̗̠̘̺̘̱͓̮̩̤̺̜̬̦̺͍̩͎̱̰͍̜͔̜̖̝̩͔̯̤͚̤̣̬͙̳͎̪̯͙͙̮͔̲͕̩̩͈͚͓̣̞̫͖̼͈͙̪͈̻̹͍̱͚͎̬̹͉͎͔̫̜͖͙̉͆̈́̄͆́̌͋̀̊̏͑͗́̐̄̓̉͋̍͋̒̔͗̿̂̈́͑͆͆̏̌̋̃͊̆̃̏́͒̑́̎͆͆͂̾̒̈̒͆̐̃́͆̽̐́͌̏͛̔̾͌̓͛̊͆̑̊̾̔̍̊̔͊́̅̾́̓̓̏̌̈́̔̄͒̑͆̾͐͂̾͐͂͗̒̀̉̒̀̑̄̽̄͛͗͛͒̋̑̂͛̌̓͂̾̔͑̎̾̂̑̒̎͌̔̽̑̓̿̍̆̃̽̉͗̽̓̐̾̆́͗͌̏̏͗̽̿̈́̽̈́͗̌̋̄̈́̽̚͘̕̕̕̚̕̕͘̕͘͘͘͜͜͜͜͜͜͜͜͝͠͠͝͠͝͝͝͠͝ͅͅͅͅͅf̴̨̧̡̛͔̹̯̠̜̦̩̞̳͉͉̳̳̙̥̜̤̗̞̗͚̮̱̻͆͌̈́̈́̊̍̎̍̓̄͐̓̉͌͆͐̃̀̈́̌̉̿̈́́̇̀̈͆̌̇͊͛̿͂́̎̐̊́̂͆̿̅͘͜͝g̸̡̧̡̧̢̡̨̧̨̧̧̡̨̡̨̧̨̢̨̨͔̻͈͇̦͕͔̘̖̪̞̠̜͕͚͇̗͙̫̗͔̫̝̲̟͖̫͈̜̮̪̣̰̰̯̤͍͚̗̗̼͔͈̜̼̹̱͓͔̱͔͓͍̥̘̱̫̬̥̜̩̤͈͈̙͙̘̮̣̟͖̯͓͖̥̫͉͇̬̻̝͉̯̳̲̬̗̥̟͎̻̭̣̺̥͔͕̟͙̹̪̞͚̖͔̥̗͖̭̞̫͎̯̟͉̱̫͇̱͙̮̞͕̱͎̜̙̭̻̰̮̝̳̹̗͉͔͓̦̖̘̙͉͉̘̟̖̞̥͕͍̲̜̀̂̿͋́̿͗̽͒̍́̊͑̐̏̿́̊͌̽́͑̌͗̎̌̎̉̃͋͘̕͜͜͜͠͝͠͠ͅͅͅh̸̨̧̢̡̡̧̡̛͎͚̗͕͖̣̰̞̬̺̠̖͖̰̪̬͕̮͙̦̖̰̟̪̖̳̩̖̜̱̺̭̪̮̩̬̹̬̞̭̰̺̦͙̝̠̠͎̪̥̗̣̖̭̤͔̮͉͈͎̣͛͑̉̂͐͊͋̒̾͊́͗̌̔̈́̏͊̆́͋̀͛̋̎̓̈̿͊̊̃̉̂̌̎̍͗̅͘͜͜͠͠͝͝͝͠ͅj̸̧̡̡̡̢̢̡̢̨̨̨̨̧̡̡̡̧̧̢̧̨̨̛̛̛̛͖̼̥̰̠͍̳͈͎̟͓̲̬͉͎͖̖̳͔̝͈͇̘̦̭͙͈̳͖̪̦͚̞͕̜̬̥̦̮̟͚̹̗͈̫̠̮͉̩̥̲̪͎̭͖̜̣͙͖͓̦̱̻̲̖͉̖̮͙̦͔̣̬̤̠̙̖̤͈͕͓̙͉͈̮̭̝̪͉̯̖̤̤̭̭͚̱̪̬͙̱̞͙̪͉̺͍̮̘̩̱̬̳̞̱͙̯̣̯̜̗͕̯̖̬̬͉̠̠̪͉͚͙̤̫̱̪̳̤̤͙̝̳̮͓̼̪̜̳̦̫͓̩̤̞̜̲̣̘̜̖̠̠͚̟̤̳͓͙͈̥̪͕̼͇͔͔͉͔̮͇̹̰̥̳̰̺̼̘̟̗̦̳͍̪̬̤͕̠̭͓͚͓̝̼̙̘͍͉̯͕̬̳̋͛̽̀͑̈́̑͌̀͛̓̈́̈́̂̒̈͆̇̒̔̾̍̍̾̉͒̄̊̆̏̈́͑̇̏͊̿͂̂̊͌̈́͗͐͐̌̃͌̽̋̔̍̏͒̐̑̈́̏͊̃̀̈̈́̎̂̈́͛͂̽́̈̉̆̀̍̏̉́̃͛͊̓̿͛͂̋̃̍̔̏̅̍̄̏͒̋̊̋͗͆̓͌̄̈́̄̀̄̒͗̀̎͊̆̑̐͆̿͗̎́͆̕̕͘͘͜͜͜͜͜͜͜͜͜͜͠͝͝ͅͅͅͅͅͅͅǵ̶̢̧̧̨̧̧̨̢̡̧̡̢̢̢̨̨̡̧̢̛̛̛̤̜͈͇̟̼͖̞̫̫͕̻̞̰̞̹͈̜̜̰͙̳͖̙̝̹͉̭͓͖̹̼̮̳͔̗̮̖͈͙͍̭͎̩̮̼͚̝̱̜̭̠̣̤̤̣̺̰̪͕̤̣̖̣̳̻͙̯̤͉̠̮̜̪̳̦̤̫͕͍͕̺̪̘̰̣̹̹͖͍̹̱̲̣̗͉̙̟̟͈̦͇̘̭̥͈͖̬̙̜̝̦͎̣̗͍̯͉̦͙̫̞̙̹̙̝̣̹̪̝͚̱̝͍͓̜̭͉͎̭̹͎̖̮̙͓̝̱̭̠̯̖͈̯̟̟͈̥̲͖̜͎̠͎̟̩̻̻̗̹͕͙̟̳̘͉͕̪͈̙̞̙͇̬̺̟̻̯̘͚͕̬̝͈͉̣̬͚̻͓͔̩̳̣̜̯̬̳͎̺͖̣̗͇̦͇̞͐͂̽̑̍͛̀̒͛͊͑̀̾̃̔̏̌̐̐̉́̆͋̈́̈̆̐͊̒̽̂̐̓͐̓͋͒̐̈́̀̈́̓̄̿́͊̒̇̒̌̑͗͛̊̇̎̀͒͊̌̒̂̓̆͌̎̔͊̆͋͛̓̾͑̈́̓͋̀̄́͆͒̓̀̉̈́̀̌̊͐̀̀̅͑̿̾̾̿̽͂̈̊̌̔̿̿͗̂̊̊̓̋͂̇͋͛͛̚̕̚̕̚̕̕̚̕̕̕͘̕͘͘͜͜͜͜͜͜͜͝͠͝͝͠͝͝͠͝͝͠ͅͅͅḩ̷̡̢̡̡̢̡̡̡̢̧̢̡̡̛̛̛̞̞̙̦̹͉̭͉͎̯̘̤̤̖̬̦̼̻̮̬͖̟̤̥̤͉̫̲̲͍͚͕̥̹͚̺͚̞̝͖̳̗̬̤̱̜̰̞͇̬͈̣͚͉̜̲̲̱̭̟̰̠̥̜̦̦̤̞͇͇̼̹͉̟̝̼̹̦͙͔̹͈͉̞͖̯̘͈̼̗̦̖͇̭͚͔͖̻̮̞̗͖̟͎̠̦̰͙̯͉̪̘̩̠̻͍͚̻̲̠͓̠̗͙̖̻̯͙͈̖̯̟̦͚̘̹̮̦̲̮̱̩̻̫̫̮̰̥̠̩͍̙̺͇̱̘̝͓̭̱̜̯͎͎̱͕̥͇̬̫͉͕̣̬̩̮̮̮̲̪͈͔̱̬̱̖͓̳͚̥̃̃̓̌͐̾̊̉̔͊̂̍̃͛̈́̃̏́̉̾̓̔̅́̑̎̃́͑͂̑̉̈́́̈̄̾̾̎͆͗͑̆̈̊̋̋̅̌̓̀͋̈́͋͛̈͛̀͗̌̓̈͐͐̿̔̅͒̈́̎̈́̃̒̃͋͗͆̿̏͗̑̈́̎͗̾̆̔͊̓́̾͒͑̆̑̍̑̽̈͋͒̑͆͐̇͌̇̾̈́̏̂͛͆̄͗̌̍̒̈́̄̈́̽͊̂̈́̐̽́̈͌̍̌̄̄̔̅̇̑̃́̄͊̔͗̏̌̀̆̍̍̎̑̓̔̐͆̋̿͆̈́̌̔̓̇́͗̿͗̎͂̋̾͆͛̃̆̔͌̓̌̅̃͊͛̎̔̋̈́͌͊̍̽͌͋́̈̿̆̿̆̔̉̋́́̂̚̚̚̚̕̕̚̕̚͘̕̕͜͜͜͜͜͜͝͝͝͝͝͠͝͠͠͝͠͝͝͝͝ͅͅj̴̢̨̨̨̧̧̛̛̛̛̛̖̥̲̟͔̝̰̘͓̲̜̼̪̦̩̝̲͇̣͓͉̼̦̙͍͇͚̩͇̩̖͍͉̦͎̤̯͉̬̺̜̣̰̪̹͔̜̻̝̹͎̖̝̱̰͔̙̺̤͖̩̤̱̫̞͔̝̖̱̠̬̳̺̘̘̬̗̙̹̗͚̦̥̱̜͇̹̻̻͚̪̞̥̼̜̙̟̼̰͕̣̖͖̗͚͓͚̦͈̣̭͓̳̲̦̜̖̖̣̼̠̩͓̣͕̞̱̤̻̮̳̺̠̗̝̮̦̗̩͔̪̦̤̬̺̦̻̼͌̏̐͗̅́̄̌͌̑͆͂́̆̈́̒͋̔̑͌̔͒̋̀͐̑̓͑̃̍́̿͑͗̐͒̍͐̏̽͆̐̈̒̊́̒̑͑̑̃̓̿͗͗̀͒͋̂̏̽̏̇̉̀͊̽̃̆̔̅͆͊͆͋̆̍̅̃̍̆͑̓͐̌̈́̈̀̒̿̈́̈́̃̀́̈̃́̌́̏̎͆̓̒̆̉̓͋̉̿͛̐̀̈́̀̊̿̈́̒̽́̑͊̍̐̋̉̾̈́́͂̈́̒͆͗̈́̽́͒͛̑̀̽͊̽͋͋̀͊̎̌͂̆̌̎̓̄̓͌̾̾̒̆̋̂́͊̄̉͌̑̇͂̋̔̎͌͊͂̀͂͑̃͛̽̿͌̂̈́̀͑̏̆̈̒̈̅͂̋̌̎̌̅̾̈́̓̒̍̊̆͛͛͒̀̀̽͂̈́͊̆̍̅̐̿̽͑͌͂͆͐̿̍͂̏̌̈́̈́̇́͊͗̃̆̑͐͛̑͗͗̇͐̍̀̽͆̍̚͘̚͘̕͘̕͘̚̚͘͘̚͜͜͜͜͜͝͠͝͝͠͠͝͝͝͠͠͝͠͠͠͝͠ͅͅk̵̨̧̢̢̧̨̨̧̡̧̧̡̨̨̢̨̧̨̨̛̬̖̰̦̟̟̘̠͙͙̗̮̙̤̞̭͇̟̖̘̦͎̹̠̭̘͙̝̹̳̫͇̠̺̠̪̤͍͉̘̲̞̣̦͉͉̻͉͖͍̝̻̤͈͕̼̼͍͙͖͙̤̯̙̟̪̰̤̻͎͙̹̱̩̭̲̱̰͇͙͖̝̩͇͉̲͉͈̱̝͈̫̲͚̣͙̘͔̩̥̝̮̳̭̤͍̘̤̪͈̮̮͉̘̰͕̖̻̦͕̝̭̘̙͇͔̘̥͓̱̪͖̺͍̭͚̹͉̼͙̫̭̜͇̲̯̘̙̹̘͚͔̹͖̟̯͓͍̣̜̮͈͈̥̱̖͙̲̤͓͈̪̰͕̼̍̄͋́̌́̏̀̐̽̑̎̋́̑̐͛͊̂͊̔̉͒̒͑͜͜͜͜͜ͅͅͅ';