diff --git a/frontend/src/index.css b/frontend/src/index.css index bd180ef..3e205a9 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -23,15 +23,15 @@ font-weight: 400; } -body { +html, body { margin: 0; min-width: 320px; - min-height: 100vh; + height: 100%; } #root { width: 100%; - min-height: 100vh; + height: 100%; } /* React Grid Layout Dashboard Styling */ @@ -190,3 +190,37 @@ body { background-color: #ffffff !important; border-color: #e5e7eb !important; } + +/* ============================================================================= + Puck Editor Height Fix + Force Puck to fill container and enable sidebar scrolling + ============================================================================= */ + +/* Container must be positioned for absolute child */ +.email-editor-light-mode { + position: relative !important; +} + +/* Force Puck root to fill container absolutely */ +.email-editor-light-mode > [id^="_r_"] { + position: absolute !important; + inset: 0 !important; +} + +/* Target Puck's main layout - all direct children need height constraints */ +.email-editor-light-mode > [id^="_r_"] > div { + height: 100% !important; +} + +.email-editor-light-mode > [id^="_r_"] > div > div { + height: 100% !important; +} + +/* Force the left sidebar to be constrained and scrollable */ +/* Use calc to account for the header areas above the editor */ +.email-editor-light-mode [class*="_Sidebar_"][class*="--left"], +.email-editor-light-mode [class*="_Sidebar_"][class*="--right"] { + max-height: calc(100vh - 280px) !important; + overflow-y: auto !important; + border: 3px solid red !important; /* TEST - remove after confirming selector works */ +} diff --git a/frontend/src/pages/settings/SystemEmailTemplates.tsx b/frontend/src/pages/settings/SystemEmailTemplates.tsx index 3626d8c..74630a9 100644 --- a/frontend/src/pages/settings/SystemEmailTemplates.tsx +++ b/frontend/src/pages/settings/SystemEmailTemplates.tsx @@ -5,7 +5,7 @@ * (welcome, appointment confirmations, reminders, etc.) using a Puck editor. */ -import React, { useState, useCallback, useMemo } from 'react'; +import React, { useState, useCallback, useMemo, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Puck, Render } from '@measured/puck'; @@ -103,6 +103,36 @@ const SystemEmailTemplates: React.FC = () => { // Get email editor config const editorConfig = getEmailEditorConfig(); + // Fix Puck sidebar scrolling when editor is open + useEffect(() => { + if (!editingTemplate) return; + + const fixSidebars = () => { + // Target only the main left/right sidebar containers + const leftSidebar = document.querySelector('[class*="Sidebar--left"]') as HTMLElement; + const rightSidebar = document.querySelector('[class*="Sidebar--right"]') as HTMLElement; + + [leftSidebar, rightSidebar].forEach((sidebar) => { + if (!sidebar) return; + + // Make the main sidebar scroll + sidebar.style.maxHeight = 'calc(100vh - 300px)'; + sidebar.style.overflowY = 'auto'; + + // Remove overflow from inner sections so only the main sidebar scrolls + const innerSections = sidebar.querySelectorAll('[class*="SidebarSection"]'); + innerSections.forEach((section) => { + (section as HTMLElement).style.overflow = 'visible'; + (section as HTMLElement).style.maxHeight = 'none'; + }); + }); + }; + + // Run after Puck renders + const timer = setTimeout(fixSidebars, 200); + return () => clearTimeout(timer); + }, [editingTemplate]); + // Fetch all email templates const { data: templates = [], isLoading } = useQuery({ queryKey: ['system-email-templates'], @@ -281,6 +311,7 @@ const SystemEmailTemplates: React.FC = () => { puck_data: editorData, }, }); + setPreviewSubject(preview.subject); setPreviewHtml(preview.html); setPreviewText(preview.text); diff --git a/frontend/src/puck/components/email/EmailBranding.tsx b/frontend/src/puck/components/email/EmailBranding.tsx deleted file mode 100644 index 06ecb00..0000000 --- a/frontend/src/puck/components/email/EmailBranding.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import type { ComponentConfig } from '@measured/puck'; - -export interface EmailBrandingProps { - showBranding: boolean; -} - -/** - * EmailBranding - "Powered by SmoothSchedule" footer - * - * Displays SmoothSchedule branding at the bottom of emails. - * This is shown for free plans and can be hidden on paid plans. - * - * Note: The actual visibility is controlled by the backend based on - * the tenant's billing plan. This component is always rendered in the - * editor but the backend will omit it for paid plans. - */ -export const EmailBranding: ComponentConfig = { - label: 'Email Branding', - fields: { - showBranding: { - type: 'radio', - label: 'Show Branding', - options: [ - { label: 'Yes', value: true }, - { label: 'No (Paid Plans Only)', value: false }, - ], - }, - }, - defaultProps: { - showBranding: true, - }, - render: ({ showBranding }) => { - if (!showBranding) { - return ( -
- [Branding hidden - available on paid plans] -
- ); - } - - return ( -
- - SmoothSchedule - Powered by SmoothSchedule - -
- ); - }, -}; - -export default EmailBranding; diff --git a/frontend/src/puck/components/email/EmailFooter.tsx b/frontend/src/puck/components/email/EmailFooter.tsx index eff8acb..a68ff2d 100644 --- a/frontend/src/puck/components/email/EmailFooter.tsx +++ b/frontend/src/puck/components/email/EmailFooter.tsx @@ -9,7 +9,6 @@ import type { EmailFooterProps } from './types'; * Supports template tags for dynamic content. */ const EmailFooterRender: React.FC = ({ address, phone, email, website }) => { - console.log('[RENDER] EmailFooterRender called with:', { address, phone, email, website }); const contactItems: React.ReactNode[] = []; if (phone) contactItems.push(phone); diff --git a/frontend/src/puck/components/email/EmailHeader.tsx b/frontend/src/puck/components/email/EmailHeader.tsx index 9039a2a..c4ea56e 100644 --- a/frontend/src/puck/components/email/EmailHeader.tsx +++ b/frontend/src/puck/components/email/EmailHeader.tsx @@ -9,7 +9,6 @@ import type { EmailHeaderProps } from './types'; * Supports optional logo image and preheader text. */ const EmailHeaderRender: React.FC = ({ logoUrl, businessName, preheader }) => { - console.log('[RENDER] EmailHeaderRender called with:', { logoUrl, businessName, preheader }); return (
= { categories: { structure: { @@ -46,13 +36,8 @@ export const emailPuckConfig: Config = { title: 'Layout', components: ['EmailSpacer', 'EmailDivider', 'EmailPanel', 'EmailTwoColumn'], }, - other: { - title: 'Other', - components: ['EmailBranding'], - }, }, components: { - // Direct assignment - no spread to rule out reference issues EmailHeader, EmailFooter, EmailHeading, @@ -63,12 +48,9 @@ export const emailPuckConfig: Config = { EmailDivider, EmailPanel, EmailTwoColumn, - EmailBranding, }, }; -console.log('[emailConfig] Config ready with components:', Object.keys(emailPuckConfig.components)); - /** * Get email editor config - creates a fresh clone each time. */ diff --git a/smoothschedule/smoothschedule/communication/messaging/email_renderer.py b/smoothschedule/smoothschedule/communication/messaging/email_renderer.py index 6e03673..e1f1373 100644 --- a/smoothschedule/smoothschedule/communication/messaging/email_renderer.py +++ b/smoothschedule/smoothschedule/communication/messaging/email_renderer.py @@ -15,7 +15,6 @@ from typing import Dict, Any, Optional, TYPE_CHECKING if TYPE_CHECKING: from .models import PuckEmailTemplate - # ============================================================================= # Tag Substitution # ============================================================================= @@ -304,7 +303,138 @@ def render_email_branding(props: dict, context: dict) -> str: return '' # SmoothSchedule logo as embedded data URL (works everywhere without external hosting) - logo_data_url = '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 ' + logo_data_url = ('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAj4UlEQVR42u19e5xcZX339/d7' + + 'nnNmNhdCEFaoCAgpkNkEKBGpQJkoirbSitAB9r4hEgXFKrVYL3UY+hY/FdH6QlEXgew1wPhiVWyjRc2UUqwaBZKdBAhCKi' + + 'U2xMRcd+ac53l+7x/nnNnZzeYGudr5fj75EHazs+ec7/O7Xw7QQAMNNNBAAw000EADDTTQQAMNNNBAAw000EADDTTQQAMN' + + 'NNBAAw000EADDTTQQAMNNNAAQP8r7zmfJwDIlcu1+y8CQCYjAIBCQQBI43gcCcjnOZvN6mw2q/fpQMc/l8vlFESoIcGHG6' + + 'nLlnGpVDITvzWrvf0oT1IzlTYznKijGFAAYAUVsN3mA7/dPmPGhjV33lmd+Jm5cpmKxaI7kqSbfteIRblMKBZt8qWWzoWz' + + 'WeR8B/kjQOYI5GQSHA2iFDGDQAAB4hzECQSyg4BXwPw8iSwnwuOhC3+yemhoXfKZuVxO7ZHofJ5RKLgGwfuL2Mh2OgCY3X' + + 'btycTuGia6UkTOVZ6ngIREBxEBoj9jBBARAAIRiBikGEQMEQdnzGYilEA0lNroPbL8kd4deyCaDhcpP9IJplwux8VYYmd3' + + 'LDhfkfwFgD9l7U8TZ+GMgQAWgESyCt7DvQtEBEQiEAGImEiR1iAQnDVrRORr7IJ7VwwPb4pFWtW0Rvz3lrauOySk28vFvl' + + '8fZMLH/S46oqU2ltiWjo6zifRnALqStSYbhhBxhgRck8yYOCFy0f0nyjlhNfmPROIsEoly/HUBHACwUoqVhjPmV4B8OVX2' + + '/u/y5b1hLpdT69dnqFQqmExr503+1Gl3VHbsePPq4b7l4w5AQ4L3jGw2q0ulkjmro2OqJe9vCPgoa52yQSACOIqklOqJIS' + + 'LFrECKASJAIkGdqKEjNmNVbi0EkhwUTr4pgGOlNGsPzpifWxt+YtXwwKOReeh8h1L6+6y12Er1ppEl/V9OrvdgSO5ZHR3N' + + 'BjiqPDi4BgD0EaqSzRnXdL7Zkb5fed4cW63CBIElQFHkFYtADBFrpbUiItggrDhrnoPDShGsBsmvIPgNJXZYeJooORaOTy' + + 'OS0wHKEPMpyvO0WAsXhk6IhIgUASzWirHWKs87V7P/ry1tXX8Liz4QD8T2noVwOYAvl+bPdyiVDvShV6VSyRjHH3dkv3Qk' + + 'SnCUoCgUXKaj68NM+nZiStswNESkahIr4lgpxdqDDYNRgH4E4GEF9cOnB7/+wt7+spO7u9PTnZojkHdBcAUrPpeIYcOall' + + 'A1cSdi1houDLeSUtPFWkfMLOK2KXKnPT04uB6Ryj8gdnjeokXe8t7esKWj+w5xUOXhvo9m83ldKhTMESLBsX9UKLhMR/c/' + + 'aj91gw0CuNA5ItKx8bREpHQqpVwQ/tqZ8OsC1VcevHdN/SclthJYhubm5toDX79+fe2wl+bPd2sLhQqAn8V/bpvT0fMOB/' + + 'chYn4vK6VsGFpCTXWLC0Mh5ulirYCIxTnHnj/N2PBcAEtzV13FxcjZOyDkzm7r/CCBbyLHxwOgUmKajphYPZ+nludfHNB+' + + 'ui2sjhpCndQCTnu+cjbcKsL/oBDc9fTg4PpxSY/5890+xqWEfJ4mJkwynQsuYsGt7Om3OWMgzmKCr0axK250Kq1tpXLryH' + + 'B/PpvN61KpYA6AubKZts7r/GnTe4Pt2z5fHur/RBy+2SOB4Egtl8vUkppSVH76faYyGhKRV6ceSfk+OWO+bY18fNWSxc/V' + + 'HLF9J3XXyOUilRw/uDntPR8Qps9A5A2InLWJz9Ky1sqG4Y/Lw/1v3a+hUp1X3tLefYtKpfM2DNZbmMzqU0/dVJ9L58OZ3G' + + 'w2q1AouBZvyoBOjSdXRBwpxcQsNgg/unLg/veuWrL4uWw2rwFQqVQy+zWTVCxaFIs2m48+f+XQ4q+Rc//FSgGxOpwAdtaC' + + 'gHPmtrefCEBqCZnX5EzlNYpFe8af/dn0lo6eYfa8PJyDc+aTqwcGfhMXUGoHSR2+oVBel0p9JtPaebs3pekD4WgdubF0gO' + + 'g3YsyVI8P9Q7lcTpVzOVrbVziQ8SatLZXcvHmLvGMumfsj5fsX2SCQ2MmbzLRY9n3fGVr2ysonn801N3O5XJZXLbXlMtau' + + 'Lbkz27v/0Jsy9VvM+hIAsCb43qqhgb+sV80JDksnK7rQgslc09Wq06mPh5XKOHKV1kqcW2ckvHT1ksGV8xYt8oq9veHBMB' + + 'fz1q07qrojeEj7qYtNZTQAEQsgcWKEJhhkIWKAXRbAd+oduX1J6MRFDpvNZvUrJ576SWJ8FiDtrAlB+K2nsBAAFZNyZx0O' + + 'PwnO57l8992S6Vg4ixV911mrSURFySVxrLWC4Nc2HH3n6uHhkWw+r5/44hfNQTh1Cnff7Wae2XIFKX2VCwPNnt+kPI+ZVS' + + '1jFqVFxQEkFCVQWKzMeOWKy7+6tq/P7ctzyAJqbV+fLZfL0tLePX/06GMeUL7XIcYQgJCV8sXaK1YM9j+Zy+VU+e673WGf' + + 'yUrUTKate5n2vawJA0sgBREhZgHzVmPsJauH+5YfpAzRpPiDtmtPrrKdzcTnOCdvJpKzIDiZPd8noigbZi3EOQEQCNk55c' + + 'HBNXusMtVJLADMbu35faXpUwD1EBPiuB/KT2lTqXywvKT/a7t7DnQ4kju7vfNaz2+611Qrpi7ONdrzdFgN37dqSd8/zZu3' + + 'yFu+/ICr5b33GfJ5veGFF05m4XPF0VsE7mwALSD6PX/aNIRbt35k5VDfnbsgIwp5MhlJyD+7u/sU69T1gLuetTfdBoGIiC' + + 'NmKM9TNqjcPDI0cPuewq/DiWBCPk9zn3tuhiVvFTMfF8eYLCJWp9PKVipfHBnu/8skuN9V8eEg1GIJ+TzlymVavz5Dpeay' + + 'TFZMyNxwwzS1ecfp7HnnmaDyysjwwMN110bI5TgHoN4xyrR1n0OKP0hAK2vvKBsGEBELESImKM9nUw0+Xh7uu2PS53C4El' + + 'xTze1df69T6ZtNpSa9lrVWztgnj5118nnN5bLsVVfFwS+415G+niaNwUUIV121E6lnXHvtdB3gUoLrEaI/VlH8DHHOEJES' + + 'iGOlFQTO2fCD5eGBezK5nF8uFoM9VaoOD4IjMqSlp+dEhLIaROm6PighZpB1b1kxWektJrKlo+cCYr5TnDix9kPlJf0/OZ' + + 'Q2Orm2eevWqQ3VqjrlxRdN/bWc1dEx1UFfAML7IHgPaX0SALgwjNKucY5CRKxOpbQz5r9dGHaVHxj8Yba7O13q66vM7lhw' + + 'vodw/dODgy/sKpFyWIRJ2WXgEmAkdB/WqfSURHoFYrWfVqY6+vXy8EDkVBWL4wm75RYBwPLcC3drP3W2cxaOsPSMXFu2VB' + + 'xecZBJJuRynF2/nkrNzYJCwS6PkiDhWgBnti86wePgLSL0Hgu5lJU6mZjhjIENwyS1yASoKLcOpVNp7cJwaRiOLnzmgQde' + + '/sNcrqnU1zfa0t51qYi95Iyg+qmndyPFh4MEU3yipxinnmHFvyfOCkBERBBgCxl1xsoH7l2fVJMmU40tz71YJk/PkjA0pH' + + 'UKgl+bavDO1Q8NrpwsAbA/1XJ22TIuNTfvZIfn5RbNCJrM2eLc2wR4O4BzWOujiCjqNLHWCZEjkfH1ZiLRvq+sMTvg3C0j' + + 'Q323A8Csd9+YWrP0zurs1p4/IXZ3+IG6+Mni/a/sLg16yAlOJCzT1t2jU/79SV03SdabSuUfysP9H9sVScnXW1q7r1Fpf4' + + 'kNAiMipDxPiXP/HVTCP3q2OPjCfiR5TEonaIZM7oZpakowx1lzEZFcLI7OY8XHk9JxA4GBiNg4McJ1HSM1YlWUoYNz9lti' + + '8any0P3l2FO2AKSls+cGIv5Ha93Fq4YWP7an+zrkKjophhPkWhlrsRACKRsEFWvpy7vK0iBxVnI5NbKk74GWtq7ZKp3+rK' + + 'lWjTWhVdp7g5fWj2ZynW8rFgf+6zWRnMupGqnFoi3Fh3PTSafNdbAXCfjtcDvOE+E3KN+HOAfAwhkjYo0lUNIPpgiIukri' + + 'ShiJEHsegxlizE/h7OdGhvq/CQCzbrwxVbqzUJ132WVTqjOP/YI3Zdr1wbYt160a6n8sm83q4kSTdVhJcOIgdXWdBkur4g' + + 'NHAljt+8pWqt8aWdJ/+d4Qk2iClrbu+1Q6tcBUKgYEUp6vnLUrQlN5+7NLlmzYx/6ocU19kZTmfE5NzQrhMnF4JzPNZu0B' + + 'InDWQJyVKJtFVNc6hAnetBPAEbNmHcmYM/ZnQvKl8sDiBwC4+hAo09r1FtLq7tS06fMqmzfdVh4e+PTehEiHXIJj58rB8r' + + 'uU73smqBhCnNgQASlaDID2JodbKpVsLpdTCHdcVyacrFOpt5ugam0YWOX5c32kHj3rfR2XPl0cXL9Hkusa5xNyozowXSmQ' + + '95Di32dWEaHWwgRVA6DWqEeTPVcRJwRHAmatmbRmGwSjYu2/wlHvyND9/wxAooaE9brU2xue/d7uo+10+hSAj+imKanq5s' + + '13lYcHPp3NZnWpt9fsnT05tMGvQrFoM21d39R+6vIoLQkmZnLWvhKQnbVmaGgL9raWGodbc9vajhb2HyelZltjLESgUyll' + + 'w/Dp0FYv2Y0kj5PYc3ILjrNputw5t5AUn89KR6QaUyNrnB2dSGnkQQsBipQiVhriLJy1T4Pom07J0KrFY/Xr+KAaADS349' + + 'pugXyGPe80EOCq1S+sHOr7q/i693q64pA7WfMWLfIq26pl0mpW9ODIac/XJqw+XB7qv3KfW06TQ5PrmMVp7wkAx4q1TgCn' + + 'fV9bY39RrW5715pi8ZVxaq7u95xxdfcp2lMfIEgPe/p4cQ4uDEUIdrekRo6SAzDWSx17zICsAfh7TtzDLdXtpZpmSBIWMR' + + '8tnT1XEfAxYnU+QBBnjXPyifLQ4i/uK7mHluDY/mY6OmaRqDIALzr1YnUqrcNK9S9WDffdmc3m1b62utQ867buC0mrH4qI' + + 'gnNclzR4Mgzc+555sO/FSB2DS6WCmdvWNlNU6iaB3Kg8f4YLQzjn7IQe6V1JqSalwEpBROBMuIlAPxXID4T1smDGlKeSea' + + 'dcLqd+OXMmJ4fr7O7uo43lKwG8n7X6Q7EWxAwR+Y2YsGdkeOCRVxvPHzKCx5yizsvYT30nbmJTEHGkNYuxF40M9z3+apvG' + + 'kyT87Gu6Orx0asCGgQGgRcQqz1POufUk7qaVg31DANDS0fOnIP4H5elTbRDU0oSTPKOxJvialDJcGECAZ0H4D4g8Qkb/+8' + + 'oH7v2fye45+f+WjgVnE0mbCNqU558Y23SrfF9Za0u2Gi5a/eDAs6+ln+sQOlnzAZQAcIaY4+dGQszsjN3OTkfdkMWH3Ks5' + + 'h6VSwcQqeDDT2nmqbmoqJNUpG4aOlWpmzx/MtHW1ArSWlbpBRBBn0VRSxZqofolIK60VQHAm3CLG/JSI/sUp/QPs2FyuU7' + + 'djzlqUBHGlUsmccXX3KdqnPyFBq0AuYO2zC0PYaqXKnpeCUtaG4d+NDC6+JXG6isVX36x3CAleFusQeROSnjURgVJEzq57' + + '3bo1v3mtSmZ5b6/JZrO6tGTg1kx712ztp64xQdUSkRJrxVoryvffQ0Sw1aoAkInECmCTOJWY2YbhDjHmh46wxGNXeqq//7' + + '93eQGFgisBLpfLqSIgmdbOv1G+/msQTYEAYkKYasWwUlql0ilnwmXOuo+Vh/uejLNkXCy8thakQ0ZwrSdZ6PU1n4FIiBmO' + + '3UulUsnsh4qQlEoli3yem9atW1jdHpzNyjtTTOhim0ouDKPMUkQs1UssACjfjyYTjX3SOdenlfzTU319L+7KwTtr+vTZpm' + + 'IvQJP+RvneezdGYV4m+lyFNGs9JRzdUSFiL6qjsBLQL40Jbi0PLO4bp8qj7kgckQQnmSkhHB0nsCgZCSMnG4BoxULxtf8q' + + 'yZXLXCwWd8xp7byeFP9owlNTOxtZsUnKEM48ai3fWQ62fXcyX6Cla9FpZMO3CrmLCPRHzmA2gA+Ut2zZPHZAlyUuzxpxTk' + + 'Cso6xWnNMKzftGHuh/Oum6LBX2X//0oVPR8ekkYCpEkkA3+gvJNmD8tMFrOkzFos3lcqq4ZKDU0tb1OHv+hdbETt3OsDqV' + + 'Us6YlbD465VDi7878R9k2hdkmNEK4F3igrPY91IiAuV5CHbsyJeH++6p1z6JthJLm0RL0phXi+2NYp3L5VSxXMb+nkI85L' + + 'loOUj7L5LDQqS+RoovQigS54NrFwJmF7XDmLs2B9tufqlYHE28+BNzuaYZ/tR2EDoI8lb2fF+shRgDG1QD1r4Ktm9/rDzc' + + 'f2s2m9elyWznZLNJRCATeklOfX/f9+HQ+D5Jrnb/h2+JLU5t9h421covle9rQAIBrIiEYAJrrWwQ3DwydP+Np61fH8bib+' + + 'e0L+iYkZ72C+V797DSWRHxTaViXBjGSQfS4qwomI8AQKm5POmWnqjD9uDi0BNMFI4jO1LcM8c5YvtJWQDA8kd6d8ChVZzb' + + 'oNJNvvI8pdNpj1hZF4TvHxnqu33eokVeqVQymdaut8zpuvYx8tQAEZ1hqlXrTGhr3nbEmFW+z9aagRXDwytyk8TtNe3h7B' + + 'SKq0hj9ytg7VUi3Z+R3x2C411VgGxCVNhPxvAhhOOiEPih/dtTVSg45PNcXtL/k7C6/TwXBLeJs//PheYrLjQXjgz33RuH' + + 'V7alc8GnSat/J+aLbBhaMcbFiY9xyQ8ClA3DUJP399hlWXN+dKeM4yKzIDWSnXNGIdxyoB7zIbPB2WXLokqS0MtxFlAgwu' + + 'IcIHL8vEWLvOWRdO/f/RYxyc8UCi8C+PTEb5/Z3n6uZv9L7HkX22oV1rnIGaPJLAmM9nxlgurSFcOLn8nlcmrSuDXJ6UBO' + + 'HKe8mAHnfutNqW6sdzx/R1T0/DiFKy8lA5cgInEORHzC6OjoCbXE4P734F02m9WzbrwxVfOMcwuPmdPR8380pR4npS42lY' + + 'pJKkG7MzACIYL07i4jU4rnkUjoTHHRDpC4kR8Q/Hp5b3FLvRk58gnO57mp6T8VQEIiP0Zy0wDBOcdapcnRmQCQu+qq/XWN' + + 'lGyvi50us+bOO6vn5BYcN6ez5yZOu+Xs+Z8WsWkbhnanxMfO7r9jpdgFwXMSVr4fh2NuF3GajaYeJSPOgkRIiATEEMgaAH' + + 'IgPOhDQTDlcjmFQsEtXbq0Oueaha8n5nc4Z6PhrUhkLDE7EcyLHJQMvVZCc9HDExQKLkn2z23vObels+fLYVpWsPbuAHCK' + + 'qVbsXkhtnICDsNZEoLvKxWKQzebVpBIYJy/W/97aN4HoFLFJs4cIMYGA5QCQffX3eVjYYEqWhBSLRTu7re1kZv9GwPWQ9l' + + '7ngsBJFCOaqJTKDOAyAJ8rzYdDaa/I3HnSoFCQZJVBNp/XG9esPUuYLoW4KwQ4T2kfzoTRAhcR2sUY6C6kV7OtVl82aXU/' + + 'AIqb4ibxNcAlQIjkbcpPaRNUDQEaAhZr4WKCm5vLcmQSHIcNpVLJnJrLzWhKT/sEQNcrrY62QQAX2JCV8lTcm2TDECYMXi' + + 'LCi5lczi8XCsFOZMZdjUDctFcoOBQKMiGtSbNbe2Ypj84X59624fm1FxLRGaw9JAvS4hYhNakTFS9XSVYuTXCunPK0NhV7' + + '2zP33bd1d7Xa5lpMLJfVCbgwM9vQbFfO+/lu1ft+TzLsX3Uc7ZCIGtUWgegvSOlZLgxARGDPi4vjZh0Ij0FomSj3RFMq9e' + + 'zy3t4dgBByV3E2XppSKpXsZGpw1o03prwNW0/SGhnr5M0EmgPILBE5Q6dSHgA4a+O9VzA7taxOSK3Fsa12YWghsgPM0xOS' + + 'k/lka8xTTVNT5112wgm2sOv1wwRAMrmFx8A3a5h4poiT6IB4yoZhqTzUN/9AjtnoAym1xWLRtrR3XQrWt5HiedF+SAfWGu' + + 'LsGhcG3wfRd9NV//Hlxd7N9RYul9ukikWyKMLWa+izu7uPDgM5nRTNheAcABls3HoqWE6E8rT2GHACcQ7OWpggiOxqTCoB' + + 'erKQJ26KE1ZKaT+lbVD9qYgsY6Wvk6gHluMEB0TEEOi65b294fLIvk9KTmKW4JlW7fszk57vyP4yROSROjV+ZBCcjJdEud' + + 'spnyfmD7OO21is3URE3yNC/1aWH63t66uMhSn1vUkkxSLs3LbrZzoenQ3BeYjmb1uMwams1XFRuymN20oXlf5E6lYRUs1h' + + 'IppcXgEHEWKtWSkFZ8w6F4a3B9sr/+JPbXoEhKNhnYsjG+Ol0164Y8cny0sGfrqHdl4qzZ/vMs3NPiA3io28ZxBFPd/Vas' + + 'gW34zMzF75GYdeRdcmBKM+3q94qfS51oRwxj5HkPtJ9MCKoa+/lHiXO60oWrjwGArseSR0sYi7EIQWYnUsKx3lQZJtsc7F' + + 'vceI9k1Osj5ht+UNUK3lJjETYuwqgdy3Tcld6U2bPO+o1/2CtDrNBoEjIhaRUKfTnqlWHywP9V2zpx6p2sRGe1er9lPDYx' + + 'MbsMrz2QXV740M9//xgd5jSfvb3ra0dnWxp/tUKo1wdPRpJrqLJBh+enBwOzC2uCv5wTldC88C7MVicQmAC1irZmI1bkJe' + + 'ILZueSjv43ULACdR2SpqXx1z6DYT4VEQDU0b3bb0x8XiaKat7Rzm1LdI8UlRSZGUiIQ6lfJcEPxH5Zij3r7mmGPCPaz9J+' + + 'TzNGvjRi+1cfMKUnqWGCO13LXnKama96xcsvifD+Dc1H4iOO5FBiBz2rtv96ZN/3iwffuLAve5YOZRfWvuvLOKfJ5xyy2S' + + 'lMsy7QsypOhyOHcFgHOV51ONUGujnuOxUY99I7O2URYgEUXMREqDFEOMgXP2ZRA9DvB3fA8/+MV9972c/HBLR9f1xPoOAE' + + '3O2kjiYnJtGP5MqtvfVS4WN+7JKao1FLZ2/pVqavq8qVZsvLjNstbsQvPkSLjjPBQzAhzYGWbaD+Q65PM894WXHgDTnzvr' + + 'PmE2b/jqM9/+9tZ69RNthtWXAdwNce9Uvh8t+TQGAjG7HfWYhMRon3Pd+l9A1RZ5c/QxYg3EuY0CrATR43Du+1WYn8fN9D' + + 'XMbW8/Uci/jT3dacMQcFG+NFLLTZ4Ng8fYVt+7Ynh4097s2ECh4Oa2LThVFJ4SkSnxrHNtJMcE1Vx5qP8bB2O0lV4rudF0' + + 'uvs3VnrUBKZ71ZLFz9VL9azcguPSTfx+iFtISp8GSDTkLGLiXY+T2c7EV3ITSORoqpRBTBGRRJHHbAwgshGEFyF4SgjLFa' + + 'sVfqjLy5f0bpjsFs649trpXiALhORTSnuvj+0kxwcIKpViGwYPbdy0YcG6Rx7ZsRfhTJTQaW6WjD+1pDx9YdIOHIVXnrIm' + + 'XF4OdpyPun0cBxKv0ouObvT01kXH6krlYWL+pxV9Xy8kGaNSoWBmtbcflWL/WkD+krU60YUCGwZjQ8713Yvx6CQSDziylS' + + 'BmVU9ibJNHRewrzuElIjwHcJlJnmGNX4bWvbx6YOA3E682tvsmsZmRM2e6KJAPs6dPi5IeEblx37QWEdhq9TMjQ31/N05b' + + '7QbzFi3Spd7eMNPaebtO+Rea6tisVZSHdUJEH0HSQnQwUoiv8mfk9NbWYzX5t8LZb5QfGPxhXZhDc7p6FonQJ5TnvcmFIZ' + + 'y1pm4za70nG00EMCMmFHACGwaAYB2Y1gKyBoLVEFoFwq8Yet0WHW6oD7HG2b98Xr9SLnM5kxm3yvCsjo6pIvpcIboSwNXs' + + '6eOdtXDWWhKhZNpP+T6cCX9hjbl51fDAo/XaaA/kest7e8NMW+d1yk/3urjRPr5bo9NpbUYrXy0v6b/+QDtWr41gEcpc9a' + + 'GplNp2hQnp3555sO/FsX3FHRcQebez1he4yL6aOA1I9dN1pBSPjU0aOOd+RYSVBPo5EZ4yoSuTnba2XLx7267Mw7x169To' + + 'pk3UAtjJHlYml/NFTz1ZeXQ+nFwKyHyweiNHsS6cczY5a0SkVSoFF4ZbAHyu8sq6L61ZurS6tzaydv+tHdewlxp2zjqIcO' + + 'TniWOt2Vn3vE3xHzyzdesOHMRX89Crkd451yx8vbOp7XUEUEt7d56Y/4ZYsTVB7X0JceO4Yq2JatN15mUA/8Hgf4XIz/yp' + + '/uooNTl5uLFbCcrnuWXt2jeIpZMZcrqItEBwJghniuCN2ve95CCJtSKAiRMfzKwUexo2CHYA1I/QfmHkwf7n67Nxeyyi5P' + + 'OqVCiYTGt3O3uqX5wDnEvicgGRJWYWYy8eGe57/GBK72v1ogmAtFx99RvJn7qYPf12W63WJtaFSJhZsdZxHtitJKalBHxv' + + '1AU/mejJJkNgwLKkgBA5ae++MTXl2E06dO5YTd4JQjheCKfA0ZsIcqoDzSLIyaRUU7T5dXx2S0TCaAuiJLadWes4s2Z+CV' + + 'BRhL+eLA6PpdbuUcLqDkCmrXsRa/U1cU7gXPICCCReeDg6+tFVB+/dDa+d4EQlnXF1xwXa9x5UWp9oqtUQREwizJ5HxAwX' + + 'ml8L8M9E6L/y1JMeK9Q7KclKhDoyJw032nvOFabvisgMImoiper3ldSyW3BOhMjGKlckfn9DvX2XyOauI9AT4uSh9Bb/O+' + + 'PegbR3ni0lE4+z3v3uVOrY429nrW90YejqMmoQkdBravJMZfSekaH+RYdqpdM+E5xMumXau/6cWQ+AkBZjAgAe+z5BBM7Z' + + '/4TQPezSD68Y/sqm+gRAc3Oz7PXr4ZIR07aOD+lU013xghWMNa6N5ZyTeyHmqJhhHZw1ARH+B6DnQfQzJ+4HTdXUE/WFjb' + + '1eHC5C2fnzVUJSprXrLeSpf1Tae7OtVm19UqYurdlfHurr3qs3pR0OBNfyq63d7crXg85aEWeN8nwPAojYHzmRz5cH+5aO' + + 'y09HBc9XdYN1+e0Pq5R/Z7RG3znaudwnIDIk6Be4h1h4HbHeVvXdhmfuu2/rRPWaG6vByp5SsHG91gLArNyC49JpfFSAv2' + + 'JmL14OqusC+NBLN3mmWvnmyGDfFXvrhR9ygmuS29bdozzvfmdNAMBXngcXmp8IyWdHBhZ/b0Juer+c2vrEPSt9D4Cpzhgz' + + 'YRIwmlQg+i0gRXb42oqhxT+vPyi/2LpVzzjpJHfqpk2uWP8qWRHgllsI5TJFjQTzowpPnVS3XN3zRvJpAQTXs+cdb4NqtH' + + 'W+3l4QiUqllAuDe1dWtn8gTmYc0lfV0r5I0ZnXdLxT+/5Ssday53li7UYn7rPlwb67kaysn/ByyP1ahiyVzOxrOs5XnvdN' + + '1voEU63uNKRNRGDfT+ztjwX0ECv3LytPOeXZfc0cnd3dfbQL+a2i5BoRvFd5/gxnQjhnLYHqVbJhpTQpBRuG+fJQ361113' + + 'RI32FIe20HOzpmMeknQOpYit7W+UAYuE8+82Dfi4jbaA7069tqWiTXeRKn9T3seZfWTePXqUnYMWdPwQZVA8KzJPSEAD8X' + + 'wmoitU5TuGX7qAr8KU6RyFQJ8TpmdQpIZgtwvkDOVUq/PnIYQzhx9W97mbiV7n9g5YaR4cUPH0qbu68EUy6X41/OnJmqbK' + + '88rpumnGMrlY2AfCRZfXDQvcP68KRjwceYpFDbp1z/wqoIViLXVrNSoCSMGntp5SgJQgEUCClm1qw0wHWp0WjdoIwrhER7' + + 'rqKtdKwg1nxbgh0fHnnwwV8d8gWo+0JwrezV3nVX6qijP1TduqXkLK5btWTxc/sQVux/1JUfZ7e2/j7r1GcJ1MFKw4ZB9L' + + '5BQNW1cUwsI3LSUEd1bQCo7d+o5cR5gqp1grEXVFoTPi2Evy333/+NelOGwwi0J7s7u737ktTUqY+a0cq9qSZ9/fLe3vBw' + + 'OaX1D3ROZ+dbBfpmAi6PXhoZjtWWZdKqlezxedSKIFHOnD0PRARrzGoWfGl0w7q+NUuX7lTvPhIIjjoS/nOj579uyzpmWr' + + 'xyYPFNdalDd9jcwQTHrqW95zwQXQuSy5jVicQqVskWEOeEkuY2GpeRq3Eeh9dJkiTp/bJhNSTix0C4fyu5byTFjsNRavdI' + + 'cG3PVHv3bQAdOzK0eNFep/AOJdFR2OMAYFZ7+1E+6QsI9A5A3gZQCyuVIlZ1lErdy+jix0GRIo72Tsp/EeOnTuhHSujRFU' + + 'P3PTPhGbnD9nnskuC48+/MqztPZ0XvLw/333yk3ExCdP1bS8bKhe9/kyVzugjNIievB+F4QKYKcBQgVYC2k8hmYl4Hoeed' + + 'ds+O9WePPZvcVVfxEfMsdicJLW3dF2ZyN0zD2D6JIw2Uy+VUMmz2Wrz2bDar98dr6Q7rTNYRj1iyx4bZlgEASs3NkkMyhT' + + '8/mmpdNr6i9bv8WP73HIAGGmiggQYaaKCBBhpooIEGGmiggQYaaKCBBhpooIEGGmiggQYaaKCBBhpooIEGGmiggQYaaOBI' + + 'xf8HDL/M688E8zoAAAAASUVORK5CYII=') return f'''