nfTlWNl rn Ѻq$³*dm^̓|[N '鮵^ThGYk^gn&aIYuYfzK^TBkS.͢)7̘ ErgY#WVQL y9C.Tٻa'oM:~ "#O\`d:ϧ榻v~t\w̫mHEsEj{,2>Ow-0K;0¨EB@{㦓uZ@߯A!oObJ5_:ny aܣʥ%CLYhg&$ Qu&d:ϧ榻v~t)CтLl3?n̶0)y1 BX=BRV'.wy{t6@{㦓u%1yU?ls_7<߮\ CKF"r{,2>Ow-0KY*$9K"1Lc>cV7%qӠgd:ϧ榻v~t#:캉u@giڦ#{ـ-cguA7pKr^AG ew,:6ǔ*yGER0@?H|Q:cK$I%%4k^}ŁA{P7 4ӞoU#o6a $(7TNUM,6r?UL5o (PRT1Ilv;Vsեl]4Y}Y* ; E'pjÞ;bSaŽ{*LM<=N I'3b7h-V|5pn_ EƨF;qymDVC˞xji*gKFIXe#tv**"H'I^+vo2#>Ed\Jr$cl&N !1O 5B@:r(۲#q`d|ԧqdFË;U.,zheVeGvgab(kbE62Ip+T>n+5Utj~K ۸uZb㜆qGi~XIp۔|ksXiJ,ι]C1 Lc]76:bVlDSa{ !tK(Eq# c)/_|I"gxFȂ,YؔnӲ2mY)1/rtOZhP%$ٌ0yqtI+"!2[~N@沁s3.h 5YuV* '⿘^$UuݫږL yl!ĶJ}!襪F(qA˜PѬBVD zʟ{~GG,M06SQ~,SR (2/]C D[\ P]ǝ!&S3ngo#)M]٤˳&y̔oݜw2dsbX;a.NF.\{2D9ӖOcݖjgYv(ԇJPX1y`bH?d4=~;6 DP"$ ]_ϑ(,L>K;(ӤC D[\ P]x(߼q[Ưĸ=?ˋ̒E\2k(JDVfq0̸S$5$ʤC=C$Xcvs@ 2v?0FFO\,麩(3Ι_c,N"2g,H>o$YyI@?H|Q:cK$I%%4k^}ŁA{P7 4ӞoU#o60J75c$ySa*]wZX ~24E]%v}4aNrWV \;ѣI}emjf+cwr$cl&N !1O 5B@:r(۲#q`d|ԧMwoR4(oJbhMg׃pzlI[j@7oE9%uÒ ; E'pjÞ;bSaŽ{*4CMv*5)kAU78 4"?2S!@hňy8iyl8xxL-Qx.?+Âe Q9KR>0bˆ?q)KLΡzO>x~]~2Gctʢav U>ۗSaQ$_e һ#Nf! '3b7h-V|5pn_ EƨfIPڕs02MmD 'RS:dA=>no3/-ұfZhէ1oΆZQRCNK%SB\[zsgT L[9OLfq$ʹg [ʥ,z=\CGVc)o6?ˋ̒E\2k(JDV!쏐jUʦ:< r䛠t5!2WʴQҝ DjK7!ډh=KgGbkgePDavh"!my ]Jo[]؆ $K^o\%d|?Aݺ 2YəMC]9;Cr~q՞1Mr$cl&N ;DP]oCJieaTD%vX瞟c'n"|Gt%3-᠃,:,uk["/rtOZhPllPQܥ%p}uso2Czehnj053la l;ȫbxV}XHO{Lfq$ʹg [1u<^WD~s 2YəMC]9;C^kݴo3߹DӘīpA LkpGFM@#S<:CA}-M,t%3-_׈́UTj[IEE`6^uv=ߙ'7ppu0۪Ija}RFM<ɑ ܶT72aIM 6ޱ&mrS%=kL6 I`FU#^~n?eTȱ=`r/ue yrn>T!6F 2PF} Ģ34LȢ);pR8(pɜȚ>JM]G6q;#rlձPF}lvH0SuKW5dwZ`egZ{>KJƸ4X>y+ +@ovYuXWǒ˔S&x҆a!xr .eP}UU;qtK}ouڜ0ø2;9p B78NȖ.a@ko/; sJM]G9W|078NȖ.a@ko/EL3r9-MH="K^kwTar/ue sheet; } public function setSheet(?bool $sheet): self { $this->sheet = $sheet; return $this; } public function getObjects(): ?bool { return $this->objects; } public function setObjects(?bool $objects): self { $this->objects = $objects; return $this; } public function getScenarios(): ?bool { return $this->scenarios; } public function setScenarios(?bool $scenarios): self { $this->scenarios = $scenarios; return $this; } public function getFormatCells(): ?bool { return $this->formatCells; } public function setFormatCells(?bool $formatCells): self { $this->formatCells = $formatCells; return $this; } public function getFormatColumns(): ?bool { return $this->formatColumns; } public function setFormatColumns(?bool $formatColumns): self { $this->formatColumns = $formatColumns; return $this; } public function getFormatRows(): ?bool { return $this->formatRows; } public function setFormatRows(?bool $formatRows): self { $this->formatRows = $formatRows; return $this; } public function getInsertColumns(): ?bool { return $this->insertColumns; } public function setInsertColumns(?bool $insertColumns): self { $this->insertColumns = $insertColumns; return $this; } public function getInsertRows(): ?bool { return $this->insertRows; } public function setInsertRows(?bool $insertRows): self { $this->insertRows = $insertRows; return $this; } public function getInsertHyperlinks(): ?bool { return $this->insertHyperlinks; } public function setInsertHyperlinks(?bool $insertHyperLinks): self { $this->insertHyperlinks = $insertHyperLinks; return $this; } public function getDeleteColumns(): ?bool { return $this->deleteColumns; } public function setDeleteColumns(?bool $deleteColumns): self { $this->deleteColumns = $deleteColumns; return $this; } public function getDeleteRows(): ?bool { return $this->deleteRows; } public function setDeleteRows(?bool $deleteRows): self { $this->deleteRows = $deleteRows; return $this; } public function getSelectLockedCells(): ?bool { return $this->selectLockedCells; } public function setSelectLockedCells(?bool $selectLockedCells): self { $this->selectLockedCells = $selectLockedCells; return $this; } public function getSort(): ?bool { return $this->sort; } public function setSort(?bool $sort): self { $this->sort = $sort; return $this; } public function getAutoFilter(): ?bool { return $this->autoFilter; } public function setAutoFilter(?bool $autoFilter): self { $this->autoFilter = $autoFilter; return $this; } public function getPivotTables(): ?bool { return $this->pivotTables; } public function setPivotTables(?bool $pivotTables): self { $this->pivotTables = $pivotTables; return $this; } public function getSelectUnlockedCells(): ?bool { return $this->selectUnlockedCells; } public function setSelectUnlockedCells(?bool $selectUnlockedCells): self { $this->selectUnlockedCells = $selectUnlockedCells; return $this; } /** * Get hashed password. * * @return string */ public function getPassword() { return $this->password; } /** * Set Password. * * @param string $password * @param bool $alreadyHashed If the password has already been hashed, set this to true * * @return $this */ public function setPassword($password, $alreadyHashed = false) { if (!$alreadyHashed) { $salt = $this->generateSalt(); $this->setSalt($salt); $password = PasswordHasher::hashPassword($password, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount()); } $this->password = $password; return $this; } public function setHashValue(string $password): self { return $this->setPassword($password, true); } /** * Create a pseudorandom string. */ private function generateSalt(): string { return base64_encode(random_bytes(16)); } /** * Get algorithm name. */ public function getAlgorithm(): string { return $this->algorithm; } /** * Set algorithm name. */ public function setAlgorithm(string $algorithm): self { return $this->setAlgorithmName($algorithm); } /** * Set algorithm name. */ public function setAlgorithmName(string $algorithm): self { $this->algorithm = $algorithm; return $this; } public function getSalt(): string { return $this->salt; } public function setSalt(string $salt): self { return $this->setSaltValue($salt); } public function setSaltValue(string $salt): self { $this->salt = $salt; return $this; } /** * Get spin count. */ public function getSpinCount(): int { return $this->spinCount; } /** * Set spin count. */ public function setSpinCount(int $spinCount): self { $this->spinCount = $spinCount; return $this; } /** * Verify that the given non-hashed password can "unlock" the protection. */ public function verify(string $password): bool { if ($this->password === '') { return true; } $hash = PasswordHasher::hashPassword($password, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount()); return $this->getPassword() === $hash; } /** * Implement PHP __clone to create a deep clone, not just a shallow copy. */ public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { if (is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; } } } }