From 0ead94ac8d93c665a55fe29f35b24907ca0922cf Mon Sep 17 00:00:00 2001 From: Docker Config Backup Date: Tue, 29 Jul 2025 14:23:08 +0200 Subject: [PATCH] =?UTF-8?q?Add=20Pr=C3=A1ce=20mimo=20sm=C4=9Bnu=20column?= =?UTF-8?q?=20with=20proper=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add separator column and Práce mimo směnu column to timeshift spreadsheet - Implement vertical merging for Práce mimo směnu across rows 2-6 - Add proper styling with borders and rotated text - Exclude separator/práce columns from regular merging logic - Add test component for debugging 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- components/test-component.tsx | 31 +++++ components/timeshift-spreadsheet.tsx | 112 +++++++++++++----- .../Snímek obrazovky 2025-07-29 141447.png | Bin 0 -> 8563 bytes 3 files changed, 111 insertions(+), 32 deletions(-) create mode 100644 components/test-component.tsx create mode 100644 screenshots/Snímek obrazovky 2025-07-29 141447.png diff --git a/components/test-component.tsx b/components/test-component.tsx new file mode 100644 index 0000000..67ab373 --- /dev/null +++ b/components/test-component.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" + +interface TestComponentProps { + teamId: string + teamName: string +} + +export function TestComponent({ teamId, teamName }: TestComponentProps) { + return ( + + +
+
+ {teamName} - Test Component + Testing if React components load properly (Team ID: {teamId}) +
+
+
+ +
+

This is a test component to verify React is working.

+

If you can see this, the basic React setup is functional.

+
+
+
+ ) +} \ No newline at end of file diff --git a/components/timeshift-spreadsheet.tsx b/components/timeshift-spreadsheet.tsx index c666ec1..dc0f6b3 100644 --- a/components/timeshift-spreadsheet.tsx +++ b/components/timeshift-spreadsheet.tsx @@ -12,7 +12,7 @@ interface TimeshiftSpreadsheetProps { teamName: string } -export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpreadsheetProps) { +export function TimeshiftSpreadsheet({ teamId, teamName }: TimeshiftSpreadsheetProps) { const spreadsheetRef = React.useRef(null) const jspreadsheetInstance = React.useRef(null) const currentDate = new Date() @@ -55,7 +55,7 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr const yearRow = ["rok"] const monthRow = ["měsíc"] const dateRow = ["den"] - const shiftRow = [`Pohotovost ${_teamId.toUpperCase()}`] + const shiftRow = [`Pohotovost ${teamId.toUpperCase()}`] // Generate columns for each day from prevMonthStart to nextMonthEnd const currentDate = new Date(prevMonthStart) @@ -102,6 +102,14 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr "Pohotovost IT" ] + // Add separator column and "Práce mimo směnu" column + titleRow.push("", "") // Empty separator + empty for merged cell + dayNameRow.push("", "Práce mimo směnu") // Empty separator + the text + yearRow.push("", "") // Empty separator + empty for merged cell + monthRow.push("", "") // Empty separator + empty for merged cell + dateRow.push("", "") // Empty separator + empty for merged cell + shiftRow.push("", "") // Empty separator + empty for merged cell + const employeeRows = employees.map(name => { const row = [name] // Add empty cells for each day/night pair @@ -119,7 +127,7 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr } // Sample data for different teams (fallback) - const getTeamData = (_teamId: string) => { + const getTeamData = (teamId: string) => { const baseData = [ ["Employee", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], ["John Smith", "08:00-16:00", "08:00-16:00", "08:00-16:00", "08:00-16:00", "08:00-16:00", "OFF", "OFF"], @@ -212,11 +220,11 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr console.log("Monthly data generated successfully") } else { console.log("Using basic team data") - data = getTeamData(_teamId) + data = getTeamData(teamId) } } catch (error) { console.error("Error generating data:", error) - data = getTeamData(_teamId) + data = getTeamData(teamId) } console.log("Data generated:", data.length, "rows, first row:", data[0]?.length, "columns") @@ -249,7 +257,7 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr } // Style weekend days (Saturday/Sunday in day name row and date rows below) - for (let col = 1; col < (data[0]?.length || 0); col += 2) { + for (let col = 1; col < (data[0]?.length || 0) - 2; col += 2) { // -2 to exclude separator and Práce mimo směnu columns const dayName = data[1]?.[col] if (dayName === "Sobota" || dayName === "Neděle") { const colLetter = getExcelColumnName(col) @@ -266,6 +274,28 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr } } } + + // Style the "Práce mimo směnu" column (last column) + const totalCols = data[0]?.length || 0 + if (totalCols >= 2) { + const separatorColIndex = totalCols - 2 + const praceMimoColIndex = totalCols - 1 + const separatorColLetter = getExcelColumnName(separatorColIndex) + const praceMimoColLetter = getExcelColumnName(praceMimoColIndex) + + // Style separator column with left border + for (let row = 2; row <= 6; row++) { + styles[`${separatorColLetter}${row}`] = "border-left: 2px solid #000000;" + } + + // Style "Práce mimo směnu" column + styles[`${praceMimoColLetter}2`] = "border: 1px solid #000000; text-align: center; vertical-align: middle; font-weight: bold; height: 50px;" + for (let row = 3; row <= 6; row++) { + styles[`${praceMimoColLetter}${row}`] = "border-left: 1px solid #000000; border-right: 1px solid #000000;" + } + // Bottom border for the last row of the merged cell + styles[`${praceMimoColLetter}6`] += " border-bottom: 1px solid #000000;" + } } console.log("Initializing jspreadsheet with config:", { @@ -293,41 +323,64 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr console.log("jspreadsheet initialized:", !!jspreadsheetInstance.current) // Apply cell merges for header rows after initialization - if (jspreadsheetInstance.current && selectedMonth && selectedYear) { - const instance = jspreadsheetInstance.current as any - if (instance.setMerge) { - // Merge all pairs in rows 2, 3, 4, 5 (day names, year, month, day) - for (let row = 2; row <= 5; row++) { - for (let col = 1; col < (data[0]?.length || 0); col += 2) { - const colLetter = getExcelColumnName(col) - try { - // Correct syntax: setMerge(cellAddress, colspan, rowspan) - instance.setMerge(`${colLetter}${row}`, 2, 1) // 2 columns, 1 row - console.log(`Merged ${colLetter}${row} with 2 columns`) - } catch (error) { - console.error(`Failed to merge ${colLetter}${row}:`, error) + setTimeout(() => { + if (jspreadsheetInstance.current && selectedMonth && selectedYear) { + const instance = jspreadsheetInstance.current as any + if (instance.setMerge) { + try { + // Merge all pairs in rows 2, 3, 4, 5 (day names, year, month, day) excluding separator and Práce mimo směnu columns + const totalCols = data[0]?.length || 0 + for (let row = 2; row <= 5; row++) { + for (let col = 1; col < totalCols - 2; col += 2) { // -2 to exclude separator and Práce mimo směnu columns + const colLetter = getExcelColumnName(col) + try { + // Correct syntax: setMerge(cellAddress, colspan, rowspan) + instance.setMerge(`${colLetter}${row}`, 2, 1) // 2 columns, 1 row + } catch (error) { + // Silently skip merge errors + } + } } + + // Merge "Práce mimo směnu" column vertically from rows 2-6 + const praceMimoColIndex = totalCols - 1 + const praceMimoColLetter = getExcelColumnName(praceMimoColIndex) + try { + instance.setMerge(`${praceMimoColLetter}2`, 1, 5) // 1 column, 5 rows (2-6) + } catch (error) { + console.error("Error merging Práce mimo směnu column:", error) + } + } catch (error) { + console.error("Error during merging:", error) } } } - } + }, 100) // Apply counter-clockwise rotation to data values only (exclude second column which contains field labels) setTimeout(() => { const table = spreadsheetRef.current?.querySelector('.jexcel tbody') if (table) { const rows = table.querySelectorAll('tr') + const totalCells = data[0]?.length || 0 - // Rotate data values in rows 2, 3, 4, 5, 6 (day names, year, month, day, shifts) excluding first two columns + // Rotate data values in rows 2, 3, 4, 5, 6 (day names, year, month, day, shifts) ;[1, 2, 3, 4, 5].forEach(rowIndex => { if (rows[rowIndex]) { const cells = rows[rowIndex].querySelectorAll('td') cells.forEach((cell, cellIndex) => { - // Skip first two columns (row numbers and field labels) - if (cellIndex > 1) { - const originalText = cell.textContent - // Use 12px font for all rotated values (date values, day names, and shifts) - cell.innerHTML = `
${originalText}
` + // Skip first two columns (row numbers and field labels), separator column, but include Práce mimo směnu + if (cellIndex > 1 && cellIndex < totalCells + 1) { // +1 because of row number column + const originalText = cell.textContent?.trim() + if (originalText) { + // Special handling for "Práce mimo směnu" text + if (originalText === "Práce mimo směnu") { + cell.innerHTML = `
${originalText}
` + } else if (cellIndex < totalCells - 1) { // Don't rotate separator column (empty) + // Use 12px font for all other rotated values (date values, day names, and shifts) + cell.innerHTML = `
${originalText}
` + } + } } }) } @@ -366,7 +419,7 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr jspreadsheetInstance.current.destroy() } } - }, [_teamId, selectedMonth, selectedYear, forceUpdate]) + }, [teamId, selectedMonth, selectedYear, forceUpdate]) const handleSave = () => { if (jspreadsheetInstance.current) { @@ -400,11 +453,6 @@ export function TimeshiftSpreadsheet({ teamId: _teamId, teamName }: TimeshiftSpr } } - const handleAddEmployee = () => { - if (jspreadsheetInstance.current) { - jspreadsheetInstance.current.insertRow() - } - } return ( diff --git a/screenshots/Snímek obrazovky 2025-07-29 141447.png b/screenshots/Snímek obrazovky 2025-07-29 141447.png new file mode 100644 index 0000000000000000000000000000000000000000..8194085a33c291be4e1768caa56a55f572e8c4f5 GIT binary patch literal 8563 zcmb7q2UJsA^KSqF5oyvvii#8oy>~=<6_65o1Vno8U8I*tz<^YxBR%w90~hH6(z{59 z&|83ixc7R$@2>UMd;hoA+3TFMv-g~tJu|5~El`i9}Er62<+9elWfez{}yTj``vx z)6~GbF@IJ&#e-pDRVeXGpwhc$>`{B67mm=eFXlwl+A7LwMEv}b1Mu+2MDfq{6b&tK zfUY|?(ykxKV40cQR!ToAbN6uXSWbOxJteya`Rr{-P)nV)6JZjMC=)p2lJxR`BFKI> zYM5n3utrYX*?iy`1e+=P(QZMKOp)ojR32h?LOL!9?5%U08n5}02sa`0p7yFNM#9tl zj#j$Rn~>b8IcSkN+(Kuvwo}or(b`j`g`Qc3BGg~(-eq{z)D=yEIlQu!t8n`b+n*j+kT51G*XJzfpG zOyENP8le2Zu%v-RM41yC>SWjxGbD^z;5BzAh6v$z4EQe|3s__$LVzM7o?g>#jixB`aZ~l4Z>;rRAu|B)>(J9TO*(fx9K|l18Y2b zawC!}*~g>zu#cBLe0IihA-eIGMP!M|snp_-UfVn*0Pf_`OX*o(A(buUZ0@*El<0Q8d#^40OcB*BD|u#C@)+>l<&U}R^%u?) zY3{GNx{Y*BYtK$3f|_aT*qRc!N@rP2#k-A-mWBe8Z)Bp;ih1^`?}HrdU>%;7a_hB%B2b%+$d#=;=PquS*!1Zi#J`myUw)mr*GN4KD}_p2F}(?SMS>8o$#}Bf3hE;ssOzY5c3jXqH>$#d-8J&dxalo#jA-h0guS!(e^dCeLz=Qj=SNA z7@(c(B-cuH#S8tIf5(=&kL4_Mn9%EdinOVlem9UUCVw^{qO7F}(p*G&HV!pCv&&yX zxL8z}Y$KAvb9>7b!my)WO0UB+PUHoigSXLF%wljX?Q4NJ-#zx3_ehAm(b7tk$FUz&x_deWvCBSh?H}_ZAHV z3DRBeR6?BBMk&vb`zU+X)VNfp-?$al3%5qAb4BdX3Z}Ize=FBN5Je#VZ;11SucItS z$Q%3XZtcrqMmNJUX5?*7b+ASidko{o*LI;>3d~f0nnU1{y(-p0ZKu~x%{Wez{i}SvTVt~2~jHN zJDIQoFubl@o2%OI{!Eil%ukzS;F8)$ji=O0(;P>+eXkyj^MXXFL@2uF&iNvw?6Spb z7LmL$T4UUxti}&?i%bDs?`^Z)eeOUaWmLxaK*Y@buHp!%x1GXM;X)gaDn3h&yt`n= z4|=ml67=GZDw)>HD~nIQ5%G1^!+WlIOofF3aDLxpV1JlVO~ssy%eV$bysfDevtzLB zVZTh_W)ct(#CE}fg~Pz8WLsbbPsZ|!BQM#8y1*Vixcyq$*)rHH%!*p_N2+e2BOCxo zSy#in6BlaTiU_A3(Gt*rDO$Z}bTW&)jC_D5mah4Yk;!o+e--^KOZ_`z_X#APJK1`6aGm}hF3buk0S zILzuUz4NV-*@0TV@u(QB{K?LhY%RI-~P~M37nXl8!?x?r0`Y@2_-y{`sC-hI;G? z2*Ak0TJLA>NYy+31SI;T*Pg?gmiFwH-$&1+C7_{0Q8}3CVG;M*{`SOI*%nH(;3hZo znXsQ|gQiFeb$C71U1|<3(u5PQcK#lPmN$lM`tg2xuiavTkp$EdZz9gOy@3iVs2&14 zdz3ZJtnzxKd6()?!ZPiSJR6$Qz9kGJTMTCz1f2)uooPOfM7s#SSVR9ZQ0d!O=3ZXD z9jV39NVbF&CY2`nGv(ngyQygv{`P%UwGIO_?7s&T7`o@5u z2PqP&S@hhFX3W3V5A9yK9IL_JPhIrT<80Gplc~Z))Q*^owbXpGYi#f7#rmu5kRkXD0W4Cf*f{kKh`nYYJ8zfSC< z;zYM13SS%cJ=GrKQ?YvAhM~TkPg5^wkgtGLRwSD?J{GT(MSY3Y16<@^B9;A+U;i~B zXUg}^;s*^@=BH?{3yknUB`$}Sga)*-Z{J!4H3e}DqFMUL?rgxcbML!#9qT_Rt!jS1 z&836I1f-5CmLtV-JdBj7QlWv7nkDu}y&)RHmA-jC-DWIM=ixUs-V!iYYfJm~uzn#i zt6~8&h}nU@-$QVZu0749O~tQV83m@D<1r(Ac)y>GGb_r2kV93&ROdqB9o)9dlnfx; zTHHC&g&4giLsS25JJ32lU3LVyvpO0qf>&N2R4+?FK zOg-G>oq%Sd^yc?SL)LWYeBXkloHsuHY!xjzLr>NmBJrCD8==GE2B&C0e5g+a=_EV~ zC4>+RYg*Cq=-AoTTWo#;M&Pg;`ZGE5az4@gT=-j`K+sll2sAb89|iLR0l(T_5Z}4` z4lv(#r~kS8UYol;m32ZZtXZLYg36GPxf!J0GL_mUvYu@@aYV@GL8l!R=3eJ@z5dXk z?X1{Dh^#v{;3P~lYRehMbaP-dTYZQEi#0Xpis9t>S9OVfXw-C^bk=F?XDi#nX%Rs> z`HjdNrDFhbpW_+7$Q42w(RM4C%GhXY&e!_ArrK?nGbSsbg z54&SdX^5WkxsDA@Z>hUk2V2D~e}-MvV=HA&q!SM|p~I#U+HPVm2Da82x3`OQOc}^O zYxbb?t@!YE?C^ z-SMX5w9AlS4e744ZR4h2Bm)fEQH7xcrNMsuHc!L8rJnI#aP~3wJR^6fCTeTI<=uAx zdOy@%0X-HB31$g+&F3}-QutG#Pc($e-`-<=Tv}lkl!7QIq`P;$swi27TEFrX4=vD- z6@^#~;aGH5DhuN|R9cbWavy8aSf1VOU-t$9Fd4Hi-ZJ5tCW!Tkvq+`#8mWuwHaxbj z<+l-n?qq=N=$A5pFNAS3VQ+zPW)pr)jquv@mnH-oWpC*M!6LYsx{8@YS{0`HgYEfE z6bZRmt>tL2ZfbHXuBYdAW(QAUOluahYw3EkY0v$KV|n`ka5ip5-n`Jpv}>hYq-=G) zP=7Un+Yqh_Ogd_pNNf`I;HBlbh|=E@ZVC3eV@(!xpnMrRJr00ND+dp`A-lOu_W=CP zdw<*+U8CS;D9>--Mmcgxd6h}1dh``IP$x=D|^?cO_qfnTjtq1w@ zVTeMd3Pc&GKSKS;iEubD<%i-U0}ZTe_B0unO9kuz@LZ)=?ts(zlc|P5rR!Di)rNlb z%$spGMx#DGFc`Uo<3FZv>R)rTzge|8TF3_J9=*nh3pE^Vj^2p7>A0wSKYTb&-7Y37 z$G$2^KSAi*AvjAS-)IM(_vUA5E%rXk9cqUai@XeX$94NlSA_$@eS#zZxEIA9!IQ^q z|COa=jTs(USI#&4vg}S5&T*mHtQNOO{l>lN+{_lAoViblghn z@804o?HSE_fh!4*|HMbtnYykiC5Dy4$Y7!NhCVq;%~Ciwh<{jfEw=k8{1zinlG zY$pL(_~QYtLXX$jR%fPg*Hcal_8t}}?vS4ul z1&2|b7gl9rU;O9d(Q=}NgT^5~CFi@D1Z zzR8Tz&V$X8?7?$$PKI_Ox+SmghDGt2twyWyOe*yr8)oEk|0oii8mbsC4q{q)Q2lbk zr>xVHrwWbZ=qnt#)ahwl=WwjxM%xYVG1iNMfPDjkLw&}?*co<*(_3%)sz)5$M;J7C z($#s=P1;_N&VwlDc1xwg-Kyn@?+Af&*}q$7s4DrDD@SO#3gD&@7Ke6`Agdi+cUk=gv2G zGZdU%j~ogLT^Ruj#|l$uu$P_%?YgJtPNlww#1~Bo_!@7OWKDU$H)r=IEEI8GL{z|u zxGf*Cb>Milx5)yW$#}o?`y^?vd2jWk5y+&#_{74b%|t@F{9n&+Pg+t98@C!=C@Rx1 zBn|{xzvCr>nPUf01I1q)8h9UbmJH%;^|)cGh?}r^%52YUV7CFDjslWALobt(%fv1 z(o-ip#mfEBI3}tP6|-^4DQ;b>ho3&^6RB-cFR0$csgh1r{pkB+yS7cSsJ^VkHB!Xb@$UV)!mLaq&rU#^JGW7NKztF$&0m;Bcj(R06GTAZ~k#c62lvx+pk1BYrOT z`~(T_3SgYt38w75kKSHF!M|^n@qk!EoZOWG<#E32ZZwy zk*==-IX~?0&WV*!#t1pgwl#Y0b4c9zpBc;8DanFIOQx1oEQLv zzs54XU2opJy-Vpz@43TOv{_XR_m(qh#jj5D|GDgcZ}RWY{8!FB`Q{ceqi?OSNzY2S z5pZ%!>Fp78cmJt@MAM(Z|o_FF#%Hpk+cjc`(95b{%+hv3v z?r-wb#69%7`wove0q-4S5aob<0Rl@uQddPhNQWxd@gxo$d>Tfg`My^sYB{vMXT2ue zX=RIJA>6hndQS%>uY3~rQ9~geKXPN58&$}&gf#YYO0NRA6lVnKYV{WsX(4sm2+76(k`KWnsG#?q8V0T<=(l(TmIA;eg67vX|w3vTh6t~vh`xkI~t zK17jyG%zj?QNZG}fkbM9Nom)}xY|X|py(2mICZCZL+!pwIj?~45D#~c@RARh+Lcq7k)xLD%1K+_9T$3P8l@pl8>of!t^}sRv zcte7d)?a!Q1AZ|o?oKDdFQ(}5gFhAIpz{EowHy@BO2yaX9xYg}Y3TvKXn32KUr_36 zT!q{WBC6|W^i0n{5Fg6IkQexXZs8)AP76Fiq!MUtgwa5{nP8@dvKEY}RP?ZoHve*) z5mb$qQ{Gp-qbR8@W8U0Xc-VyE(Q%+QxOu>VPJo_JTjA}AN^)&fSmhp9mNhBCn|zXV z*WROeL~u=^z}4y85FIqC{UFgs)WB52?EkK@{H~-xvDpjmTXKaNcXceLnr(mYSQNf2 znt$STX1snuOLKFe=d33}*lKt|SzB(xvVcHt;HeK`EZ!YrIR#9FB!RCbqJVmMUexlN zMzlM+lvn#?qZ{Z8TbzF>-F;+7_lEfuGd|nB{8SB$WEeKzzWUk-fH`PmgZ-6=aWXK6 zH6z4v$;&OGKEIORF|3R|fb`j4dv`JfzHW^3FB9gI%cc9uuk6o@<kP53V&8`~zLE`{2vF*+3&1Z#d88qkfN=qXkTbuiss^rjc@30@1e zmD9NAa|a>VmkeCMY`w{BgWOOeUo4d{5C$<|ok`t1YtjS;Mr@6?CPoq%OKp`kdN_yV zlGB41PP6T=&2M8KPBaoX&Bn2zo3K{7ofVS0O#kdVqApr@CXCiH=F$xf;ZwBCho?)c-Ftx?Ej*2? z_3kQu*)K1doiduVoA@ubOyVdAIY^V^M(n4Y%5a~m-519Nx9XoASve95oD(@XtlPEF z@uEwR8j`pz=Q@+0(`N#xO!81iNy|5y1-=SxRjuvvDBct_9cIyNJaH>xNt(UsWpmMG z62F+CBb0Uf!EAtL zb8|H(;Q&jj()MmC#5?Lk??7oy=5s-s=!xsbs>NH~X7?`M=Hu{JU#k3o*Yr--j6~6q{aK%dD(o$p;k4WZ z337A*@;WmXV@qFBd7%l5H3+4uMZ52&Uy;A41ntvYG*T4g?YErNx7 zV$m8wogjC^deVY-lo{pwVt0z!F=x!wQ^IJnBw)-~3gIT+tv`D)PM_F6Ps_YTpnRc# zXs<7B21^b*JUTXc+J~V#Cy-Gu1azG9gbT%Jun%US%g2G(gg4J8PlejbZtnVNOr|s2 z!euQ&60nF~ehN<%0R{QFFZ5bW#h_0gR0l2Cqz5f}pP0gbmb>;YcY2yGjZa~7o}4;+ zmDQdk>!$dvKBG*K3r|-@A0#wJS2#7>8mK?2d{UWI2 z!oala`2sJs?2hKk#oZUaSnP+}S7{OY!9v^QKz+F{&=p+3&1H{D3y`%*Vg1+asH<+d zpr50Dulqz#Pthp1W`8gi*InW}^l9sPBhvtzs18o<<2Pmkb>{(}Lt zqy@DNrfoY1Bp0wu2Qy`@4z(4(=BaID!0T~M{JDyw~q{VnvWbKqLq z8pZ>X#JuiX0NkLYx`dP~9Whr(&!@~QpPXH6l_K~9(oV@nEqntV0;?xP2PfY|0=GyE zY#qYuw1e@fjGfo|)rZ$5vrJ_v>b5#{44u7hGfj+yq%@wH8iRAI`!m|bHq_%Y~7GM7H zK#XI{xx6iWw!s~L!S67(uJOCWT!W5J_7Cou67fONI62*>`%nH?CrtmhQ>df8>4u-D Vjrf*z=s!vTl;qT9OJ&U7{SSnA!IS_1 literal 0 HcmV?d00001