diff --git a/classes/CrsInitialTestState/class.ilCrsInitialTestStates.php b/classes/CrsInitialTestState/class.ilCrsInitialTestStates.php
index cd2adadb..bc8158c5 100644
--- a/classes/CrsInitialTestState/class.ilCrsInitialTestStates.php
+++ b/classes/CrsInitialTestState/class.ilCrsInitialTestStates.php
@@ -1,14 +1,17 @@
database();
@@ -26,7 +29,9 @@ public static function getData(array $arr_usr_ids = array()): array
$crsitst_state->setCrsitestItestTries($row['crsitest_itest_tries']);
$crsitst_state->setCrsitestItestSubmitted($row['crsitest_itest_submitted']);
- $crsitst_data[$row['crsitest_usr_id']] = $crsitst_state;
+ if (( $crsRefId == 0 ) || ( $crsRefId == (int) $row['crsitest_crs_ref_id'] )) {
+ $crsitst_data[$row['crsitest_usr_id']] = $crsitst_state;
+ }
}
return $crsitst_data;
@@ -36,6 +41,8 @@ protected static function getSQL(array $arr_usr_ids = array()): string
{
global $DIC;
$ilDB = $DIC->database();
+ $course_configs = new ConfigProvider();
+ $arr_malok_ids = $course_configs->getCourseRefIds();
$select = "SELECT test_act.user_fi as crsitest_usr_id,
crs_obj.obj_id as crsitest_crs_obj_id,
crs_obj.title as crsitest_crs_title,
@@ -53,10 +60,10 @@ protected static function getSQL(array $arr_usr_ids = array()): string
inner join " . usrdefObj::TABLE_NAME . " as itest_obj on itest_obj.obj_id = itest_ref.obj_id
inner join tst_tests as test on test.obj_fi = itest_obj.obj_id
inner join tst_active as test_act on test_act.test_fi = test.test_id
- where loc_settings.itest is not null AND " . $ilDB->in('test_act.user_fi', $arr_usr_ids, false, 'integer');
+ where loc_settings.itest is not null AND " . $ilDB->in('crs_ref.ref_id', $arr_malok_ids, false, 'integer') . " AND " . $ilDB->in('test_act.user_fi', $arr_usr_ids, false, 'integer');
return $select;
}
}
-?>
\ No newline at end of file
+?>
diff --git a/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestState.php b/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestState.php
index 40ec7eef..7d8d5f36 100644
--- a/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestState.php
+++ b/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestState.php
@@ -1,11 +1,14 @@
locftest_master_objective_id;
+ }
+
+ public function setLocftestMasterObjectiveId ( ?int $locftest_master_objective_id ): void
+ {
+ $this->locftest_master_objective_id = $locftest_master_objective_id;
+ }
+
public function getLocftestLearnObjectiveTitle() : ?string
{
return $this->locftest_learn_objective_title;
@@ -77,15 +90,34 @@ public function setLocftestObjectiveTitle(?string $locftest_objective_title): vo
$this->locftest_objective_title = $locftest_objective_title;
}
+ public function getLocftestMasterCrsId(): ?int
+ {
+ return $this->locftest_master_crs_id;
+ }
+
+ public function setLocftestMasterCrsId(?int $locftest_master_crs_id): void
+ {
+ $this->locftest_master_crs_id = $locftest_master_crs_id;
+ }
+
+ public function getLocftestMasterCrsTitle() : ?string
+ {
+ return $this->locftest_master_crs_title;
+ }
+
+ public function setLocftestMasterCrsTitle(?string $locftest_master_crs_title): void
+ {
+ $this->locftest_master_crs_title = $locftest_master_crs_title;
+ }
public function getLocftestTestRefId(): ?int
- {
- return $this->locftest_test_ref_id;
- }
+ {
+ return $this->locftest_test_ref_id;
+ }
public function setLocftestTestRefId(?int $locftest_test_ref_id): void
- {
- $this->locftest_test_ref_id = $locftest_test_ref_id;
- }
+ {
+ $this->locftest_test_ref_id = $locftest_test_ref_id;
+ }
public function getLocftestTestObjId(): ?int
{
@@ -156,4 +188,4 @@ public function setObjectivesSuggested(bool $objectives_suggested): void
{
$this->objectives_suggested = $objectives_suggested;
}
-}
\ No newline at end of file
+}
diff --git a/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestStates.php b/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestStates.php
index df1c2eaa..6662f330 100644
--- a/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestStates.php
+++ b/classes/LearnObjectFinalTestState/class.ilLearnObjectFinalTestStates.php
@@ -15,9 +15,10 @@ public static function getData(array $arr_usr_ids = array()): array
$locftst_state = new ilLearnObjectFinalTestState();
$locftst_state->setLocftestUsrId($row['usr_id']);
$locftst_state->setLocftestCrsObjId($row['learn_objective_crs_obj_id']);
- $locftst_state->setLocftestLearnObjectiveTitle($row['learn_objective_title']);
+ $locftst_state->setLocftestLearnObjectiveTitle($row['learn_objective_title']);
$locftst_state->setLocftestCrsTitle($row['learn_objective_crs_title']);
- $locftst_state->setLocftestObjectiveId($row['master_crs_objective_id']);
+ $locftst_state->setLocftestMasterObjectiveId($row['master_crs_objective_id']);
+ $locftst_state->setLocftestObjectiveId($row['crs_objective_id']);
$locftst_state->setLocftestObjectiveTitle($row['crs_objective_title']);
$locftst_state->setLocftestTestObjId($row['tst_obj_id']);
$locftst_state->setLocftestTestRefId($row['tst_ref_id']);
@@ -27,6 +28,8 @@ public static function getData(array $arr_usr_ids = array()): array
$locftst_state->setObjectivesSugCompleted($row['objectives_sug_completed']);
$locftst_state->setObjectivesSuggested($row['suggested']);
$locftst_state->setLocftestQplsRequiredPercentage($row['tst_req_percentage']);
+ $locftst_state->setLocftestMasterCrsId($row['master_crs_id']);
+ $locftst_state->setLocftestMasterCrsTitle($row['master_crs_title']);
$locftst_data[$row['usr_id']][$row['master_crs_objective_id']][] = $locftst_state;
}
@@ -121,4 +124,4 @@ public static function createTemporaryTableLearnObjectFinalTest(array $arr_usr_i
$ilDB->query($sql);
}
-}
\ No newline at end of file
+}
diff --git a/classes/LearnObjectSuggResult/class.ilLearnObjectSuggResult.php b/classes/LearnObjectSuggResult/class.ilLearnObjectSuggResult.php
index 9d048ba7..7e5b098f 100644
--- a/classes/LearnObjectSuggResult/class.ilLearnObjectSuggResult.php
+++ b/classes/LearnObjectSuggResult/class.ilLearnObjectSuggResult.php
@@ -64,7 +64,7 @@ public function setObjectiveAsPercentage(int $objective_as_percentage): void
$this->objective_as_percentage = $objective_as_percentage;
}
- public function getObjectiveAsFractionString(): int
+ public function getObjectiveAsFractionString(): string
{
return $this->objective_as_fraction_string;
}
diff --git a/classes/MultipleResultTable/class.ilParticipationCertificateMultipleResultGUI.php b/classes/MultipleResultTable/class.ilParticipationCertificateMultipleResultGUI.php
index 087d9371..b5155ac0 100644
--- a/classes/MultipleResultTable/class.ilParticipationCertificateMultipleResultGUI.php
+++ b/classes/MultipleResultTable/class.ilParticipationCertificateMultipleResultGUI.php
@@ -18,7 +18,7 @@ class ilParticipationCertificateMultipleResultGUI
/**
* @var int[]
*/
- protected array $usr_ids;
+ protected ?array $usr_ids;
/**
* @var int
*/
@@ -106,4 +106,4 @@ protected function initTables(): void
$this->tables[] = new ilParticipationCertificateMultipleResultTableGUI($this, self::CMD_SHOW_ALL_RESULTS, $usr_id, $this->usr_ids);
}
}
-}
\ No newline at end of file
+}
diff --git a/classes/Report/class.ilParticipationCertificatePDFGenerator.php b/classes/Report/class.ilParticipationCertificatePDFGenerator.php
index 07add6c4..01e6d712 100644
--- a/classes/Report/class.ilParticipationCertificatePDFGenerator.php
+++ b/classes/Report/class.ilParticipationCertificatePDFGenerator.php
@@ -42,7 +42,7 @@ public function executeCommand(): void
}
}
- public function generatePDF(bool $rendered, int $total_users): void
+ public function generatePDF(string $rendered, int $total_users): void
{
global $printCount, $tempFile;
diff --git a/classes/Report/class.ilParticipationCertificateTwigParser.php b/classes/Report/class.ilParticipationCertificateTwigParser.php
index 278c06c3..fe424771 100644
--- a/classes/Report/class.ilParticipationCertificateTwigParser.php
+++ b/classes/Report/class.ilParticipationCertificateTwigParser.php
@@ -18,7 +18,7 @@ class ilParticipationCertificateTwigParser {
protected \Twig\TemplateWrapper|Twig_TemplateWrapper $twig_template;
- public function __construct(int $group_ref_id, array $twig_options, int $usr_id = null, bool $ementor = true, bool $edited = false, array|null $array = NULL) {
+ public function __construct(int $group_ref_id, array $twig_options, array $usr_id = null, bool $ementor = true, bool $edited = false, array|null $array = NULL) {
global $DIC;
$this->pl = ilParticipationCertificatePlugin::getInstance();
$this->tpl = $DIC->ui()->mainTemplate();
@@ -30,7 +30,7 @@ public function __construct(int $group_ref_id, array $twig_options, int $usr_id
$this->usr_id = $usr_id;
//wenn keine $usr_id übegeben wird, werden alle in der Gruppe gedruckt
- if ($usr_id == NULL) {
+ if ($usr_id[0] == NULL || $usr_id == NULL) {
$this->usr_id = $this->usr_ids;
}
$this->ementor = $ementor;
@@ -165,40 +165,6 @@ public function parseData(): void
if (key_exists($usr_id, $arr_learn_sugg_results) && is_object($arr_learn_sugg_results[$usr_id])) {
$learn_sugg_result = $arr_learn_sugg_results[$usr_id]->getAveragePercentage(ilParticipationCertificateConfig::getConfig('calculation_type_processing_state_suggested_objectives',$_GET['ref_id']),true);
}
- /*Video Conferences */
- $countPassed = 0;
- $countTests = 0;
- if (key_exists($usr_id, $arr_new_iass_states) && is_array($arr_new_iass_states[$usr_id])) {
- foreach ($arr_new_iass_states[$usr_id] as $item) {
- $countPassed = $countPassed + $item->getPassed();
- $countTests = $countTests + $item->getTotal();
- }
- }
-
- if (key_exists($usr_id, $arr_xali_states) && is_object($arr_xali_states[$usr_id])) {
- $countPassed = $countPassed + $arr_xali_states[$usr_id]->getPassed();
- $countTests = $countTests + $arr_xali_states[$usr_id]->getTotal();
- }
-
- if($countTests > 0) {
- $percentage = $countPassed / $countTests * 100;
-
- switch ($countTests) {
- case 1:
- if ($countPassed == 1) {
- $iass_states = "
";
- } else {
- $iass_states = "
";
- }
- break;
- default:
- $iass_states = $countPassed . "/" . $countTests;
- break;
- }
- } else {
- $iass_states = "
";
- }
-
//Home Work
$excercise_percentage = 0;
if (key_exists($usr_id, $arr_excercise_states) && is_object($arr_excercise_states[$usr_id])) {
@@ -206,6 +172,40 @@ public function parseData(): void
}
}
+ /*Video Conferences */
+ $countPassed = 0;
+ $countTests = 0;
+ if (key_exists($usr_id, $arr_new_iass_states) && is_array($arr_new_iass_states[$usr_id])) {
+ foreach ($arr_new_iass_states[$usr_id] as $item) {
+ $countPassed = $countPassed + $item->getPassed();
+ $countTests = $countTests + $item->getTotal();
+ }
+ }
+
+ if (key_exists($usr_id, $arr_xali_states) && is_object($arr_xali_states[$usr_id])) {
+ $countPassed = $countPassed + $arr_xali_states[$usr_id]->getPassed();
+ $countTests = $countTests + $arr_xali_states[$usr_id]->getTotal();
+ }
+
+ if($countTests > 0) {
+ $percentage = $countPassed / $countTests * 100;
+
+ switch ($countTests) {
+ case 1:
+ if ($countPassed == 1) {
+ $iass_states = "
pl->getImagePath("passed_s.png") . ">";
+ } else {
+ $iass_states = "
pl->getImagePath("failed_s.png") . ">";
+ }
+ break;
+ default:
+ $iass_states = $countPassed . "/" . $countTests;
+ break;
+ }
+ } else {
+ $iass_states = "
pl->getImagePath("not_attempted_s.png") . ">";
+ }
+
$arr_render = array(
'text_values' => $processed_arr_text_values,
'show_ementoring' => $this->ementor,
@@ -233,4 +233,4 @@ protected function loadTwig(): void
$loaded = true;
}
}
-}
\ No newline at end of file
+}
diff --git a/classes/Score/NewLearningObjectiveScores.php b/classes/Score/NewLearningObjectiveScores.php
index 89433293..22ea4f4c 100644
--- a/classes/Score/NewLearningObjectiveScores.php
+++ b/classes/Score/NewLearningObjectiveScores.php
@@ -30,8 +30,8 @@ protected static function getSQL(int $usr_id): string
$select = "select * from " . LearningObjectiveScore::TABLE_NAME . "
inner join crs_objectives on " . LearningObjectiveScore::TABLE_NAME . ".objective_id = crs_objectives.objective_id
where user_id =" . $ilDB->quote($usr_id, "integer") . "
- order by score DESC";
+ order by course_obj_id, score DESC";
return $select;
}
-}
\ No newline at end of file
+}
diff --git a/classes/SingleResultTable/class.ilParticipationCertificateSingleResultTableGUI.php b/classes/SingleResultTable/class.ilParticipationCertificateSingleResultTableGUI.php
index 72661743..68b854b9 100644
--- a/classes/SingleResultTable/class.ilParticipationCertificateSingleResultTableGUI.php
+++ b/classes/SingleResultTable/class.ilParticipationCertificateSingleResultTableGUI.php
@@ -177,6 +177,7 @@ public function parseData(): array
$arr_FinalTestsStates = ilLearnObjectFinalTestStates::getData([$this->usr_id]);
$usr_id = $this->usr_id;
$rec_array = array();
+ $processed = array();
if (count($arr_FinalTestsStates)) {
@@ -194,19 +195,28 @@ public function parseData(): array
*/
foreach($rec_final_tests as $key => $value) {
- if ($value->getLocftestCrsObjId()) {
- //first line - title lp
- $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()] = $value->getLocftestObjectiveTitle();
-
- $row_key[$value->getLocftestCrsObjId()] += 1;
- //second line - array progressbar
- $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][0] = $value->getLocftestPercentage();
- $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][1] = $value->getLocftestQplsRequiredPercentage();
- $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][2] = 1;
-
- $row_key[$value->getLocftestCrsObjId()] += 1;
- }
- }
+ if ($value->getLocftestCrsObjId()) {
+ // check if data already exists
+ $crs_obj_id = $value->getLocftestCrsObjId();
+ $crs_objective_id = $value->getLocftestObjectiveId();
+ if (isset($processed[$crs_obj_id])) {
+ if (isset($processed[$crs_obj_id][$crs_objective_id])) {
+ continue;
+ }
+ }
+ //first line - title lp
+ $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()] = $value->getLocftestObjectiveTitle();
+
+ $row_key[$value->getLocftestCrsObjId()] += 1;
+ //second line - array progressbar
+ $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][0] = $value->getLocftestPercentage();
+ $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][1] = $value->getLocftestQplsRequiredPercentage();
+ $rec_array[$row_key[$value->getLocftestCrsObjId()]][$value->getLocftestCrsObjId()][2] = 1;
+
+ $row_key[$value->getLocftestCrsObjId()] += 1;
+ $processed[$crs_obj_id][$crs_objective_id]=$usr_id;
+ }
+ }
@@ -255,7 +265,7 @@ public function fillRow(array $a_set): void
foreach ($this->getSelectableColumns() as $k => $v) {
if ($this->isColumnSelected($k)) {
- if ($a_set[$k]) {
+ if (isset($a_set[$k])) {
$this->tpl->setCurrentBlock('td');
if (is_array($a_set[$k])) {
diff --git a/classes/Table/class.ilParticipationCertificateResultGUI.php b/classes/Table/class.ilParticipationCertificateResultGUI.php
index 35359ccc..426e1a8c 100644
--- a/classes/Table/class.ilParticipationCertificateResultGUI.php
+++ b/classes/Table/class.ilParticipationCertificateResultGUI.php
@@ -115,7 +115,23 @@ public function content(): void
$this->toolbar->addButtonInstance($b_print);
}
}
-
+ $target_ref = 0;
+ if ($cert_access->isSelfPrintEnabled() and !$cert_access->hasCurrentUserPrintAccess()) {
+ $global_config_sets = ilParticipationCertificateConfig::where(array("config_type"=>3, "global_config_id" => 0 ))->orderBy('order_by')->get();
+ foreach ($global_config_sets as $config) {
+ if ($config->getConfigKey() == "true_name_helper") {
+ $target_ref=$config->getConfigValue();
+ }
+ }
+ $this->tpl->setOnScreenMessage('failure',$this->pl->txt('noname_noprint'), true);
+ if (is_numeric($target_ref) and ($target_ref > 0) and (ilObject::_lookupType(ilObject::_lookupObjectId($target_ref),false) == 'xudf')) {
+ $msgurl= ' ' . $this->pl->txt('helper_name') . '';
+ $msgadd= $this->pl->txt('helper_action_pre') . $msgurl . $this->pl->txt('helper_action_post');
+ $this->tpl->setOnScreenMessage('info',$msgadd, true);
+ //Variants sendQuestion, send Info or unified Failure (with some codechange). two same not possible
+ }
+ }
+
$this->initTable();
$this->tpl->setContent($this->table->getHTML());
@@ -162,8 +178,12 @@ public function printPdf(): void
{
$cert_access = new ilParticipationCertificateAccess($_GET['ref_id']);
if ($cert_access->hasCurrentUserPrintAccess()) {
- $ementor = $_GET['ementor'];
- $usr_id = $_GET['usr_id'];
+ if ($_GET['ementor'] == 'true') {
+ $ementor = true;
+ } else {
+ $ementor = false;
+ }
+ $usr_id[] = $_GET['usr_id'];
$twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), $usr_id, $ementor,
false);
$twigParser->parseData();
@@ -181,9 +201,14 @@ public function printSelected(): void
$this->tpl->setOnScreenMessage('failure',$this->lng->txt('no_records_selected'), true);
$this->ctrl->redirect($this, self::CMD_CONTENT);
}
- $usr_id = $_POST['record_ids'];
- $twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), $usr_id, true, false,
- false);
+ $usr_ids = $_POST['record_ids'];
+ if (!is_array($usr_ids)) {
+ $usr_id[] = $usr_ids;
+ } else {
+ $usr_id = $usr_ids;
+ }
+ $twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), (array) $usr_id, true, false);
+
$twigParser->parseData();
} else {
$this->tpl->setOnScreenMessage('failure',$this->lng->txt('no_permission'), true);
@@ -200,9 +225,13 @@ public function printSelectedWithouteMentoring(): void
$this->ctrl->redirect($this, self::CMD_CONTENT);
}
- $usr_id = $_POST['record_ids'];
- $twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), $usr_id, false, false,
- false);
+ $usr_ids = $_POST['record_ids'];
+ if (!is_array($usr_ids)) {
+ $usr_id[] = $usr_ids;
+ } else {
+ $usr_id = $usr_ids;
+ }
+ $twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), $usr_id, false, false);
$twigParser->parseData();
} else {
$this->tpl->setOnScreenMessage('failure',$this->lng->txt('no_permission'), true);
diff --git a/classes/Table/class.ilParticipationCertificateResultModificationGUI.php b/classes/Table/class.ilParticipationCertificateResultModificationGUI.php
index 345ff9e1..217c3dc8 100644
--- a/classes/Table/class.ilParticipationCertificateResultModificationGUI.php
+++ b/classes/Table/class.ilParticipationCertificateResultModificationGUI.php
@@ -137,6 +137,7 @@ public function initForm(): ilPropertyFormGUI
$nameUser = $arr_usr_data[$usr_id]->getPartCertFirstname() . ' ' . $arr_usr_data[$usr_id]->getPartCertLastname();
$form = new ilPropertyFormGUI();
+ $form->setPreventDoubleSubmission(false);
$cert_access = new ilParticipationCertificateAccess($_GET['ref_id']);
if ($cert_access->hasCurrentUserWriteAccess()) {
$form->setFormAction($this->ctrl->getFormAction($this));
@@ -207,7 +208,7 @@ public function printPDF(): void
$array = array($form->getInput('initial'), $form->getInput('resultstest'), $form->getInput('conf'), $form->getInput('homework'));
$ementor = $_GET['ementor'];
$edited = $_GET['edited'];
- $usr_id = $this->usr_id;
+ $usr_id[] = $this->usr_id;
$twigParser = new ilParticipationCertificateTwigParser($this->groupRefId, array(), $usr_id, $ementor, $edited, $array);
$twigParser->parseData();
}
diff --git a/classes/Table/class.ilParticipationCertificateResultTableGUI.php b/classes/Table/class.ilParticipationCertificateResultTableGUI.php
index c7f2f923..7696603b 100644
--- a/classes/Table/class.ilParticipationCertificateResultTableGUI.php
+++ b/classes/Table/class.ilParticipationCertificateResultTableGUI.php
@@ -62,21 +62,7 @@ public function __construct(ilParticipationCertificateResultGUI $a_parent_obj, s
$this->addMultiCommand(ilParticipationCertificateMultipleResultGUI::CMD_SHOW_ALL_RESULTS, $this->pl->txt('list_overview'));
}
- if ($cert_access->isSelfPrintEnabled() and !$cert_access->hasCurrentUserPrintAccess()) {
- $global_config_sets = ilParticipationCertificateConfig::where(array("config_type"=>3, "global_config_id" => 0 ))->orderBy('order_by')->get();
- foreach ($global_config_sets as $config) {
- if ($config->getConfigKey() == "true_name_helper") {
- $target_ref=$config->getConfigValue();
- }
- }
- $this->tpl->setOnScreenMessage('failure',$this->pl->txt('noname_noprint'), true);
- if (is_numeric($target_ref) and ($target_ref > 0) and (ilObject::_lookupType(ilObject::_lookupObjectId($target_ref),false) == 'xudf')) {
- $msgurl= ' ' . $this->pl->txt('helper_name') . '';
- $msgadd= $this->pl->txt('helper_action_pre') . $msgurl . $this->pl->txt('helper_action_post');
- $this->tpl->setOnScreenMessage('info',$msgadd, true);
- //Variants sendQuestion, send Info or unified Failure (with some codechange). two same not possible
- }
- }
+
$this->setRowTemplate('tpl.default_row.html', $this->pl->getDirectory());
$this->setFormAction($this->ctrl->getFormAction($a_parent_obj));
@@ -115,16 +101,16 @@ function getSelectableColumns(): array
'sort_field' => 'initial_test_finished'
);
$cols['result_qualifing_tests'] = array(
- 'txt' => $this->pl->txt('cols_results_qualifying'),
+ 'txt' => $this->pl->txt('cols_result_qualifying'),
'default' => true,
'width' => 'auto',
'sort_field' => 'result_qualifing_tests'
);
$cols['results_qualifing_tests'] = array(
- 'txt' => $this->pl->txt('cols_result_qualifying'),
+ 'txt' => $this->pl->txt('cols_results_qualifying'),
'default' => false,
'width' => 'auto',
- 'sort_field' => 'results_qualifing_tests'
+ 'sort_field' => 'result_qualifing_tests'
);
$cols['eMentoring_finished'] = array(
'txt' => $this->pl->txt('cols_eMentoring_finished'),
@@ -157,6 +143,10 @@ private function addColumns(): void
} else {
$sort = NULL;
}
+ if ($sort == 'results_qualifying_tests')
+ {
+ $sort = 'result_qualifying_tests';
+ }
$this->addColumn($v['txt'], $sort, $v['width']);
}
}
diff --git a/classes/class.ilParticipationCertificateUIHookGUI.php b/classes/class.ilParticipationCertificateUIHookGUI.php
index f783b788..5ac6d631 100644
--- a/classes/class.ilParticipationCertificateUIHookGUI.php
+++ b/classes/class.ilParticipationCertificateUIHookGUI.php
@@ -25,7 +25,11 @@ public function __construct() {
if($DIC->offsetExists('tpl')) {
$this->ctrl = $DIC->ctrl();
$this->pl = ilParticipationCertificatePlugin::getInstance();
- $this->groupRefId = (int)$_GET['ref_id'];
+ if (isset($_GET['ref_id'])) {
+ $this->groupRefId = (int)$_GET['ref_id'];
+ } else {
+ $this->groupRefId = 0;
+ }
$this->objecttype = ilObject::_lookupType($this->groupRefId, true);
if ($this->groupRefId === 0 || ( $this->objecttype !== 'crs' and $this->objecttype !== 'grp')) {
@@ -115,4 +119,4 @@ private function strposa($haystack, $needles=array(), int $offset=0): mixed {
if(empty($chr)) return false;
return min($chr);
}
-}
\ No newline at end of file
+}
diff --git a/classes/xaliState/class.xaliStates.php b/classes/xaliState/class.xaliStates.php
index 22d0f560..d57dbbde 100644
--- a/classes/xaliState/class.xaliStates.php
+++ b/classes/xaliState/class.xaliStates.php
@@ -12,6 +12,11 @@ public static function getData(array $arr_usr_ids, int $group_ref_id): array
$data = [];
$arr_xali_status = [];
+ // init array, set present and total to 0 for every user
+ foreach ($arr_usr_ids as $usr_id) {
+ $arr_xali_status[$usr_id]['present'] = 0;
+ $arr_xali_status[$usr_id]['total'] = 0;
+ }
foreach ($items as $ref_id) {
if (ilObject::_lookupType($ref_id, true) != 'xali') {
continue;
@@ -25,7 +30,11 @@ public static function getData(array $arr_usr_ids, int $group_ref_id): array
foreach ($arr_usr_ids as $usr_id) {
$xaliUserStatus = xaliUserStatus::getInstance($usr_id, $object_id);
$arr_xali_status[$usr_id]['present'] = (int) $arr_xali_status[$usr_id]['present'] + $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_PRESENT);
- $arr_xali_status[$usr_id]['total'] = $arr_xali_status[$usr_id]['total'] + $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_ABSENT_UNEXCUSED) + $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_ABSENT_EXCUSED) + $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_PRESENT);
+ $arr_xali_status[$usr_id]['total'] = $arr_xali_status[$usr_id]['total'] +
+ $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_ABSENT_UNEXCUSED) +
+ $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_ABSENT_EXCUSED) +
+ $xaliUserStatus->getAttendanceStatuses(xaliChecklistEntry::STATUS_PRESENT);
+
}
}
@@ -39,4 +48,4 @@ public static function getData(array $arr_usr_ids, int $group_ref_id): array
}
return $data;
}
-}
\ No newline at end of file
+}
diff --git a/composer.json b/composer.json
index b38fe457..454c66f3 100644
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,8 @@
{
"require": {
"php": ">=7.2",
- "mpdf/mpdf": "^8.0",
+ "psr/log": "1.0",
+ "mpdf/mpdf": "^8.2.0",
"twig/twig": "~2.15"
},
"autoload": {
diff --git a/composer.lock b/composer.lock
index 00cf6337..f9a24907 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "7f25b07bf33f76308ac8730883295d16",
+ "content-hash": "5fb9fb613b2daa3c4c01406695b44391",
"packages": [
{
"name": "mpdf/mpdf",
- "version": "v8.2.2",
+ "version": "v8.2.4",
"source": {
"type": "git",
"url": "https://github.com/mpdf/mpdf.git",
- "reference": "596a87b876d7793be7be060a8ac13424de120dd5"
+ "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mpdf/mpdf/zipball/596a87b876d7793be7be060a8ac13424de120dd5",
- "reference": "596a87b876d7793be7be060a8ac13424de120dd5",
+ "url": "https://api.github.com/repos/mpdf/mpdf/zipball/9e3ff91606fed11cd58a130eabaaf60e56fdda88",
+ "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88",
"shasum": ""
},
"require": {
@@ -85,7 +85,7 @@
"type": "custom"
}
],
- "time": "2023-11-07T13:52:14+00:00"
+ "time": "2024-06-14T16:06:41+00:00"
},
{
"name": "mpdf/psr-http-message-shim",
@@ -137,20 +137,20 @@
},
{
"name": "mpdf/psr-log-aware-trait",
- "version": "v3.0.0",
+ "version": "v2.0.0",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-log-aware-trait.git",
- "reference": "a633da6065e946cc491e1c962850344bb0bf3e78"
+ "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78",
- "reference": "a633da6065e946cc491e1c962850344bb0bf3e78",
+ "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/7a077416e8f39eb626dee4246e0af99dd9ace275",
+ "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275",
"shasum": ""
},
"require": {
- "psr/log": "^3.0"
+ "psr/log": "^1.0 || ^2.0"
},
"type": "library",
"autoload": {
@@ -175,22 +175,22 @@
"description": "Trait to allow support of different psr/log versions.",
"support": {
"issues": "https://github.com/mpdf/psr-log-aware-trait/issues",
- "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0"
+ "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v2.0.0"
},
- "time": "2023-05-03T06:19:36+00:00"
+ "time": "2023-05-03T06:18:28+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.11.1",
+ "version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
"shasum": ""
},
"require": {
@@ -198,11 +198,12 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
@@ -228,7 +229,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
},
"funding": [
{
@@ -236,7 +237,7 @@
"type": "tidelift"
}
],
- "time": "2023-03-08T13:26:56+00:00"
+ "time": "2024-06-12T14:39:25+00:00"
},
{
"name": "paragonie/random_compat",
@@ -343,30 +344,22 @@
},
{
"name": "psr/log",
- "version": "3.0.0",
+ "version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
"shasum": ""
},
- "require": {
- "php": ">=8.0.0"
- },
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Psr\\Log\\": "src"
+ "psr-0": {
+ "Psr\\Log\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -376,33 +369,33 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/3.0.0"
+ "issues": "https://github.com/php-fig/log/issues",
+ "source": "https://github.com/php-fig/log/tree/1.0.0"
},
- "time": "2021-07-14T16:46:02+00:00"
+ "time": "2012-12-21T11:40:51+00:00"
},
{
"name": "setasign/fpdi",
- "version": "v2.5.0",
+ "version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/Setasign/FPDI.git",
- "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4"
+ "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4",
- "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4",
+ "url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad",
+ "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad",
"shasum": ""
},
"require": {
@@ -414,8 +407,8 @@
},
"require-dev": {
"phpunit/phpunit": "~5.7",
- "setasign/fpdf": "~1.8",
- "setasign/tfpdf": "~1.31",
+ "setasign/fpdf": "~1.8.6",
+ "setasign/tfpdf": "~1.33",
"squizlabs/php_codesniffer": "^3.5",
"tecnickcom/tcpdf": "~6.2"
},
@@ -453,7 +446,7 @@
],
"support": {
"issues": "https://github.com/Setasign/FPDI/issues",
- "source": "https://github.com/Setasign/FPDI/tree/v2.5.0"
+ "source": "https://github.com/Setasign/FPDI/tree/v2.6.0"
},
"funding": [
{
@@ -461,20 +454,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-28T10:46:27+00:00"
+ "time": "2023-12-11T16:03:32+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.28.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
"shasum": ""
},
"require": {
@@ -488,9 +481,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -527,7 +517,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
},
"funding": [
{
@@ -543,20 +533,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.28.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "42292d99c55abe617799667f454222c54c60e229"
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
- "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
"shasum": ""
},
"require": {
@@ -570,9 +560,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -610,7 +597,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
},
"funding": [
{
@@ -626,20 +613,20 @@
"type": "tidelift"
}
],
- "time": "2023-07-28T09:04:16+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
"name": "symfony/polyfill-php72",
- "version": "v1.28.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
+ "reference": "10112722600777e02d2745716b70c5db4ca70442"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442",
+ "reference": "10112722600777e02d2745716b70c5db4ca70442",
"shasum": ""
},
"require": {
@@ -647,9 +634,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -686,7 +670,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0"
},
"funding": [
{
@@ -702,20 +686,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
"name": "twig/twig",
- "version": "v2.15.5",
+ "version": "v2.16.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e"
+ "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
- "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/0c9cc7ef2e0ec6d20c5af1200522a89ba101f623",
+ "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623",
"shasum": ""
},
"require": {
@@ -726,12 +710,12 @@
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
+ "symfony/phpunit-bridge": "^5.4.9|^6.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.15-dev"
+ "dev-master": "2.16-dev"
}
},
"autoload": {
@@ -770,7 +754,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v2.15.5"
+ "source": "https://github.com/twigphp/Twig/tree/v2.16.0"
},
"funding": [
{
@@ -782,7 +766,7 @@
"type": "tidelift"
}
],
- "time": "2023-05-03T17:49:41+00:00"
+ "time": "2023-12-22T07:22:15+00:00"
}
],
"packages-dev": [],
diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang
index 25625891..51d5b2b6 100644
--- a/lang/ilias_de.lang
+++ b/lang/ilias_de.lang
@@ -1,10 +1,12 @@
tbl_overview_results#:#Übersicht der Resultate
cols_userid#:#UserID
-cols_firstname#:#Vorname
-cols_lastname#:#Nachname
+cols_firstname#:#Vorname (Druck)
+cols_lastname#:#Nachname (Druck)
+cols_alias_firstname#:#Vorname (sichtbar)
+cols_alias_lastname#:#Nachname (sichtbar)
cols_initial_test_finished#:#Einstiegstest abgeschlossen
-cols_results_qualifying#:#Bearbeitung der empfohlenen Mathematik-Lernmodule
-cols_result_qualifying#:#Resultate der durchgeführten Tests der empfohlenen Mathematik-Lernmodule
+cols_result_qualifying#:#Bearbeitung der empfohlenen Mathematik-Lernmodule
+cols_results_qualifying#:#Resultate der durchgeführten Tests der empfohlenen Mathematik-Lernmodule
cols_eMentoring_finished#:#Aktive Teilnahme an Videokonferenzen
cols_eMentoring_homework#:#Bearbeitung der Aufgaben zu überfachlichen Themen (Anzahl)
cols_eMentoring_percentage#:#Bearbeitung der Aufgaben zu überfachlichen Themen in Prozent
@@ -29,9 +31,9 @@ result_for#:#Alle Resultate für
no_records_selected#:#Keine User ausgewählt
upload_header #:# Laden Sie Ihren PDF Header hoch
save#:#Speichern
-udf_gender#:#Benutzerdefiniertes Feld Geschlecht
-udf_lastname#:#Benutzerdefiniertes Feld Nachnamen
-udf_firstname#:#Benutzerdefiniertes Feld Vornamen
+udf_gender#:#Benutzerdefiniertes Feld Anrade
+udf_lastname#:#Benutzerdefiniertes Feld Nachname
+udf_firstname#:#Benutzerdefiniertes Feld Vorname
config_plugin#:#Konfiguration Teilnahmebescheinigung
mod_initial#:#Einstiegstest abgeschlossen (Ja(1)/Nein(0) )
mod_resultstest#:#Resultat qualifizierende Tests (Prozentwert)
diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang
index 643deb7b..05514c77 100644
--- a/lang/ilias_en.lang
+++ b/lang/ilias_en.lang
@@ -1,10 +1,12 @@
tbl_overview_results#:#Overview of Results
cols_userid#:#UserID
-cols_firstname#:#First Name
-cols_lastname#:#Last Name
+cols_firstname#:#First Name (Print)
+cols_lastname#:#Last Name (Print)
+cols_alias_firstname#:#First Name (public)
+cols_alias_lastname#:#Last Name (public)
cols_initial_test_finished#:#Initial Test Completed
-cols_results_qualifying#:#Processing of Recommended Mathematics Learning Modules
-cols_result_qualifying#:#Results of Completed Tests of Recommended Mathematics Learning Modules
+cols_result_qualifying#:#Processing of Recommended Mathematics Learning Modules
+cols_results_qualifying#:#Results of Completed Tests of Recommended Mathematics Learning Modules
cols_eMentoring_finished#:#Active Participation in Video Conferences
cols_eMentoring_homework#:#Processing of Cross-Disciplinary Homework (Count)
cols_eMentoring_percentage#:#Processing of Cross-Disciplinary Homework in Percentage
@@ -88,9 +90,9 @@ calculation_type_processing_state_suggested_objectives#:#Calculation Type 'Proce
config_result_table#:#Configuration Period & Calculation Type
noname_noprint#:#Printing the Certificate of Participation is only possible if you have entered both First and Last Name.
helper_action_pre#:#You can update your
-helper_action_post#:# to enable printing!
+helper_action_post#:# to enable printing!
helper_name#:#Update Entries
unsugg_color#:#Color Not Recommended LZ
true_name_helper#:#UDF Editor Object for Name Entry
nonnumeric_ref#:#Input for the UDF Editor Object must be the Ref ID (numeric or empty, other characters are not allowed).
-enable_ementoring#:#Show eMentoring
\ No newline at end of file
+enable_ementoring#:#Show eMentoring
diff --git a/vendor/autoload.php b/vendor/autoload.php
index 9057e94f..46e4871a 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -22,4 +22,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
-return ComposerAutoloaderInit738dc0c59d5cb068de66fc92822764a2::getLoader();
+return ComposerAutoloaderInit5fb9fb613b2daa3c4c01406695b44391::getLoader();
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index b7cac82b..92c871e6 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -270,6 +270,22 @@
'Mpdf\\Writer\\ResourceWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ResourceWriter.php',
'NewLearningObjectiveScore' => $baseDir . '/classes/Score/NewLearningObjectiveScore.php',
'NewLearningObjectiveScores' => $baseDir . '/classes/Score/NewLearningObjectiveScores.php',
+ 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php',
@@ -422,6 +438,7 @@
'Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
'Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php',
'Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
+ 'Twig\\Sandbox\\SourcePolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SourcePolicyInterface.php',
'Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php',
'Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php',
'Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php',
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index 2a91a877..660b4bb2 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -7,4 +7,5 @@
return array(
'Twig_' => array($vendorDir . '/twig/twig/lib'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log'),
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 0530d6bb..8be8a96d 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -11,6 +11,7 @@
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
+ 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
'Mpdf\\PsrLogAwareTrait\\' => array($vendorDir . '/mpdf/psr-log-aware-trait/src'),
'Mpdf\\PsrHttpMessageShim\\' => array($vendorDir . '/mpdf/psr-http-message-shim/src'),
'Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'),
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 27ea9dc9..63b06fad 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
-class ComposerAutoloaderInit738dc0c59d5cb068de66fc92822764a2
+class ComposerAutoloaderInit5fb9fb613b2daa3c4c01406695b44391
{
private static $loader;
@@ -24,17 +24,17 @@ public static function getLoader()
require __DIR__ . '/platform_check.php';
- spl_autoload_register(array('ComposerAutoloaderInit738dc0c59d5cb068de66fc92822764a2', 'loadClassLoader'), true, true);
+ spl_autoload_register(array('ComposerAutoloaderInit5fb9fb613b2daa3c4c01406695b44391', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
- spl_autoload_unregister(array('ComposerAutoloaderInit738dc0c59d5cb068de66fc92822764a2', 'loadClassLoader'));
+ spl_autoload_unregister(array('ComposerAutoloaderInit5fb9fb613b2daa3c4c01406695b44391', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
- call_user_func(\Composer\Autoload\ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::getInitializer($loader));
+ call_user_func(\Composer\Autoload\ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
- $filesToLoad = \Composer\Autoload\ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::$files;
+ $filesToLoad = \Composer\Autoload\ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 6db58246..bf629375 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -4,7 +4,7 @@
namespace Composer\Autoload;
-class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
+class ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391
{
public static $files = array (
'6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
@@ -29,6 +29,10 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
'Symfony\\Polyfill\\Mbstring\\' => 26,
'Symfony\\Polyfill\\Ctype\\' => 23,
),
+ 'P' =>
+ array (
+ 'Psr\\Http\\Message\\' => 17,
+ ),
'M' =>
array (
'Mpdf\\PsrLogAwareTrait\\' => 22,
@@ -62,6 +66,10 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
),
+ 'Psr\\Http\\Message\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-message/src',
+ ),
'Mpdf\\PsrLogAwareTrait\\' =>
array (
0 => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src',
@@ -88,6 +96,13 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
0 => __DIR__ . '/..' . '/twig/twig/lib',
),
),
+ 'P' =>
+ array (
+ 'Psr\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/log',
+ ),
+ ),
);
public static $classMap = array (
@@ -355,6 +370,22 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
'Mpdf\\Writer\\ResourceWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ResourceWriter.php',
'NewLearningObjectiveScore' => __DIR__ . '/../..' . '/classes/Score/NewLearningObjectiveScore.php',
'NewLearningObjectiveScores' => __DIR__ . '/../..' . '/classes/Score/NewLearningObjectiveScores.php',
+ 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php',
@@ -507,6 +538,7 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
'Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
'Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php',
'Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
+ 'Twig\\Sandbox\\SourcePolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SourcePolicyInterface.php',
'Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php',
'Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php',
'Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php',
@@ -829,10 +861,10 @@ class ComposerStaticInit738dc0c59d5cb068de66fc92822764a2
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
- $loader->prefixLengthsPsr4 = ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::$prefixLengthsPsr4;
- $loader->prefixDirsPsr4 = ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::$prefixDirsPsr4;
- $loader->prefixesPsr0 = ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::$prefixesPsr0;
- $loader->classMap = ComposerStaticInit738dc0c59d5cb068de66fc92822764a2::$classMap;
+ $loader->prefixLengthsPsr4 = ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::$prefixDirsPsr4;
+ $loader->prefixesPsr0 = ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::$prefixesPsr0;
+ $loader->classMap = ComposerStaticInit5fb9fb613b2daa3c4c01406695b44391::$classMap;
}, null, ClassLoader::class);
}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 1c3df0e6..9f0158f7 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -2,17 +2,17 @@
"packages": [
{
"name": "mpdf/mpdf",
- "version": "v8.2.2",
- "version_normalized": "8.2.2.0",
+ "version": "v8.2.4",
+ "version_normalized": "8.2.4.0",
"source": {
"type": "git",
"url": "https://github.com/mpdf/mpdf.git",
- "reference": "596a87b876d7793be7be060a8ac13424de120dd5"
+ "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mpdf/mpdf/zipball/596a87b876d7793be7be060a8ac13424de120dd5",
- "reference": "596a87b876d7793be7be060a8ac13424de120dd5",
+ "url": "https://api.github.com/repos/mpdf/mpdf/zipball/9e3ff91606fed11cd58a130eabaaf60e56fdda88",
+ "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88",
"shasum": ""
},
"require": {
@@ -39,7 +39,7 @@
"ext-xml": "Needed mainly for SVG manipulation",
"ext-zlib": "Needed for compression of embedded resources, such as fonts"
},
- "time": "2023-11-07T13:52:14+00:00",
+ "time": "2024-06-14T16:06:41+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -137,23 +137,23 @@
},
{
"name": "mpdf/psr-log-aware-trait",
- "version": "v3.0.0",
- "version_normalized": "3.0.0.0",
+ "version": "v2.0.0",
+ "version_normalized": "2.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-log-aware-trait.git",
- "reference": "a633da6065e946cc491e1c962850344bb0bf3e78"
+ "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78",
- "reference": "a633da6065e946cc491e1c962850344bb0bf3e78",
+ "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/7a077416e8f39eb626dee4246e0af99dd9ace275",
+ "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275",
"shasum": ""
},
"require": {
- "psr/log": "^3.0"
+ "psr/log": "^1.0 || ^2.0"
},
- "time": "2023-05-03T06:19:36+00:00",
+ "time": "2023-05-03T06:18:28+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -178,23 +178,23 @@
"description": "Trait to allow support of different psr/log versions.",
"support": {
"issues": "https://github.com/mpdf/psr-log-aware-trait/issues",
- "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0"
+ "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v2.0.0"
},
"install-path": "../mpdf/psr-log-aware-trait"
},
{
"name": "myclabs/deep-copy",
- "version": "1.11.1",
- "version_normalized": "1.11.1.0",
+ "version": "1.12.0",
+ "version_normalized": "1.12.0.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
"shasum": ""
},
"require": {
@@ -202,14 +202,15 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
- "time": "2023-03-08T13:26:56+00:00",
+ "time": "2024-06-12T14:39:25+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -234,7 +235,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
},
"funding": [
{
@@ -355,33 +356,25 @@
},
{
"name": "psr/log",
- "version": "3.0.0",
- "version_normalized": "3.0.0.0",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
"shasum": ""
},
- "require": {
- "php": ">=8.0.0"
- },
- "time": "2021-07-14T16:46:02+00:00",
+ "time": "2012-12-21T11:40:51+00:00",
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "Psr\\Log\\": "src"
+ "psr-0": {
+ "Psr\\Log\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -391,34 +384,34 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/3.0.0"
+ "issues": "https://github.com/php-fig/log/issues",
+ "source": "https://github.com/php-fig/log/tree/1.0.0"
},
"install-path": "../psr/log"
},
{
"name": "setasign/fpdi",
- "version": "v2.5.0",
- "version_normalized": "2.5.0.0",
+ "version": "v2.6.0",
+ "version_normalized": "2.6.0.0",
"source": {
"type": "git",
"url": "https://github.com/Setasign/FPDI.git",
- "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4"
+ "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4",
- "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4",
+ "url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad",
+ "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad",
"shasum": ""
},
"require": {
@@ -430,15 +423,15 @@
},
"require-dev": {
"phpunit/phpunit": "~5.7",
- "setasign/fpdf": "~1.8",
- "setasign/tfpdf": "~1.31",
+ "setasign/fpdf": "~1.8.6",
+ "setasign/tfpdf": "~1.33",
"squizlabs/php_codesniffer": "^3.5",
"tecnickcom/tcpdf": "~6.2"
},
"suggest": {
"setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured."
},
- "time": "2023-09-28T10:46:27+00:00",
+ "time": "2023-12-11T16:03:32+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -471,7 +464,7 @@
],
"support": {
"issues": "https://github.com/Setasign/FPDI/issues",
- "source": "https://github.com/Setasign/FPDI/tree/v2.5.0"
+ "source": "https://github.com/Setasign/FPDI/tree/v2.6.0"
},
"funding": [
{
@@ -483,17 +476,17 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.28.0",
- "version_normalized": "1.28.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
"shasum": ""
},
"require": {
@@ -505,12 +498,9 @@
"suggest": {
"ext-ctype": "For best performance"
},
- "time": "2023-01-26T09:26:14+00:00",
+ "time": "2024-05-31T15:07:36+00:00",
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -548,7 +538,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
},
"funding": [
{
@@ -568,17 +558,17 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.28.0",
- "version_normalized": "1.28.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "42292d99c55abe617799667f454222c54c60e229"
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
- "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
"shasum": ""
},
"require": {
@@ -590,12 +580,9 @@
"suggest": {
"ext-mbstring": "For best performance"
},
- "time": "2023-07-28T09:04:16+00:00",
+ "time": "2024-06-19T12:30:46+00:00",
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -634,7 +621,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
},
"funding": [
{
@@ -654,28 +641,25 @@
},
{
"name": "symfony/polyfill-php72",
- "version": "v1.28.0",
- "version_normalized": "1.28.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
+ "reference": "10112722600777e02d2745716b70c5db4ca70442"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442",
+ "reference": "10112722600777e02d2745716b70c5db4ca70442",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
- "time": "2023-01-26T09:26:14+00:00",
+ "time": "2024-06-19T12:30:46+00:00",
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -713,7 +697,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0"
},
"funding": [
{
@@ -733,17 +717,17 @@
},
{
"name": "twig/twig",
- "version": "v2.15.5",
- "version_normalized": "2.15.5.0",
+ "version": "v2.16.0",
+ "version_normalized": "2.16.0.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e"
+ "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
- "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/0c9cc7ef2e0ec6d20c5af1200522a89ba101f623",
+ "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623",
"shasum": ""
},
"require": {
@@ -754,13 +738,13 @@
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
+ "symfony/phpunit-bridge": "^5.4.9|^6.3"
},
- "time": "2023-05-03T17:49:41+00:00",
+ "time": "2023-12-22T07:22:15+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.15-dev"
+ "dev-master": "2.16-dev"
}
},
"installation-source": "dist",
@@ -800,7 +784,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v2.15.5"
+ "source": "https://github.com/twigphp/Twig/tree/v2.16.0"
},
"funding": [
{
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index ae85cd4f..99a10e8b 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -1,9 +1,9 @@
array(
'name' => '__root__',
- 'pretty_version' => '1.0.0+no-version-set',
- 'version' => '1.0.0.0',
- 'reference' => NULL,
+ 'pretty_version' => 'dev-main',
+ 'version' => 'dev-main',
+ 'reference' => 'cfa74689cfb31a056ef663820114826fcc140d56',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -11,18 +11,18 @@
),
'versions' => array(
'__root__' => array(
- 'pretty_version' => '1.0.0+no-version-set',
- 'version' => '1.0.0.0',
- 'reference' => NULL,
+ 'pretty_version' => 'dev-main',
+ 'version' => 'dev-main',
+ 'reference' => 'cfa74689cfb31a056ef663820114826fcc140d56',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev_requirement' => false,
),
'mpdf/mpdf' => array(
- 'pretty_version' => 'v8.2.2',
- 'version' => '8.2.2.0',
- 'reference' => '596a87b876d7793be7be060a8ac13424de120dd5',
+ 'pretty_version' => 'v8.2.4',
+ 'version' => '8.2.4.0',
+ 'reference' => '9e3ff91606fed11cd58a130eabaaf60e56fdda88',
'type' => 'library',
'install_path' => __DIR__ . '/../mpdf/mpdf',
'aliases' => array(),
@@ -38,18 +38,18 @@
'dev_requirement' => false,
),
'mpdf/psr-log-aware-trait' => array(
- 'pretty_version' => 'v3.0.0',
- 'version' => '3.0.0.0',
- 'reference' => 'a633da6065e946cc491e1c962850344bb0bf3e78',
+ 'pretty_version' => 'v2.0.0',
+ 'version' => '2.0.0.0',
+ 'reference' => '7a077416e8f39eb626dee4246e0af99dd9ace275',
'type' => 'library',
'install_path' => __DIR__ . '/../mpdf/psr-log-aware-trait',
'aliases' => array(),
'dev_requirement' => false,
),
'myclabs/deep-copy' => array(
- 'pretty_version' => '1.11.1',
- 'version' => '1.11.1.0',
- 'reference' => '7284c22080590fb39f2ffa3e9057f10a4ddd0e0c',
+ 'pretty_version' => '1.12.0',
+ 'version' => '1.12.0.0',
+ 'reference' => '3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c',
'type' => 'library',
'install_path' => __DIR__ . '/../myclabs/deep-copy',
'aliases' => array(),
@@ -74,54 +74,54 @@
'dev_requirement' => false,
),
'psr/log' => array(
- 'pretty_version' => '3.0.0',
- 'version' => '3.0.0.0',
- 'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',
+ 'pretty_version' => '1.0.0',
+ 'version' => '1.0.0.0',
+ 'reference' => 'fe0936ee26643249e916849d48e3a51d5f5e278b',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/log',
'aliases' => array(),
'dev_requirement' => false,
),
'setasign/fpdi' => array(
- 'pretty_version' => 'v2.5.0',
- 'version' => '2.5.0.0',
- 'reference' => 'ecf0459643ec963febfb9a5d529dcd93656006a4',
+ 'pretty_version' => 'v2.6.0',
+ 'version' => '2.6.0.0',
+ 'reference' => 'a6db878129ec6c7e141316ee71872923e7f1b7ad',
'type' => 'library',
'install_path' => __DIR__ . '/../setasign/fpdi',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-ctype' => array(
- 'pretty_version' => 'v1.28.0',
- 'version' => '1.28.0.0',
- 'reference' => 'ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '0424dff1c58f028c451efff2045f5d92410bd540',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
- 'pretty_version' => 'v1.28.0',
- 'version' => '1.28.0.0',
- 'reference' => '42292d99c55abe617799667f454222c54c60e229',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => 'fd22ab50000ef01661e2a31d850ebaa297f8e03c',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php72' => array(
- 'pretty_version' => 'v1.28.0',
- 'version' => '1.28.0.0',
- 'reference' => '70f4aebd92afca2f865444d30a4d2151c13c3179',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '10112722600777e02d2745716b70c5db4ca70442',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
'aliases' => array(),
'dev_requirement' => false,
),
'twig/twig' => array(
- 'pretty_version' => 'v2.15.5',
- 'version' => '2.15.5.0',
- 'reference' => 'fc02a6af3eeb97c4bf5650debc76c2eda85ac22e',
+ 'pretty_version' => 'v2.16.0',
+ 'version' => '2.16.0.0',
+ 'reference' => '0c9cc7ef2e0ec6d20c5af1200522a89ba101f623',
'type' => 'library',
'install_path' => __DIR__ . '/../twig/twig',
'aliases' => array(),
diff --git a/vendor/mpdf/mpdf/.github/SECURITY.md b/vendor/mpdf/mpdf/.github/SECURITY.md
index c4f92d31..71878d08 100644
--- a/vendor/mpdf/mpdf/.github/SECURITY.md
+++ b/vendor/mpdf/mpdf/.github/SECURITY.md
@@ -2,5 +2,4 @@ How to disclose potential security issues
============
As mPDF does not have a domain or a dedicated contact apart from its Github repository, to prevent
-disclosing maintainers' contacts publicly, please create an Issue about the security issue with means to contact you.
-We will reach out to you as soon as possible.
+disclosing maintainers' contacts publicly, please use [GitHub's Security Advisories system](https://github.com/mpdf/mpdf/security/advisories).
\ No newline at end of file
diff --git a/vendor/mpdf/mpdf/.github/workflows/coverage.yml b/vendor/mpdf/mpdf/.github/workflows/coverage.yml
index 45980f9d..9ae56589 100644
--- a/vendor/mpdf/mpdf/.github/workflows/coverage.yml
+++ b/vendor/mpdf/mpdf/.github/workflows/coverage.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: "Checkout"
- uses: "actions/checkout@v3"
+ uses: "actions/checkout@v4"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
diff --git a/vendor/mpdf/mpdf/.github/workflows/cs.yml b/vendor/mpdf/mpdf/.github/workflows/cs.yml
index 1fdf0aa0..c2a46d08 100644
--- a/vendor/mpdf/mpdf/.github/workflows/cs.yml
+++ b/vendor/mpdf/mpdf/.github/workflows/cs.yml
@@ -26,7 +26,7 @@ jobs:
steps:
- name: "Checkout"
- uses: "actions/checkout@v3"
+ uses: "actions/checkout@v4"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
diff --git a/vendor/mpdf/mpdf/.github/workflows/tests.yml b/vendor/mpdf/mpdf/.github/workflows/tests.yml
index 583bd29f..89141803 100644
--- a/vendor/mpdf/mpdf/.github/workflows/tests.yml
+++ b/vendor/mpdf/mpdf/.github/workflows/tests.yml
@@ -36,7 +36,7 @@ jobs:
steps:
- name: "Checkout"
- uses: "actions/checkout@v3"
+ uses: "actions/checkout@v4"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
diff --git a/vendor/mpdf/mpdf/CHANGELOG.md b/vendor/mpdf/mpdf/CHANGELOG.md
index 5d1d402c..a05d6508 100644
--- a/vendor/mpdf/mpdf/CHANGELOG.md
+++ b/vendor/mpdf/mpdf/CHANGELOG.md
@@ -6,6 +6,12 @@ New features
* Watermark text can now be colored using \Mpdf\Watermark DTO. \Mpdf\WatermarkImage DTO for images. (#1876)
* Added support for `psr/http-message` v2 without dropping v1. (@markdorison, @apotek, @greg-1-anderson, @NigelCunningham #1907)
* PHP 8.3 support in mPDF 8.2.1
+* Add support for `page-break-before: avoid;` and `page-break-after: avoid;` for tr elements inside tables
+
+Bugfixes
+--------
+
+* Replace character entities with characters when processing the `code` attribute in the `` tag
mPDF 8.1.x
===========================
diff --git a/vendor/mpdf/mpdf/src/Color/ColorConverter.php b/vendor/mpdf/mpdf/src/Color/ColorConverter.php
index 1af7aa92..9cb59ea4 100644
--- a/vendor/mpdf/mpdf/src/Color/ColorConverter.php
+++ b/vendor/mpdf/mpdf/src/Color/ColorConverter.php
@@ -193,9 +193,8 @@ private function convertPlain($color, array &$PDFAXwarnings = [])
} elseif (strpos($color, '#') === 0) { // case of #nnnnnn or #nnn
$c = $this->processHashColor($color);
} elseif (preg_match('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\((.*?)\)/', $color, $m)) {
- // quickfix for color containing CSS variable
- preg_match('/var\(--([a-z-_]+)\)/i', $m[0], $var);
- if ($var) {
+ // ignore colors containing CSS variables
+ if (str_starts_with(mb_strtolower($m[2]), 'var(--')) {
$m[2] = '0, 0, 0, 100';
}
$c = $this->processModeColor($m[1], explode(',', $m[2]));
diff --git a/vendor/mpdf/mpdf/src/Mpdf.php b/vendor/mpdf/mpdf/src/Mpdf.php
index bafda4cb..280dcb6e 100644
--- a/vendor/mpdf/mpdf/src/Mpdf.php
+++ b/vendor/mpdf/mpdf/src/Mpdf.php
@@ -32,7 +32,7 @@ class Mpdf implements \Psr\Log\LoggerAwareInterface
use FpdiTrait;
use MpdfPsrLogAwareTrait;
- const VERSION = '8.2.2';
+ const VERSION = '8.2.4';
const SCALE = 72 / 25.4;
@@ -7286,7 +7286,7 @@ function printobjectbuffer($is_table = false, $blockdir = false)
$translate_x = $this->sizeConverter->convert($vv[0], $maxsize_x, false, false);
$tr2 .= $this->transformTranslate($translate_x, 0, true) . ' ';
} elseif ($c == 'translatey' && count($vv)) {
- $translate_y = $this->sizeConverter->convert($vv[1], $maxsize_y, false, false);
+ $translate_y = $this->sizeConverter->convert($vv[0], $maxsize_y, false, false);
$tr2 .= $this->transformTranslate(0, $translate_y, true) . ' ';
} elseif ($c == 'scale' && count($vv)) {
$scale_x = $vv[0] * 100;
@@ -7300,7 +7300,7 @@ function printobjectbuffer($is_table = false, $blockdir = false)
$scale_x = $vv[0] * 100;
$tr2 .= $this->transformScale($scale_x, 0, $cx, $cy, true) . ' ';
} elseif ($c == 'scaley' && count($vv)) {
- $scale_y = $vv[1] * 100;
+ $scale_y = $vv[0] * 100;
$tr2 .= $this->transformScale(0, $scale_y, $cx, $cy, true) . ' ';
} elseif ($c == 'skew' && count($vv)) {
$angle_x = $this->ConvertAngle($vv[0], false);
@@ -13231,7 +13231,7 @@ function Footer()
/* -- WATERMARK -- */
if (($this->watermarkText) && ($this->showWatermarkText)) {
- $this->watermark($this->watermarkText, $this->watermarkAngle, 120, $this->watermarkTextAlpha); // Watermark text
+ $this->watermark($this->watermarkText, $this->watermarkAngle, is_int($this->watermark_size) ? $this->watermark_size : 120, $this->watermarkTextAlpha); // Watermark text
}
if (($this->watermarkImage) && ($this->showWatermarkImage)) {
$this->watermarkImg($this->watermarkImage, $this->watermarkImageAlpha); // Watermark image
@@ -16088,10 +16088,9 @@ function printbuffer($arrayaux, $blockstate = 0, $is_table = false, $table_draft
$array_size = count($arrayaux);
}
-
// Remove empty items // mPDF 6
for ($i = $array_size - 1; $i > 0; $i--) {
- if (empty($arrayaux[$i][0]) && (isset($arrayaux[$i][16]) && $arrayaux[$i][16] !== '0') && empty($arrayaux[$i][7])) {
+ if ('' === $arrayaux[$i][0] && (isset($arrayaux[$i][16]) && $arrayaux[$i][16] !== '0') && empty($arrayaux[$i][7])) {
unset($arrayaux[$i]);
}
}
@@ -16138,7 +16137,8 @@ function printbuffer($arrayaux, $blockstate = 0, $is_table = false, $table_draft
}
// FIXED TO ALLOW IT TO SHOW '0'
- if (empty($vetor[0]) && !($vetor[0] === '0') && empty($vetor[7])) { // Ignore empty text and not carrying an internal link
+ if (empty($vetor[0]) && !($vetor[0] === '0') && empty($vetor[7])) {
+ // Ignore empty text and not carrying an internal link
// Check if it is the last element. If so then finish printing the block
if ($i == ($array_size - 1)) {
$this->finishFlowingBlock(true);
@@ -22238,7 +22238,13 @@ function _tableWrite(&$table, $split = false, $startrow = 0, $startcol = 0, $spl
$extra = $table['max_cell_border_width']['B'] / 2;
}
- if ($j == $startcol && ((($y + $maxrowheight + $extra ) > ($pagetrigger + 0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel == 1 && $i < ($numrows - $table['headernrows']))) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) {
+ // lookahead for pagebreak
+ $pagebreaklookahead = 1;
+ while (isset($table['pagebreak-before']) && isset($table['pagebreak-before'][$i + $pagebreaklookahead]) && $table['pagebreak-before'][$i + $pagebreaklookahead] == 'avoid') {
+ // pagebreak-after is mapped to pagebreak-before on i+1 in Tags/Tr.php
+ $pagebreaklookahead++;
+ }
+ if ($j == $startcol && ((($y + $pagebreaklookahead * $maxrowheight + $extra ) > ($pagetrigger + 0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel == 1 && $i < ($numrows - $table['headernrows']))) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) {
if (!$skippage) {
$finalSpread = true;
$firstSpread = true;
diff --git a/vendor/mpdf/mpdf/src/Otl.php b/vendor/mpdf/mpdf/src/Otl.php
index 4a61bc29..a89fd92a 100644
--- a/vendor/mpdf/mpdf/src/Otl.php
+++ b/vendor/mpdf/mpdf/src/Otl.php
@@ -1539,6 +1539,10 @@ function _applyGSUBrulesIndic($usetags, $scriptTag, $langsys, $is_old_spec)
continue;
}
+ if (!isset($this->OTLdata[$ptr + 1])) {
+ continue;
+ }
+
$nextGlyph = $this->OTLdata[$ptr + 1]['hex'];
$nextGID = $this->OTLdata[$ptr + 1]['uni'];
if (isset($this->GSLuCoverage[$lu][$c][$nextGID])) {
diff --git a/vendor/mpdf/mpdf/src/Tag/BarCode.php b/vendor/mpdf/mpdf/src/Tag/BarCode.php
index a1c38e34..40bf5dc4 100644
--- a/vendor/mpdf/mpdf/src/Tag/BarCode.php
+++ b/vendor/mpdf/mpdf/src/Tag/BarCode.php
@@ -33,7 +33,7 @@ public function open($attr, &$ahtml, &$ihtml)
$objattr['border_bottom']['w'] = 0;
$objattr['border_left']['w'] = 0;
$objattr['border_right']['w'] = 0;
- $objattr['code'] = $attr['CODE'];
+ $objattr['code'] = htmlspecialchars_decode($attr['CODE']);
if (isset($attr['TYPE'])) {
$objattr['btype'] = strtoupper(trim($attr['TYPE']));
diff --git a/vendor/mpdf/mpdf/src/Tag/BlockTag.php b/vendor/mpdf/mpdf/src/Tag/BlockTag.php
index 495661a6..7f2ba763 100644
--- a/vendor/mpdf/mpdf/src/Tag/BlockTag.php
+++ b/vendor/mpdf/mpdf/src/Tag/BlockTag.php
@@ -247,7 +247,7 @@ public function open($attr, &$ahtml, &$ihtml)
/* -- END CSS-PAGE -- */
// If page-box has changed AND/OR PAGE-BREAK-BEFORE
- // mPDF 6 (uses $p - preview of properties so blklvl can be imcremented after page-break)
+ // mPDF 6 (uses $p - preview of properties so blklvl can be incremented after page-break)
if (!$this->mpdf->tableLevel && (($pagesel && (!$this->mpdf->page_box['current'] || $pagesel != $this->mpdf->page_box['current']))
|| (isset($p['PAGE-BREAK-BEFORE']) && $p['PAGE-BREAK-BEFORE']))) {
// mPDF 6 pagebreaktype
diff --git a/vendor/mpdf/mpdf/src/Tag/Option.php b/vendor/mpdf/mpdf/src/Tag/Option.php
index c5233d1d..04221d0f 100644
--- a/vendor/mpdf/mpdf/src/Tag/Option.php
+++ b/vendor/mpdf/mpdf/src/Tag/Option.php
@@ -27,7 +27,8 @@ public function open($attr, &$ahtml, &$ihtml)
$attr['VALUE'] = mb_convert_encoding($attr['VALUE'], $this->mpdf->mb_enc, 'UTF-8');
}
}
- $this->mpdf->selectoption['currentVAL'] = $attr['VALUE'];
+
+ $this->mpdf->selectoption['currentVAL'] = isset($attr['VALUE']) ? $attr['VALUE'] : $ahtml[$ihtml + 1];
}
public function close(&$ahtml, &$ihtml)
diff --git a/vendor/mpdf/mpdf/src/Tag/Tr.php b/vendor/mpdf/mpdf/src/Tag/Tr.php
index 24b7749b..1e9bdc6b 100644
--- a/vendor/mpdf/mpdf/src/Tag/Tr.php
+++ b/vendor/mpdf/mpdf/src/Tag/Tr.php
@@ -17,6 +17,17 @@ public function open($attr, &$ahtml, &$ihtml)
$this->mpdf->col = -1;
$properties = $this->cssManager->MergeCSS('TABLE', 'TR', $attr);
+ // write pagebreak markers into row list, so _tableWrite can respect it
+ if (isset($properties['PAGE-BREAK-BEFORE']) && strtoupper($properties['PAGE-BREAK-BEFORE']) === 'AVOID'
+ && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) {
+ $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['pagebreak-before'][$this->mpdf->row] = 'avoid';
+ }
+
+ if (isset($properties['PAGE-BREAK-AFTER']) && strtoupper($properties['PAGE-BREAK-AFTER']) === 'AVOID'
+ && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) {
+ $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['pagebreak-before'][$this->mpdf->row + 1] = 'avoid';
+ }
+
if (!$this->mpdf->simpleTables && (!isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate'])
|| !$this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate'])) {
if (!empty($properties['BORDER-LEFT'])) {
diff --git a/vendor/mpdf/mpdf/src/Writer/MetadataWriter.php b/vendor/mpdf/mpdf/src/Writer/MetadataWriter.php
index 8590e4c0..0cadadaf 100644
--- a/vendor/mpdf/mpdf/src/Writer/MetadataWriter.php
+++ b/vendor/mpdf/mpdf/src/Writer/MetadataWriter.php
@@ -50,18 +50,19 @@ public function writeMetadata() // _putmetadata
{
$this->writer->object();
$this->mpdf->MetadataRoot = $this->mpdf->n;
- $Producer = 'mPDF' . ($this->mpdf->exposeVersion ? (' ' . Mpdf::VERSION) : '');
+
$z = date('O'); // +0200
$offset = substr($z, 0, 3) . ':' . substr($z, 3, 2);
+
$CreationDate = date('Y-m-d\TH:i:s') . $offset; // 2006-03-10T10:47:26-05:00 2006-06-19T09:05:17Z
- $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0x0fff) | 0x4000, random_int(0, 0x3fff) | 0x8000, random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff));
+ $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0x0fff) | 0x4000, random_int(0, 0x3fff) | 0x8000, random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff));
$m = '' . "\n"; // begin = FEFF BOM
$m .= ' ' . "\n";
$m .= ' ' . "\n";
$m .= ' ' . "\n";
- $m .= ' ' . $Producer . '' . "\n";
+ $m .= ' ' . $this->getProducerString() . '' . "\n";
if (!empty($this->mpdf->keywords)) {
$m .= ' ' . $this->mpdf->keywords . '' . "\n";
}
@@ -147,7 +148,7 @@ public function writeMetadata() // _putmetadata
public function writeInfo() // _putinfo
{
- $this->writer->write('/Producer ' . $this->writer->utf16BigEndianTextString('mPDF' . ($this->mpdf->exposeVersion ? (' ' . $this->getVersionString()) : '')));
+ $this->writer->write('/Producer ' . $this->writer->utf16BigEndianTextString($this->getProducerString()));
if (!empty($this->mpdf->title)) {
$this->writer->write('/Title ' . $this->writer->utf16BigEndianTextString($this->mpdf->title));
@@ -824,4 +825,9 @@ private function getVersionString()
return $return;
}
+ private function getProducerString()
+ {
+ return 'mPDF' . ($this->mpdf->exposeVersion ? (' ' . $this->getVersionString()) : '');
+ }
+
}
diff --git a/vendor/mpdf/psr-log-aware-trait/composer.json b/vendor/mpdf/psr-log-aware-trait/composer.json
index 1abd3f6f..daf1c388 100644
--- a/vendor/mpdf/psr-log-aware-trait/composer.json
+++ b/vendor/mpdf/psr-log-aware-trait/composer.json
@@ -3,7 +3,7 @@
"description": "Trait to allow support of different psr/log versions.",
"type": "library",
"require": {
- "psr/log": "^3.0"
+ "psr/log": "^1.0 || ^2.0"
},
"license": "MIT",
"autoload": {
diff --git a/vendor/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php b/vendor/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php
index b4e5b7d5..4900229e 100644
--- a/vendor/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php
+++ b/vendor/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php
@@ -12,7 +12,7 @@ trait MpdfPsrLogAwareTrait
*/
protected $logger;
- public function setLogger(LoggerInterface $logger): void
+ public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
if (property_exists($this, 'services') && is_array($this->services)) {
diff --git a/vendor/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php b/vendor/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php
index a0fcb3a5..e2db69c3 100644
--- a/vendor/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php
+++ b/vendor/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php
@@ -12,7 +12,7 @@ trait PsrLogAwareTrait
*/
protected $logger;
- public function setLogger(LoggerInterface $logger): void
+ public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
diff --git a/vendor/myclabs/deep-copy/.github/FUNDING.yml b/vendor/myclabs/deep-copy/.github/FUNDING.yml
deleted file mode 100644
index b8da664d..00000000
--- a/vendor/myclabs/deep-copy/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: "packagist/myclabs/deep-copy"
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/vendor/myclabs/deep-copy/.github/workflows/ci.yaml b/vendor/myclabs/deep-copy/.github/workflows/ci.yaml
deleted file mode 100644
index eac2812e..00000000
--- a/vendor/myclabs/deep-copy/.github/workflows/ci.yaml
+++ /dev/null
@@ -1,101 +0,0 @@
-name: "Continuous Integration"
-
-on:
- - pull_request
- - push
-
-env:
- COMPOSER_ROOT_VERSION: 1.99
-
-jobs:
- composer-json-lint:
- name: "Lint composer.json"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "8.1"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@v2"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
- tools: composer-normalize
-
- - name: "Get composer cache directory"
- id: composercache
- run: echo "::set-output name=dir::$(composer config cache-files-dir)"
-
- - name: "Cache dependencies"
- uses: actions/cache@v2
- with:
- path: ${{ steps.composercache.outputs.dir }}
- key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress"
-
- - name: "Validate composer.json"
- run: "composer validate --strict"
-
- - name: "Normalize composer.json"
- run: "composer-normalize --dry-run"
-
- tests:
- name: "Tests"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
- - "8.0"
- - "8.1"
- dependencies:
- - "lowest"
- - "highest"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@v2"
- with:
- php-version: "${{ matrix.php-version }}"
- ini-values: zend.assertions=1
-
- - name: "Get composer cache directory"
- id: composercache
- run: echo "::set-output name=dir::$(composer config cache-files-dir)"
-
- - name: "Cache dependencies"
- uses: actions/cache@v2
- with:
- path: ${{ steps.composercache.outputs.dir }}
- key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-
-
- - name: "Install lowest dependencies"
- if: ${{ matrix.dependencies == 'lowest' }}
- run: "composer update --no-interaction --no-progress --prefer-lowest"
-
- - name: "Install highest dependencies"
- if: ${{ matrix.dependencies == 'highest' }}
- run: "composer update --no-interaction --no-progress"
-
- - name: "Run tests"
- timeout-minutes: 3
- run: "vendor/bin/phpunit"
diff --git a/vendor/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md
index 94aaa06d..88ae14cc 100644
--- a/vendor/myclabs/deep-copy/README.md
+++ b/vendor/myclabs/deep-copy/README.md
@@ -3,7 +3,7 @@
DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph.
[](https://packagist.org/packages/myclabs/deep-copy)
-[](https://github.com/myclabs/DeepCopy/actions)
+[](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml)
## Table of Contents
diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json
index 66fb34a5..f115fff8 100644
--- a/vendor/myclabs/deep-copy/composer.json
+++ b/vendor/myclabs/deep-copy/composer.json
@@ -16,11 +16,12 @@
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"autoload": {
"psr-4": {
@@ -32,8 +33,8 @@
},
"autoload-dev": {
"psr-4": {
- "DeepCopy\\": "fixtures/",
- "DeepCopyTest\\": "tests/DeepCopyTest/"
+ "DeepCopyTest\\": "tests/DeepCopyTest/",
+ "DeepCopy\\": "fixtures/"
}
},
"config": {
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
index 6e766d80..084858ee 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
@@ -224,6 +224,11 @@ private function copyObjectProperty($object, ReflectionProperty $property)
return;
}
+ // Ignore readonly properties
+ if (method_exists($property, 'isReadOnly') && $property->isReadOnly()) {
+ return;
+ }
+
// Apply the filters
foreach ($this->filters as $item) {
/** @var Matcher $matcher */
diff --git a/vendor/psr/http-message/CHANGELOG.md b/vendor/psr/http-message/CHANGELOG.md
new file mode 100644
index 00000000..74b1ef92
--- /dev/null
+++ b/vendor/psr/http-message/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1 - 2016-08-06
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Updated all `@return self` annotation references in interfaces to use
+ `@return static`, which more closelly follows the semantics of the
+ specification.
+- Updated the `MessageInterface::getHeaders()` return annotation to use the
+ value `string[][]`, indicating the format is a nested array of strings.
+- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`
+ to point to the correct section of RFC 7230.
+- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation
+ to add the parameter name (`$uploadedFiles`).
+- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`
+ method to correctly reference the method parameter (it was referencing an
+ incorrect parameter name previously).
+
+## 1.0.0 - 2016-05-18
+
+Initial stable release; reflects accepted PSR-7 specification.
diff --git a/vendor/psr/http-message/LICENSE b/vendor/psr/http-message/LICENSE
new file mode 100644
index 00000000..c2d8e452
--- /dev/null
+++ b/vendor/psr/http-message/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/psr/http-message/README.md b/vendor/psr/http-message/README.md
new file mode 100644
index 00000000..2668be6c
--- /dev/null
+++ b/vendor/psr/http-message/README.md
@@ -0,0 +1,16 @@
+PSR Http Message
+================
+
+This repository holds all interfaces/classes/traits related to
+[PSR-7](http://www.php-fig.org/psr/psr-7/).
+
+Note that this is not a HTTP message implementation of its own. It is merely an
+interface that describes a HTTP message. See the specification for more details.
+
+Usage
+-----
+
+Before reading the usage guide we recommend reading the PSR-7 interfaces method list:
+
+* [`PSR-7 Interfaces Method List`](docs/PSR7-Interfaces.md)
+* [`PSR-7 Usage Guide`](docs/PSR7-Usage.md)
\ No newline at end of file
diff --git a/vendor/psr/http-message/composer.json b/vendor/psr/http-message/composer.json
new file mode 100644
index 00000000..c66e5aba
--- /dev/null
+++ b/vendor/psr/http-message/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "psr/http-message",
+ "description": "Common interface for HTTP messages",
+ "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"],
+ "homepage": "https://github.com/php-fig/http-message",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ }
+}
diff --git a/vendor/psr/http-message/docs/PSR7-Interfaces.md b/vendor/psr/http-message/docs/PSR7-Interfaces.md
new file mode 100644
index 00000000..3a7e7dda
--- /dev/null
+++ b/vendor/psr/http-message/docs/PSR7-Interfaces.md
@@ -0,0 +1,130 @@
+# Interfaces
+
+The purpose of this list is to help in finding the methods when working with PSR-7. This can be considered as a cheatsheet for PSR-7 interfaces.
+
+The interfaces defined in PSR-7 are the following:
+
+| Class Name | Description |
+|---|---|
+| [Psr\Http\Message\MessageInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagemessageinterface) | Representation of a HTTP message |
+| [Psr\Http\Message\RequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagerequestinterface) | Representation of an outgoing, client-side request. |
+| [Psr\Http\Message\ServerRequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageserverrequestinterface) | Representation of an incoming, server-side HTTP request. |
+| [Psr\Http\Message\ResponseInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageresponseinterface) | Representation of an outgoing, server-side response. |
+| [Psr\Http\Message\StreamInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagestreaminterface) | Describes a data stream |
+| [Psr\Http\Message\UriInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuriinterface) | Value object representing a URI. |
+| [Psr\Http\Message\UploadedFileInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuploadedfileinterface) | Value object representing a file uploaded through an HTTP request. |
+
+## `Psr\Http\Message\MessageInterface` Methods
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getProtocolVersion()` | Retrieve HTTP protocol version | 1.0 or 1.1 |
+| `withProtocolVersion($version)` | Returns new message instance with given HTTP protocol version | |
+| `getHeaders()` | Retrieve all HTTP Headers | [Request Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields), [Response Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields) |
+| `hasHeader($name)` | Checks if HTTP Header with given name exists | |
+| `getHeader($name)` | Retrieves a array with the values for a single header | |
+| `getHeaderLine($name)` | Retrieves a comma-separated string of the values for a single header | |
+| `withHeader($name, $value)` | Returns new message instance with given HTTP Header | if the header existed in the original instance, replaces the header value from the original message with the value provided when creating the new instance. |
+| `withAddedHeader($name, $value)` | Returns new message instance with appended value to given header | If header already exists value will be appended, if not a new header will be created |
+| `withoutHeader($name)` | Removes HTTP Header with given name| |
+| `getBody()` | Retrieves the HTTP Message Body | Returns object implementing `StreamInterface`|
+| `withBody(StreamInterface $body)` | Returns new message instance with given HTTP Message Body | |
+
+
+## `Psr\Http\Message\RequestInterface` Methods
+
+Same methods as `Psr\Http\Message\MessageInterface` + the following methods:
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getRequestTarget()` | Retrieves the message's request target | origin-form, absolute-form, authority-form, asterisk-form ([RFC7230](https://www.rfc-editor.org/rfc/rfc7230.txt)) |
+| `withRequestTarget($requestTarget)` | Return a new message instance with the specific request-target | |
+| `getMethod()` | Retrieves the HTTP method of the request. | GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE (defined in [RFC7231](https://tools.ietf.org/html/rfc7231)), PATCH (defined in [RFC5789](https://tools.ietf.org/html/rfc5789)) |
+| `withMethod($method)` | Returns a new message instance with the provided HTTP method | |
+| `getUri()` | Retrieves the URI instance | |
+| `withUri(UriInterface $uri, $preserveHost = false)` | Returns a new message instance with the provided URI | |
+
+
+## `Psr\Http\Message\ServerRequestInterface` Methods
+
+Same methods as `Psr\Http\Message\RequestInterface` + the following methods:
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getServerParams() ` | Retrieve server parameters | Typically derived from `$_SERVER` |
+| `getCookieParams()` | Retrieves cookies sent by the client to the server. | Typically derived from `$_COOKIES` |
+| `withCookieParams(array $cookies)` | Returns a new request instance with the specified cookies | |
+| `withQueryParams(array $query)` | Returns a new request instance with the specified query string arguments | |
+| `getUploadedFiles()` | Retrieve normalized file upload data | |
+| `withUploadedFiles(array $uploadedFiles)` | Returns a new request instance with the specified uploaded files | |
+| `getParsedBody()` | Retrieve any parameters provided in the request body | |
+| `withParsedBody($data)` | Returns a new request instance with the specified body parameters | |
+| `getAttributes()` | Retrieve attributes derived from the request | |
+| `getAttribute($name, $default = null)` | Retrieve a single derived request attribute | |
+| `withAttribute($name, $value)` | Returns a new request instance with the specified derived request attribute | |
+| `withoutAttribute($name)` | Returns a new request instance that without the specified derived request attribute | |
+
+## `Psr\Http\Message\ResponseInterface` Methods:
+
+Same methods as `Psr\Http\Message\MessageInterface` + the following methods:
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getStatusCode()` | Gets the response status code. | |
+| `withStatus($code, $reasonPhrase = '')` | Returns a new response instance with the specified status code and, optionally, reason phrase. | |
+| `getReasonPhrase()` | Gets the response reason phrase associated with the status code. | |
+
+## `Psr\Http\Message\StreamInterface` Methods
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `__toString()` | Reads all data from the stream into a string, from the beginning to end. | |
+| `close()` | Closes the stream and any underlying resources. | |
+| `detach()` | Separates any underlying resources from the stream. | |
+| `getSize()` | Get the size of the stream if known. | |
+| `eof()` | Returns true if the stream is at the end of the stream.| |
+| `isSeekable()` | Returns whether or not the stream is seekable. | |
+| `seek($offset, $whence = SEEK_SET)` | Seek to a position in the stream. | |
+| `rewind()` | Seek to the beginning of the stream. | |
+| `isWritable()` | Returns whether or not the stream is writable. | |
+| `write($string)` | Write data to the stream. | |
+| `isReadable()` | Returns whether or not the stream is readable. | |
+| `read($length)` | Read data from the stream. | |
+| `getContents()` | Returns the remaining contents in a string | |
+| `getMetadata($key = null)()` | Get stream metadata as an associative array or retrieve a specific key. | |
+
+## `Psr\Http\Message\UriInterface` Methods
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getScheme()` | Retrieve the scheme component of the URI. | |
+| `getAuthority()` | Retrieve the authority component of the URI. | |
+| `getUserInfo()` | Retrieve the user information component of the URI. | |
+| `getHost()` | Retrieve the host component of the URI. | |
+| `getPort()` | Retrieve the port component of the URI. | |
+| `getPath()` | Retrieve the path component of the URI. | |
+| `getQuery()` | Retrieve the query string of the URI. | |
+| `getFragment()` | Retrieve the fragment component of the URI. | |
+| `withScheme($scheme)` | Return an instance with the specified scheme. | |
+| `withUserInfo($user, $password = null)` | Return an instance with the specified user information. | |
+| `withHost($host)` | Return an instance with the specified host. | |
+| `withPort($port)` | Return an instance with the specified port. | |
+| `withPath($path)` | Return an instance with the specified path. | |
+| `withQuery($query)` | Return an instance with the specified query string. | |
+| `withFragment($fragment)` | Return an instance with the specified URI fragment. | |
+| `__toString()` | Return the string representation as a URI reference. | |
+
+## `Psr\Http\Message\UploadedFileInterface` Methods
+
+| Method Name | Description | Notes |
+|------------------------------------| ----------- | ----- |
+| `getStream()` | Retrieve a stream representing the uploaded file. | |
+| `moveTo($targetPath)` | Move the uploaded file to a new location. | |
+| `getSize()` | Retrieve the file size. | |
+| `getError()` | Retrieve the error associated with the uploaded file. | |
+| `getClientFilename()` | Retrieve the filename sent by the client. | |
+| `getClientMediaType()` | Retrieve the media type sent by the client. | |
+
+> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`.
+> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered.
+
diff --git a/vendor/psr/http-message/docs/PSR7-Usage.md b/vendor/psr/http-message/docs/PSR7-Usage.md
new file mode 100644
index 00000000..b6d048a3
--- /dev/null
+++ b/vendor/psr/http-message/docs/PSR7-Usage.md
@@ -0,0 +1,159 @@
+### PSR-7 Usage
+
+All PSR-7 applications comply with these interfaces
+They were created to establish a standard between middleware implementations.
+
+> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`.
+> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered.
+
+
+The following examples will illustrate how basic operations are done in PSR-7.
+
+##### Examples
+
+
+For this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc)
+All PSR-7 implementations should have the same behaviour.
+
+The following will be assumed:
+`$request` is an object of `Psr\Http\Message\RequestInterface` and
+
+`$response` is an object implementing `Psr\Http\Message\RequestInterface`
+
+
+### Working with HTTP Headers
+
+#### Adding headers to response:
+
+```php
+$response->withHeader('My-Custom-Header', 'My Custom Message');
+```
+
+#### Appending values to headers
+
+```php
+$response->withAddedHeader('My-Custom-Header', 'The second message');
+```
+
+#### Checking if header exists:
+
+```php
+$request->hasHeader('My-Custom-Header'); // will return false
+$response->hasHeader('My-Custom-Header'); // will return true
+```
+
+> Note: My-Custom-Header was only added in the Response
+
+#### Getting comma-separated values from a header (also applies to request)
+
+```php
+// getting value from request headers
+$request->getHeaderLine('Content-Type'); // will return: "text/html; charset=UTF-8"
+// getting value from response headers
+$response->getHeaderLine('My-Custom-Header'); // will return: "My Custom Message; The second message"
+```
+
+#### Getting array of value from a header (also applies to request)
+```php
+// getting value from request headers
+$request->getHeader('Content-Type'); // will return: ["text/html", "charset=UTF-8"]
+// getting value from response headers
+$response->getHeader('My-Custom-Header'); // will return: ["My Custom Message", "The second message"]
+```
+
+#### Removing headers from HTTP Messages
+```php
+// removing a header from Request, removing deprecated "Content-MD5" header
+$request->withoutHeader('Content-MD5');
+
+// removing a header from Response
+// effect: the browser won't know the size of the stream
+// the browser will download the stream till it ends
+$response->withoutHeader('Content-Length');
+```
+
+### Working with HTTP Message Body
+
+When working with the PSR-7 there are two methods of implementation:
+#### 1. Getting the body separately
+
+> This method makes the body handling easier to understand and is useful when repeatedly calling body methods. (You only call `getBody()` once). Using this method mistakes like `$response->write()` are also prevented.
+
+```php
+$body = $response->getBody();
+// operations on body, eg. read, write, seek
+// ...
+// replacing the old body
+$response->withBody($body);
+// this last statement is optional as we working with objects
+// in this case the "new" body is same with the "old" one
+// the $body variable has the same value as the one in $request, only the reference is passed
+```
+
+#### 2. Working directly on response
+
+> This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required
+
+```php
+$response->getBody()->write('hello');
+```
+
+### Getting the body contents
+
+The following snippet gets the contents of a stream contents.
+> Note: Streams must be rewinded, if content was written into streams, it will be ignored when calling `getContents()` because the stream pointer is set to the last character, which is `\0` - meaning end of stream.
+```php
+$body = $response->getBody();
+$body->rewind(); // or $body->seek(0);
+$bodyText = $body->getContents();
+```
+> Note: If `$body->seek(1)` is called before `$body->getContents()`, the first character will be ommited as the starting pointer is set to `1`, not `0`. This is why using `$body->rewind()` is recommended.
+
+### Append to body
+
+```php
+$response->getBody()->write('Hello'); // writing directly
+$body = $request->getBody(); // which is a `StreamInterface`
+$body->write('xxxxx');
+```
+
+### Prepend to body
+Prepending is different when it comes to streams. The content must be copied before writing the content to be prepended.
+The following example will explain the behaviour of streams.
+
+```php
+// assuming our response is initially empty
+$body = $repsonse->getBody();
+// writing the string "abcd"
+$body->write('abcd');
+
+// seeking to start of stream
+$body->seek(0);
+// writing 'ef'
+$body->write('ef'); // at this point the stream contains "efcd"
+```
+
+#### Prepending by rewriting separately
+
+```php
+// assuming our response body stream only contains: "abcd"
+$body = $response->getBody();
+$body->rewind();
+$contents = $body->getContents(); // abcd
+// seeking the stream to beginning
+$body->rewind();
+$body->write('ef'); // stream contains "efcd"
+$body->write($contents); // stream contains "efabcd"
+```
+
+> Note: `getContents()` seeks the stream while reading it, therefore if the second `rewind()` method call was not present the stream would have resulted in `abcdefabcd` because the `write()` method appends to stream if not preceeded by `rewind()` or `seek(0)`.
+
+#### Prepending by using contents as a string
+```php
+$body = $response->getBody();
+$body->rewind();
+$contents = $body->getContents(); // efabcd
+$contents = 'ef'.$contents;
+$body->rewind();
+$body->write($contents);
+```
diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php
new file mode 100644
index 00000000..a83c9851
--- /dev/null
+++ b/vendor/psr/http-message/src/MessageInterface.php
@@ -0,0 +1,187 @@
+getHeaders() as $name => $values) {
+ * echo $name . ": " . implode(", ", $values);
+ * }
+ *
+ * // Emit headers iteratively:
+ * foreach ($message->getHeaders() as $name => $values) {
+ * foreach ($values as $value) {
+ * header(sprintf('%s: %s', $name, $value), false);
+ * }
+ * }
+ *
+ * While header names are not case-sensitive, getHeaders() will preserve the
+ * exact case in which headers were originally specified.
+ *
+ * @return string[][] Returns an associative array of the message's headers. Each
+ * key MUST be a header name, and each value MUST be an array of strings
+ * for that header.
+ */
+ public function getHeaders(): array;
+
+ /**
+ * Checks if a header exists by the given case-insensitive name.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return bool Returns true if any header names match the given header
+ * name using a case-insensitive string comparison. Returns false if
+ * no matching header name is found in the message.
+ */
+ public function hasHeader(string $name): bool;
+
+ /**
+ * Retrieves a message header value by the given case-insensitive name.
+ *
+ * This method returns an array of all the header values of the given
+ * case-insensitive header name.
+ *
+ * If the header does not appear in the message, this method MUST return an
+ * empty array.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string[] An array of string values as provided for the given
+ * header. If the header does not appear in the message, this method MUST
+ * return an empty array.
+ */
+ public function getHeader(string $name): array;
+
+ /**
+ * Retrieves a comma-separated string of the values for a single header.
+ *
+ * This method returns all of the header values of the given
+ * case-insensitive header name as a string concatenated together using
+ * a comma.
+ *
+ * NOTE: Not all header values may be appropriately represented using
+ * comma concatenation. For such headers, use getHeader() instead
+ * and supply your own delimiter when concatenating.
+ *
+ * If the header does not appear in the message, this method MUST return
+ * an empty string.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string A string of values as provided for the given header
+ * concatenated together using a comma. If the header does not appear in
+ * the message, this method MUST return an empty string.
+ */
+ public function getHeaderLine(string $name): string;
+
+ /**
+ * Return an instance with the provided value replacing the specified header.
+ *
+ * While header names are case-insensitive, the casing of the header will
+ * be preserved by this function, and returned from getHeaders().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new and/or updated header and value.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withHeader(string $name, $value): MessageInterface;
+
+ /**
+ * Return an instance with the specified header appended with the given value.
+ *
+ * Existing values for the specified header will be maintained. The new
+ * value(s) will be appended to the existing list. If the header did not
+ * exist previously, it will be added.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new header and/or value.
+ *
+ * @param string $name Case-insensitive header field name to add.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withAddedHeader(string $name, $value): MessageInterface;
+
+ /**
+ * Return an instance without the specified header.
+ *
+ * Header resolution MUST be done without case-sensitivity.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the named header.
+ *
+ * @param string $name Case-insensitive header field name to remove.
+ * @return static
+ */
+ public function withoutHeader(string $name): MessageInterface;
+
+ /**
+ * Gets the body of the message.
+ *
+ * @return StreamInterface Returns the body as a stream.
+ */
+ public function getBody(): StreamInterface;
+
+ /**
+ * Return an instance with the specified message body.
+ *
+ * The body MUST be a StreamInterface object.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return a new instance that has the
+ * new body stream.
+ *
+ * @param StreamInterface $body Body.
+ * @return static
+ * @throws \InvalidArgumentException When the body is not valid.
+ */
+ public function withBody(StreamInterface $body): MessageInterface;
+}
diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php
new file mode 100644
index 00000000..33f85e55
--- /dev/null
+++ b/vendor/psr/http-message/src/RequestInterface.php
@@ -0,0 +1,130 @@
+getQuery()`
+ * or from the `QUERY_STRING` server param.
+ *
+ * @return array
+ */
+ public function getQueryParams(): array;
+
+ /**
+ * Return an instance with the specified query string arguments.
+ *
+ * These values SHOULD remain immutable over the course of the incoming
+ * request. They MAY be injected during instantiation, such as from PHP's
+ * $_GET superglobal, or MAY be derived from some other value such as the
+ * URI. In cases where the arguments are parsed from the URI, the data
+ * MUST be compatible with what PHP's parse_str() would return for
+ * purposes of how duplicate query parameters are handled, and how nested
+ * sets are handled.
+ *
+ * Setting query string arguments MUST NOT change the URI stored by the
+ * request, nor the values in the server params.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated query string arguments.
+ *
+ * @param array $query Array of query string arguments, typically from
+ * $_GET.
+ * @return static
+ */
+ public function withQueryParams(array $query): ServerRequestInterface;
+
+ /**
+ * Retrieve normalized file upload data.
+ *
+ * This method returns upload metadata in a normalized tree, with each leaf
+ * an instance of Psr\Http\Message\UploadedFileInterface.
+ *
+ * These values MAY be prepared from $_FILES or the message body during
+ * instantiation, or MAY be injected via withUploadedFiles().
+ *
+ * @return array An array tree of UploadedFileInterface instances; an empty
+ * array MUST be returned if no data is present.
+ */
+ public function getUploadedFiles(): array;
+
+ /**
+ * Create a new instance with the specified uploaded files.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+ * @return static
+ * @throws \InvalidArgumentException if an invalid structure is provided.
+ */
+ public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface;
+
+ /**
+ * Retrieve any parameters provided in the request body.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, this method MUST
+ * return the contents of $_POST.
+ *
+ * Otherwise, this method may return any results of deserializing
+ * the request body content; as parsing returns structured content, the
+ * potential types MUST be arrays or objects only. A null value indicates
+ * the absence of body content.
+ *
+ * @return null|array|object The deserialized body parameters, if any.
+ * These will typically be an array or object.
+ */
+ public function getParsedBody();
+
+ /**
+ * Return an instance with the specified body parameters.
+ *
+ * These MAY be injected during instantiation.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, use this method
+ * ONLY to inject the contents of $_POST.
+ *
+ * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+ * deserializing the request body content. Deserialization/parsing returns
+ * structured data, and, as such, this method ONLY accepts arrays or objects,
+ * or a null value if nothing was available to parse.
+ *
+ * As an example, if content negotiation determines that the request data
+ * is a JSON payload, this method could be used to create a request
+ * instance with the deserialized parameters.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param null|array|object $data The deserialized body data. This will
+ * typically be in an array or object.
+ * @return static
+ * @throws \InvalidArgumentException if an unsupported argument type is
+ * provided.
+ */
+ public function withParsedBody($data): ServerRequestInterface;
+
+ /**
+ * Retrieve attributes derived from the request.
+ *
+ * The request "attributes" may be used to allow injection of any
+ * parameters derived from the request: e.g., the results of path
+ * match operations; the results of decrypting cookies; the results of
+ * deserializing non-form-encoded message bodies; etc. Attributes
+ * will be application and request specific, and CAN be mutable.
+ *
+ * @return array Attributes derived from the request.
+ */
+ public function getAttributes(): array;
+
+ /**
+ * Retrieve a single derived request attribute.
+ *
+ * Retrieves a single derived request attribute as described in
+ * getAttributes(). If the attribute has not been previously set, returns
+ * the default value as provided.
+ *
+ * This method obviates the need for a hasAttribute() method, as it allows
+ * specifying a default value to return if the attribute is not found.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $default Default value to return if the attribute does not exist.
+ * @return mixed
+ */
+ public function getAttribute(string $name, $default = null);
+
+ /**
+ * Return an instance with the specified derived request attribute.
+ *
+ * This method allows setting a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $value The value of the attribute.
+ * @return static
+ */
+ public function withAttribute(string $name, $value): ServerRequestInterface;
+
+ /**
+ * Return an instance that removes the specified derived request attribute.
+ *
+ * This method allows removing a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @return static
+ */
+ public function withoutAttribute(string $name): ServerRequestInterface;
+}
diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php
new file mode 100644
index 00000000..a62aabb8
--- /dev/null
+++ b/vendor/psr/http-message/src/StreamInterface.php
@@ -0,0 +1,158 @@
+
+ * [user-info@]host[:port]
+ *
+ *
+ * If the port component is not set or is the standard port for the current
+ * scheme, it SHOULD NOT be included.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2
+ * @return string The URI authority, in "[user-info@]host[:port]" format.
+ */
+ public function getAuthority(): string;
+
+ /**
+ * Retrieve the user information component of the URI.
+ *
+ * If no user information is present, this method MUST return an empty
+ * string.
+ *
+ * If a user is present in the URI, this will return that value;
+ * additionally, if the password is also present, it will be appended to the
+ * user value, with a colon (":") separating the values.
+ *
+ * The trailing "@" character is not part of the user information and MUST
+ * NOT be added.
+ *
+ * @return string The URI user information, in "username[:password]" format.
+ */
+ public function getUserInfo(): string;
+
+ /**
+ * Retrieve the host component of the URI.
+ *
+ * If no host is present, this method MUST return an empty string.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.2.2.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @return string The URI host.
+ */
+ public function getHost(): string;
+
+ /**
+ * Retrieve the port component of the URI.
+ *
+ * If a port is present, and it is non-standard for the current scheme,
+ * this method MUST return it as an integer. If the port is the standard port
+ * used with the current scheme, this method SHOULD return null.
+ *
+ * If no port is present, and no scheme is present, this method MUST return
+ * a null value.
+ *
+ * If no port is present, but a scheme is present, this method MAY return
+ * the standard port for that scheme, but SHOULD return null.
+ *
+ * @return null|int The URI port.
+ */
+ public function getPort(): ?int;
+
+ /**
+ * Retrieve the path component of the URI.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Normally, the empty path "" and absolute path "/" are considered equal as
+ * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+ * do this normalization because in contexts with a trimmed base path, e.g.
+ * the front controller, this difference becomes significant. It's the task
+ * of the user to handle both "" and "/".
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.3.
+ *
+ * As an example, if the value should include a slash ("/") not intended as
+ * delimiter between path segments, that value MUST be passed in encoded
+ * form (e.g., "%2F") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.3
+ * @return string The URI path.
+ */
+ public function getPath(): string;
+
+ /**
+ * Retrieve the query string of the URI.
+ *
+ * If no query string is present, this method MUST return an empty string.
+ *
+ * The leading "?" character is not part of the query and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.4.
+ *
+ * As an example, if a value in a key/value pair of the query string should
+ * include an ampersand ("&") not intended as a delimiter between values,
+ * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.4
+ * @return string The URI query string.
+ */
+ public function getQuery(): string;
+
+ /**
+ * Retrieve the fragment component of the URI.
+ *
+ * If no fragment is present, this method MUST return an empty string.
+ *
+ * The leading "#" character is not part of the fragment and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.5.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.5
+ * @return string The URI fragment.
+ */
+ public function getFragment(): string;
+
+ /**
+ * Return an instance with the specified scheme.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified scheme.
+ *
+ * Implementations MUST support the schemes "http" and "https" case
+ * insensitively, and MAY accommodate other schemes if required.
+ *
+ * An empty scheme is equivalent to removing the scheme.
+ *
+ * @param string $scheme The scheme to use with the new instance.
+ * @return static A new instance with the specified scheme.
+ * @throws \InvalidArgumentException for invalid or unsupported schemes.
+ */
+ public function withScheme(string $scheme): UriInterface;
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; an empty string for the user is equivalent to removing user
+ * information.
+ *
+ * @param string $user The user name to use for authority.
+ * @param null|string $password The password associated with $user.
+ * @return static A new instance with the specified user information.
+ */
+ public function withUserInfo(string $user, ?string $password = null): UriInterface;
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * An empty host value is equivalent to removing the host.
+ *
+ * @param string $host The hostname to use with the new instance.
+ * @return static A new instance with the specified host.
+ * @throws \InvalidArgumentException for invalid hostnames.
+ */
+ public function withHost(string $host): UriInterface;
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * Implementations MUST raise an exception for ports outside the
+ * established TCP and UDP port ranges.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param null|int $port The port to use with the new instance; a null value
+ * removes the port information.
+ * @return static A new instance with the specified port.
+ * @throws \InvalidArgumentException for invalid ports.
+ */
+ public function withPort(?int $port): UriInterface;
+
+ /**
+ * Return an instance with the specified path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified path.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * If the path is intended to be domain-relative rather than path relative then
+ * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+ * are assumed to be relative to some base path known to the application or
+ * consumer.
+ *
+ * Users can provide both encoded and decoded path characters.
+ * Implementations ensure the correct encoding as outlined in getPath().
+ *
+ * @param string $path The path to use with the new instance.
+ * @return static A new instance with the specified path.
+ * @throws \InvalidArgumentException for invalid paths.
+ */
+ public function withPath(string $path): UriInterface;
+
+ /**
+ * Return an instance with the specified query string.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified query string.
+ *
+ * Users can provide both encoded and decoded query characters.
+ * Implementations ensure the correct encoding as outlined in getQuery().
+ *
+ * An empty query string value is equivalent to removing the query string.
+ *
+ * @param string $query The query string to use with the new instance.
+ * @return static A new instance with the specified query string.
+ * @throws \InvalidArgumentException for invalid query strings.
+ */
+ public function withQuery(string $query): UriInterface;
+
+ /**
+ * Return an instance with the specified URI fragment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified URI fragment.
+ *
+ * Users can provide both encoded and decoded fragment characters.
+ * Implementations ensure the correct encoding as outlined in getFragment().
+ *
+ * An empty fragment value is equivalent to removing the fragment.
+ *
+ * @param string $fragment The fragment to use with the new instance.
+ * @return static A new instance with the specified fragment.
+ */
+ public function withFragment(string $fragment): UriInterface;
+
+ /**
+ * Return the string representation as a URI reference.
+ *
+ * Depending on which components of the URI are present, the resulting
+ * string is either a full URI or relative reference according to RFC 3986,
+ * Section 4.1. The method concatenates the various components of the URI,
+ * using the appropriate delimiters:
+ *
+ * - If a scheme is present, it MUST be suffixed by ":".
+ * - If an authority is present, it MUST be prefixed by "//".
+ * - The path can be concatenated without delimiters. But there are two
+ * cases where the path has to be adjusted to make the URI reference
+ * valid as PHP does not allow to throw an exception in __toString():
+ * - If the path is rootless and an authority is present, the path MUST
+ * be prefixed by "/".
+ * - If the path is starting with more than one "/" and no authority is
+ * present, the starting slashes MUST be reduced to one.
+ * - If a query is present, it MUST be prefixed by "?".
+ * - If a fragment is present, it MUST be prefixed by "#".
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ * @return string
+ */
+ public function __toString(): string;
+}
diff --git a/vendor/psr/log/.gitignore b/vendor/psr/log/.gitignore
new file mode 100644
index 00000000..22d0d82f
--- /dev/null
+++ b/vendor/psr/log/.gitignore
@@ -0,0 +1 @@
+vendor
diff --git a/vendor/psr/log/LICENSE b/vendor/psr/log/LICENSE
new file mode 100644
index 00000000..474c952b
--- /dev/null
+++ b/vendor/psr/log/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/psr/log/Psr/Log/AbstractLogger.php b/vendor/psr/log/Psr/Log/AbstractLogger.php
new file mode 100644
index 00000000..00f90345
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/AbstractLogger.php
@@ -0,0 +1,120 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+}
diff --git a/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/vendor/psr/log/Psr/Log/InvalidArgumentException.php
new file mode 100644
index 00000000..67f852d1
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/InvalidArgumentException.php
@@ -0,0 +1,7 @@
+logger = $logger;
+ }
+}
diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php
new file mode 100644
index 00000000..476bb962
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/LoggerInterface.php
@@ -0,0 +1,114 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ abstract public function log($level, $message, array $context = array());
+}
diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php
new file mode 100644
index 00000000..553a3c59
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/NullLogger.php
@@ -0,0 +1,27 @@
+logger) { }`
+ * blocks.
+ */
+class NullLogger extends AbstractLogger
+{
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ * @return null
+ */
+ public function log($level, $message, array $context = array())
+ {
+ // noop
+ }
+}
diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
new file mode 100644
index 00000000..a9328151
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
@@ -0,0 +1,116 @@
+ "
+ *
+ * Example ->error('Foo') would yield "error Foo"
+ *
+ * @return string[]
+ */
+ abstract function getLogs();
+
+ public function testImplements()
+ {
+ $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
+ }
+
+ /**
+ * @dataProvider provideLevelsAndMessages
+ */
+ public function testLogsAtAllLevels($level, $message)
+ {
+ $logger = $this->getLogger();
+ $logger->{$level}($message, array('user' => 'Bob'));
+ $logger->log($level, $message, array('user' => 'Bob'));
+
+ $expected = array(
+ $level.' message of level '.$level.' with context: Bob',
+ $level.' message of level '.$level.' with context: Bob',
+ );
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function provideLevelsAndMessages()
+ {
+ return array(
+ LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
+ LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
+ LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
+ LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
+ LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
+ LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
+ LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
+ LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
+ );
+ }
+
+ /**
+ * @expectedException Psr\Log\InvalidArgumentException
+ */
+ public function testThrowsOnInvalidLevel()
+ {
+ $logger = $this->getLogger();
+ $logger->log('invalid level', 'Foo');
+ }
+
+ public function testContextReplacement()
+ {
+ $logger = $this->getLogger();
+ $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
+
+ $expected = array('info {Message {nothing} Bob Bar a}');
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function testObjectCastToString()
+ {
+ $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
+ $dummy->expects($this->once())
+ ->method('__toString')
+ ->will($this->returnValue('DUMMY'));
+
+ $this->getLogger()->warning($dummy);
+ }
+
+ public function testContextCanContainAnything()
+ {
+ $context = array(
+ 'bool' => true,
+ 'null' => null,
+ 'string' => 'Foo',
+ 'int' => 0,
+ 'float' => 0.5,
+ 'nested' => array('with object' => new DummyTest),
+ 'object' => new \DateTime,
+ 'resource' => fopen('php://memory', 'r'),
+ );
+
+ $this->getLogger()->warning('Crazy context data', $context);
+ }
+
+ public function testContextExceptionKeyCanBeExceptionOrOtherValues()
+ {
+ $this->getLogger()->warning('Random message', array('exception' => 'oops'));
+ $this->getLogger()->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
+ }
+}
+
+class DummyTest
+{
+}
\ No newline at end of file
diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md
new file mode 100644
index 00000000..574bc1cb
--- /dev/null
+++ b/vendor/psr/log/README.md
@@ -0,0 +1,45 @@
+PSR Log
+=======
+
+This repository holds all interfaces/classes/traits related to
+[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).
+
+Note that this is not a logger of its own. It is merely an interface that
+describes a logger. See the specification for more details.
+
+Usage
+-----
+
+If you need a logger, you can use the interface like this:
+
+```php
+logger = $logger;
+ }
+
+ public function doSomething()
+ {
+ if ($this->logger) {
+ $this->logger->info('Doing work');
+ }
+
+ // do something useful
+ }
+}
+```
+
+You can then pick one of the implementations of the interface to get a logger.
+
+If you want to implement the interface, you can require this package and
+implement `Psr\Log\LoggerInterface` in your code. Please read the
+[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+for details.
diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json
new file mode 100644
index 00000000..6bdcc219
--- /dev/null
+++ b/vendor/psr/log/composer.json
@@ -0,0 +1,17 @@
+{
+ "name": "psr/log",
+ "description": "Common interface for logging libraries",
+ "keywords": ["psr", "psr-3", "log"],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Psr\\Log\\": ""
+ }
+ }
+}
diff --git a/vendor/setasign/fpdi/README.md b/vendor/setasign/fpdi/README.md
index c503b7d6..e27d2058 100644
--- a/vendor/setasign/fpdi/README.md
+++ b/vendor/setasign/fpdi/README.md
@@ -27,7 +27,7 @@ To use FPDI with FPDF include following in your composer.json file:
{
"require": {
"setasign/fpdf": "1.8.*",
- "setasign/fpdi": "^2.0"
+ "setasign/fpdi": "^2.5"
}
}
```
@@ -37,8 +37,8 @@ If you want to use TCPDF, you have to update your composer.json to:
```json
{
"require": {
- "tecnickcom/tcpdf": "6.3.*",
- "setasign/fpdi": "^2.0"
+ "tecnickcom/tcpdf": "6.6.*",
+ "setasign/fpdi": "^2.5"
}
}
```
@@ -48,7 +48,7 @@ If you want to use tFPDF, you have to update your composer.json to:
```json
{
"require": {
- "setasign/tfpdf": "1.31.*",
+ "setasign/tfpdf": "1.33.*",
"setasign/fpdi": "^2.3"
}
}
diff --git a/vendor/setasign/fpdi/composer.json b/vendor/setasign/fpdi/composer.json
index b9477485..c0eb4dfa 100644
--- a/vendor/setasign/fpdi/composer.json
+++ b/vendor/setasign/fpdi/composer.json
@@ -38,9 +38,9 @@
},
"require-dev": {
"phpunit/phpunit": "~5.7",
- "setasign/fpdf": "~1.8",
+ "setasign/fpdf": "~1.8.6",
"tecnickcom/tcpdf": "~6.2",
- "setasign/tfpdf": "~1.31",
+ "setasign/tfpdf": "~1.33",
"squizlabs/php_codesniffer": "^3.5"
},
"autoload-dev": {
diff --git a/vendor/setasign/fpdi/src/FpdfTrait.php b/vendor/setasign/fpdi/src/FpdfTrait.php
index 0b56288c..67fa561c 100644
--- a/vendor/setasign/fpdi/src/FpdfTrait.php
+++ b/vendor/setasign/fpdi/src/FpdfTrait.php
@@ -14,6 +14,7 @@
use setasign\Fpdi\PdfParser\PdfParserException;
use setasign\Fpdi\PdfParser\Type\PdfIndirectObject;
use setasign\Fpdi\PdfParser\Type\PdfNull;
+use setasign\Fpdi\PdfParser\Type\PdfType;
/**
* This trait is used for the implementation of FPDI in FPDF and tFPDF.
@@ -142,20 +143,6 @@ protected function _putlinks($n)
$this->_put('/A <_textstring($pl[4]) . '>>');
if (isset($pl['importedLink'])) {
$values = $pl['importedLink']['pdfObject']->value;
- unset(
- $values['P'],
- $values['NM'],
- $values['AP'],
- $values['AS'],
- $values['Type'],
- $values['Subtype'],
- $values['Rect'],
- $values['A'],
- $values['QuadPoints'],
- $values['Rotate'],
- $values['M'],
- $values['StructParent']
- );
foreach ($values as $name => $entry) {
$this->_put('/' . $name . ' ', false);
diff --git a/vendor/setasign/fpdi/src/Fpdi.php b/vendor/setasign/fpdi/src/Fpdi.php
index 7c1f493e..fd158a6e 100644
--- a/vendor/setasign/fpdi/src/Fpdi.php
+++ b/vendor/setasign/fpdi/src/Fpdi.php
@@ -30,5 +30,5 @@ class Fpdi extends FpdfTpl
*
* @string
*/
- const VERSION = '2.5.0';
+ const VERSION = '2.6.0';
}
diff --git a/vendor/setasign/fpdi/src/FpdiTrait.php b/vendor/setasign/fpdi/src/FpdiTrait.php
index 8387528f..6d57b995 100644
--- a/vendor/setasign/fpdi/src/FpdiTrait.php
+++ b/vendor/setasign/fpdi/src/FpdiTrait.php
@@ -129,7 +129,7 @@ protected function setMinPdfVersion($pdfVersion)
*/
protected function getPdfParserInstance(StreamReader $streamReader, array $parserParams = [])
{
- // note: if you get an exception here - turn off errors/warnings on not found for your autoloader.
+ // note: if you get an exception here - turn off errors/warnings on not found classes for your autoloader.
// psr-4 (https://www.php-fig.org/psr/psr-4/) says: Autoloader implementations MUST NOT throw
// exceptions, MUST NOT raise errors of any level, and SHOULD NOT return a value.
/** @noinspection PhpUndefinedClassInspection */
@@ -596,7 +596,7 @@ protected function writePdfType(PdfType $value)
} elseif ($value instanceof PdfString) {
$this->_put('(' . $value->value . ')', false);
} elseif ($value instanceof PdfHexString) {
- $this->_put('<' . $value->value . '>');
+ $this->_put('<' . $value->value . '>', false);
} elseif ($value instanceof PdfBoolean) {
$this->_put($value->value ? 'true ' : 'false ', false);
} elseif ($value instanceof PdfArray) {
@@ -615,11 +615,8 @@ protected function writePdfType(PdfType $value)
} elseif ($value instanceof PdfToken) {
$this->_put($value->value);
} elseif ($value instanceof PdfNull) {
- $this->_put('null ');
+ $this->_put('null ', false);
} elseif ($value instanceof PdfStream) {
- /**
- * @var $value PdfStream
- */
$this->writePdfType($value->value);
$this->_put('stream');
$this->_put($value->getStream());
@@ -636,12 +633,22 @@ protected function writePdfType(PdfType $value)
$this->_put($this->objectMap[$this->currentReaderId][$value->value] . ' 0 R ', false);
} elseif ($value instanceof PdfIndirectObject) {
- /**
- * @var PdfIndirectObject $value
- */
$n = $this->objectMap[$this->currentReaderId][$value->objectNumber];
$this->_newobj($n);
$this->writePdfType($value->value);
+
+ // add newline before "endobj" for all objects in view to PDF/A conformance
+ if (
+ !(
+ ($value->value instanceof PdfArray) ||
+ ($value->value instanceof PdfDictionary) ||
+ ($value->value instanceof PdfToken) ||
+ ($value->value instanceof PdfStream)
+ )
+ ) {
+ $this->_put("\n", false);
+ }
+
$this->_put('endobj');
}
}
diff --git a/vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php b/vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php
index c9d19b9a..7fa146d1 100644
--- a/vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php
+++ b/vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php
@@ -69,7 +69,7 @@ public function __construct(PdfParser $parser, $fileHeaderOffset = 0)
// sometimes the file header offset is part of the byte offsets, so let's retry by resetting it to zero.
if ($e->getCode() === CrossReferenceException::INVALID_DATA && $this->fileHeaderOffset !== 0) {
$this->fileHeaderOffset = 0;
- $reader = $this->readXref($offset + $this->fileHeaderOffset);
+ $reader = $this->readXref($offset);
} else {
throw $e;
}
diff --git a/vendor/setasign/fpdi/src/PdfParser/Filter/Flate.php b/vendor/setasign/fpdi/src/PdfParser/Filter/Flate.php
index 1cefa157..29f07998 100644
--- a/vendor/setasign/fpdi/src/PdfParser/Filter/Flate.php
+++ b/vendor/setasign/fpdi/src/PdfParser/Filter/Flate.php
@@ -55,21 +55,10 @@ public function decode($data)
return $data;
}
- // Try this fallback
- $tries = 0;
+ // Try this fallback (remove the zlib stream header)
+ $data = @(gzinflate(substr($oData, 2)));
- $oDataLen = strlen($oData);
- while ($tries < 6 && ($data === false || (strlen($data) < ($oDataLen - $tries - 1)))) {
- $data = @(gzinflate(substr($oData, $tries)));
- $tries++;
- }
-
- // let's use this fallback only if the $data is longer than the original data
- if (strlen($data) > ($oDataLen - $tries - 1)) {
- return $data;
- }
-
- if (!$data) {
+ if ($data === false) {
throw new FlateException(
'Error while decompressing stream.',
FlateException::DECOMPRESS_ERROR
diff --git a/vendor/setasign/fpdi/src/PdfParser/Type/PdfType.php b/vendor/setasign/fpdi/src/PdfParser/Type/PdfType.php
index 065ad38c..ecd18b3b 100644
--- a/vendor/setasign/fpdi/src/PdfParser/Type/PdfType.php
+++ b/vendor/setasign/fpdi/src/PdfParser/Type/PdfType.php
@@ -69,6 +69,34 @@ protected static function ensureType($type, $value, $errorMessage)
return $value;
}
+ /**
+ * Flatten indirect object references to direct objects.
+ *
+ * @param PdfType $value
+ * @param PdfParser $parser
+ * @return PdfType
+ * @throws CrossReferenceException
+ * @throws PdfParserException
+ */
+ public static function flatten(PdfType $value, PdfParser $parser)
+ {
+ if ($value instanceof PdfIndirectObjectReference) {
+ return self::flatten(self::resolve($value, $parser), $parser);
+ }
+
+ if ($value instanceof PdfDictionary || $value instanceof PdfArray) {
+ foreach ($value->value as $key => $_value) {
+ $value->value[$key] = self::flatten($_value, $parser);
+ }
+ }
+
+ if ($value instanceof PdfStream) {
+ throw new PdfTypeException('There is a stream object found which cannot be flattened to a direct object.');
+ }
+
+ return $value;
+ }
+
/**
* The value of the PDF type.
*
diff --git a/vendor/setasign/fpdi/src/PdfReader/Page.php b/vendor/setasign/fpdi/src/PdfReader/Page.php
index 8d08c953..ad3c0c26 100644
--- a/vendor/setasign/fpdi/src/PdfReader/Page.php
+++ b/vendor/setasign/fpdi/src/PdfReader/Page.php
@@ -10,6 +10,7 @@
namespace setasign\Fpdi\PdfReader;
+use setasign\Fpdi\FpdiException;
use setasign\Fpdi\GraphicsState;
use setasign\Fpdi\Math\Vector;
use setasign\Fpdi\PdfParser\Filter\FilterException;
@@ -281,14 +282,15 @@ public function getContentStream()
* origin is lower-left.
*
* @return array
- * @throws CrossReferenceException
- * @throws PdfParserException
- * @throws PdfTypeException
*/
public function getExternalLinks($box = PageBoundaries::CROP_BOX)
{
- $dict = $this->getPageDictionary();
- $annotations = PdfType::resolve(PdfDictionary::get($dict, 'Annots'), $this->parser);
+ try {
+ $dict = $this->getPageDictionary();
+ $annotations = PdfType::resolve(PdfDictionary::get($dict, 'Annots'), $this->parser);
+ } catch (FpdiException $e) {
+ return [];
+ }
if (!$annotations instanceof PdfArray) {
return [];
@@ -297,93 +299,120 @@ public function getExternalLinks($box = PageBoundaries::CROP_BOX)
$links = [];
foreach ($annotations->value as $entry) {
- $annotation = PdfType::resolve($entry, $this->parser);
+ try {
+ $annotation = PdfType::resolve($entry, $this->parser);
- $value = PdfType::resolve(PdfDictionary::get($annotation, 'Subtype'), $this->parser);
- if (!$value instanceof PdfName || $value->value !== 'Link') {
- continue;
- }
+ $value = PdfType::resolve(PdfDictionary::get($annotation, 'Subtype'), $this->parser);
+ if (!$value instanceof PdfName || $value->value !== 'Link') {
+ continue;
+ }
- $dest = PdfType::resolve(PdfDictionary::get($annotation, 'Dest'), $this->parser);
- if (!$dest instanceof PdfNull) {
- continue;
- }
+ $dest = PdfType::resolve(PdfDictionary::get($annotation, 'Dest'), $this->parser);
+ if (!$dest instanceof PdfNull) {
+ continue;
+ }
- $action = PdfType::resolve(PdfDictionary::get($annotation, 'A'), $this->parser);
- if (!$action instanceof PdfDictionary) {
- continue;
- }
+ $action = PdfType::resolve(PdfDictionary::get($annotation, 'A'), $this->parser);
+ if (!$action instanceof PdfDictionary) {
+ continue;
+ }
- $actionType = PdfType::resolve(PdfDictionary::get($action, 'S'), $this->parser);
- if (!$actionType instanceof PdfName || $actionType->value !== 'URI') {
- continue;
- }
+ $actionType = PdfType::resolve(PdfDictionary::get($action, 'S'), $this->parser);
+ if (!$actionType instanceof PdfName || $actionType->value !== 'URI') {
+ continue;
+ }
- $uri = PdfType::resolve(PdfDictionary::get($action, 'URI'), $this->parser);
- if ($uri instanceof PdfString) {
- $uriValue = PdfString::unescape($uri->value);
- } elseif ($uri instanceof PdfHexString) {
- $uriValue = \hex2bin($uri->value);
- } else {
- continue;
- }
+ $uri = PdfType::resolve(PdfDictionary::get($action, 'URI'), $this->parser);
+ if ($uri instanceof PdfString) {
+ $uriValue = PdfString::unescape($uri->value);
+ } elseif ($uri instanceof PdfHexString) {
+ $uriValue = \hex2bin($uri->value);
+ } else {
+ continue;
+ }
- $rect = PdfType::resolve(PdfDictionary::get($annotation, 'Rect'), $this->parser);
- if (!$rect instanceof PdfArray || count($rect->value) !== 4) {
- continue;
- }
+ $rect = PdfType::resolve(PdfDictionary::get($annotation, 'Rect'), $this->parser);
+ if (!$rect instanceof PdfArray || count($rect->value) !== 4) {
+ continue;
+ }
- $rect = Rectangle::byPdfArray($rect, $this->parser);
- if ($rect->getWidth() === 0 || $rect->getHeight() === 0) {
- continue;
- }
+ $rect = Rectangle::byPdfArray($rect, $this->parser);
+ if ($rect->getWidth() === 0 || $rect->getHeight() === 0) {
+ continue;
+ }
- $bbox = $this->getBoundary($box);
- $rotation = $this->getRotation();
-
- $gs = new GraphicsState();
- $gs->translate(-$bbox->getLlx(), -$bbox->getLly());
- $gs->rotate($bbox->getLlx(), $bbox->getLly(), -$rotation);
-
- switch ($rotation) {
- case 90:
- $gs->translate(-$bbox->getWidth(), 0);
- break;
- case 180:
- $gs->translate(-$bbox->getWidth(), -$bbox->getHeight());
- break;
- case 270:
- $gs->translate(0, -$bbox->getHeight());
- break;
- }
+ $bbox = $this->getBoundary($box);
+ $rotation = $this->getRotation();
+
+ $gs = new GraphicsState();
+ $gs->translate(-$bbox->getLlx(), -$bbox->getLly());
+ $gs->rotate($bbox->getLlx(), $bbox->getLly(), -$rotation);
+
+ switch ($rotation) {
+ case 90:
+ $gs->translate(-$bbox->getWidth(), 0);
+ break;
+ case 180:
+ $gs->translate(-$bbox->getWidth(), -$bbox->getHeight());
+ break;
+ case 270:
+ $gs->translate(0, -$bbox->getHeight());
+ break;
+ }
- $normalizedRect = Rectangle::byVectors(
- $gs->toUserSpace(new Vector($rect->getLlx(), $rect->getLly())),
- $gs->toUserSpace(new Vector($rect->getUrx(), $rect->getUry()))
- );
-
- $quadPoints = PdfType::resolve(PdfDictionary::get($annotation, 'QuadPoints'), $this->parser);
- $normalizedQuadPoints = [];
- if ($quadPoints instanceof PdfArray) {
- $quadPointsCount = count($quadPoints->value);
- if ($quadPointsCount % 8 === 0) {
- for ($i = 0; ($i + 1) < $quadPointsCount; $i += 2) {
- $x = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i], $this->parser));
- $y = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i + 1], $this->parser));
-
- $v = $gs->toUserSpace(new Vector($x->value, $y->value));
- $normalizedQuadPoints[] = $v->getX();
- $normalizedQuadPoints[] = $v->getY();
+ $normalizedRect = Rectangle::byVectors(
+ $gs->toUserSpace(new Vector($rect->getLlx(), $rect->getLly())),
+ $gs->toUserSpace(new Vector($rect->getUrx(), $rect->getUry()))
+ );
+
+ $quadPoints = PdfType::resolve(PdfDictionary::get($annotation, 'QuadPoints'), $this->parser);
+ $normalizedQuadPoints = [];
+ if ($quadPoints instanceof PdfArray) {
+ $quadPointsCount = count($quadPoints->value);
+ if ($quadPointsCount % 8 === 0) {
+ for ($i = 0; ($i + 1) < $quadPointsCount; $i += 2) {
+ $x = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i], $this->parser));
+ $y = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i + 1], $this->parser));
+
+ $v = $gs->toUserSpace(new Vector($x->value, $y->value));
+ $normalizedQuadPoints[] = $v->getX();
+ $normalizedQuadPoints[] = $v->getY();
+ }
}
}
- }
- $links[] = [
- 'rect' => $normalizedRect,
- 'quadPoints' => $normalizedQuadPoints,
- 'uri' => $uriValue,
- 'pdfObject' => $annotation
- ];
+ // we remove unsupported/unneeded values here
+ unset(
+ $annotation->value['P'],
+ $annotation->value['NM'],
+ $annotation->value['AP'],
+ $annotation->value['AS'],
+ $annotation->value['Type'],
+ $annotation->value['Subtype'],
+ $annotation->value['Rect'],
+ $annotation->value['A'],
+ $annotation->value['QuadPoints'],
+ $annotation->value['Rotate'],
+ $annotation->value['M'],
+ $annotation->value['StructParent'],
+ $annotation->value['OC']
+ );
+
+ // ...and flatten the PDF object to eliminate any indirect references.
+ // Indirect references are a problem when writing the output in FPDF
+ // because FPDF uses pre-calculated object numbers while FPDI creates
+ // them at runtime.
+ $annotation = PdfType::flatten($annotation, $this->parser);
+
+ $links[] = [
+ 'rect' => $normalizedRect,
+ 'quadPoints' => $normalizedQuadPoints,
+ 'uri' => $uriValue,
+ 'pdfObject' => $annotation
+ ];
+ } catch (FpdiException $e) {
+ continue;
+ }
}
return $links;
diff --git a/vendor/setasign/fpdi/src/Tcpdf/Fpdi.php b/vendor/setasign/fpdi/src/Tcpdf/Fpdi.php
index f82c690f..ad794d0b 100644
--- a/vendor/setasign/fpdi/src/Tcpdf/Fpdi.php
+++ b/vendor/setasign/fpdi/src/Tcpdf/Fpdi.php
@@ -46,7 +46,7 @@ class Fpdi extends \TCPDF
*
* @string
*/
- const VERSION = '2.5.0';
+ const VERSION = '2.6.0';
/**
* A counter for template ids.
@@ -303,21 +303,8 @@ protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeight
// ensure we have a default value - otherwise TCPDF will set it to 4 throughout
$lastAnnotationOpt['f'] = 0;
+ // values in this dictonary are all direct objects and we don't need to resolve them here again.
$values = $externalLink['pdfObject']->value;
- unset(
- $values['P'],
- $values['NM'],
- $values['AP'],
- $values['AS'],
- $values['Type'],
- $values['Subtype'],
- $values['Rect'],
- $values['A'],
- $values['QuadPoints'],
- $values['Rotate'],
- $values['M'],
- $values['StructParent']
- );
foreach ($values as $key => $value) {
try {
@@ -326,17 +313,17 @@ protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeight
$value = PdfDictionary::ensure($value);
$bs = [];
if (isset($value->value['W'])) {
- $bs['w'] = PdfNumeric::ensure(PdfType::resolve($value->value['W'], $parser))->value;
+ $bs['w'] = PdfNumeric::ensure($value->value['W'])->value;
}
if (isset($value->value['S'])) {
- $bs['s'] = PdfName::ensure(PdfType::resolve($value->value['S'], $parser))->value;
+ $bs['s'] = PdfName::ensure($value->value['S'])->value;
}
if (isset($value->value['D'])) {
$d = [];
- foreach (PdfArray::ensure(PdfType::resolve($value->value['D'], $parser))->value as $item) {
- $d[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value;
+ foreach (PdfArray::ensure($value->value['D'])->value as $item) {
+ $d[] = PdfNumeric::ensure($item)->value;
}
$bs['d'] = $d;
}
@@ -345,20 +332,20 @@ protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeight
break;
case 'Border':
- $borderArray = PdfArray::ensure(PdfType::resolve($value, $parser))->value;
+ $borderArray = PdfArray::ensure($value)->value;
if (count($borderArray) < 3) {
continue 2;
}
$border = [
- PdfNumeric::ensure(PdfType::resolve($borderArray[0], $parser))->value,
- PdfNumeric::ensure(PdfType::resolve($borderArray[1], $parser))->value,
- PdfNumeric::ensure(PdfType::resolve($borderArray[2], $parser))->value,
+ PdfNumeric::ensure($borderArray[0])->value,
+ PdfNumeric::ensure($borderArray[1])->value,
+ PdfNumeric::ensure($borderArray[2])->value,
];
if (isset($borderArray[3])) {
$dashArray = [];
- foreach (PdfArray::ensure(PdfType::resolve($borderArray[3], $parser))->value as $item) {
- $dashArray[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value;
+ foreach (PdfArray::ensure($borderArray[3])->value as $item) {
+ $dashArray[] = PdfNumeric::ensure($item)->value;
}
$border[] = $dashArray;
}
@@ -371,7 +358,7 @@ protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeight
$colors = PdfArray::ensure(PdfType::resolve($value, $parser))->value;
$m = count($colors) === 4 ? 100 : 255;
foreach ($colors as $item) {
- $c[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value * $m;
+ $c[] = PdfNumeric::ensure($item)->value * $m;
}
$lastAnnotationOpt['c'] = $c;
break;
diff --git a/vendor/setasign/fpdi/src/Tfpdf/Fpdi.php b/vendor/setasign/fpdi/src/Tfpdf/Fpdi.php
index 473a7ae6..bcf44723 100644
--- a/vendor/setasign/fpdi/src/Tfpdf/Fpdi.php
+++ b/vendor/setasign/fpdi/src/Tfpdf/Fpdi.php
@@ -28,5 +28,5 @@ class Fpdi extends FpdfTpl
*
* @string
*/
- const VERSION = '2.5.0';
+ const VERSION = '2.6.0';
}
diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json
index e5c978f1..b222fdab 100644
--- a/vendor/symfony/polyfill-ctype/composer.json
+++ b/vendor/symfony/polyfill-ctype/composer.json
@@ -30,9 +30,6 @@
},
"minimum-stability": "dev",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
index 2e0b9694..1ad33a86 100644
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -48,6 +48,8 @@
* - mb_strstr - Finds first occurrence of a string within another
* - mb_strwidth - Return width of string
* - mb_substr_count - Count the number of substring occurrences
+ * - mb_ucfirst - Make a string's first character uppercase
+ * - mb_lcfirst - Make a string's first character lowercase
*
* Not implemented:
* - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
@@ -80,6 +82,21 @@ final class Mbstring
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{
+ if (\is_array($s)) {
+ if (PHP_VERSION_ID < 70200) {
+ trigger_error('mb_convert_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);
+
+ return null;
+ }
+
+ $r = [];
+ foreach ($s as $str) {
+ $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding);
+ }
+
+ return $r;
+ }
+
if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
} else {
@@ -410,7 +427,7 @@ public static function mb_encoding_aliases($encoding)
public static function mb_check_encoding($var = null, $encoding = null)
{
- if (PHP_VERSION_ID < 70200 && \is_array($var)) {
+ if (\PHP_VERSION_ID < 70200 && \is_array($var)) {
trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);
return null;
@@ -437,7 +454,6 @@ public static function mb_check_encoding($var = null, $encoding = null)
}
return true;
-
}
public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
@@ -827,7 +843,7 @@ public static function mb_ord($s, $encoding = null)
return $code;
}
- public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null): string
+ public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string
{
if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) {
throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');
@@ -835,17 +851,8 @@ public static function mb_str_pad(string $string, int $length, string $pad_strin
if (null === $encoding) {
$encoding = self::mb_internal_encoding();
- }
-
- try {
- $validEncoding = @self::mb_check_encoding('', $encoding);
- } catch (\ValueError $e) {
- throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
- }
-
- // BC for PHP 7.3 and lower
- if (!$validEncoding) {
- throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
+ } else {
+ self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given');
}
if (self::mb_strlen($pad_string, $encoding) <= 0) {
@@ -871,6 +878,34 @@ public static function mb_str_pad(string $string, int $length, string $pad_strin
}
}
+ public static function mb_ucfirst(string $string, ?string $encoding = null): string
+ {
+ if (null === $encoding) {
+ $encoding = self::mb_internal_encoding();
+ } else {
+ self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
+ }
+
+ $firstChar = mb_substr($string, 0, 1, $encoding);
+ $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding);
+
+ return $firstChar.mb_substr($string, 1, null, $encoding);
+ }
+
+ public static function mb_lcfirst(string $string, ?string $encoding = null): string
+ {
+ if (null === $encoding) {
+ $encoding = self::mb_internal_encoding();
+ } else {
+ self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
+ }
+
+ $firstChar = mb_substr($string, 0, 1, $encoding);
+ $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding);
+
+ return $firstChar.mb_substr($string, 1, null, $encoding);
+ }
+
private static function getSubpart($pos, $part, $haystack, $encoding)
{
if (false === $pos) {
@@ -944,4 +979,18 @@ private static function getEncoding($encoding)
return $encoding;
}
+
+ private static function assertEncoding(string $encoding, string $errorFormat): void
+ {
+ try {
+ $validEncoding = @self::mb_check_encoding('', $encoding);
+ } catch (\ValueError $e) {
+ throw new \ValueError(\sprintf($errorFormat, $encoding));
+ }
+
+ // BC for PHP 7.3 and lower
+ if (!$validEncoding) {
+ throw new \ValueError(\sprintf($errorFormat, $encoding));
+ }
+ }
}
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php
index ecf1a035..6e4b5fce 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -136,6 +136,14 @@ function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstrin
function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}
+if (!function_exists('mb_ucfirst')) {
+ function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
+}
+
+if (!function_exists('mb_lcfirst')) {
+ function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
+}
+
if (extension_loaded('mbstring')) {
return;
}
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php
index 2f9fb5b4..ec2ae427 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap80.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap80.php
@@ -132,6 +132,14 @@ function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = nul
function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}
+if (!function_exists('mb_ucfirst')) {
+ function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
+}
+
+if (!function_exists('mb_lcfirst')) {
+ function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
+}
+
if (extension_loaded('mbstring')) {
return;
}
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
index 943e5029..bd99d4b9 100644
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -30,9 +30,6 @@
},
"minimum-stability": "dev",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php
index 7bf96c99..e97b1b27 100644
--- a/vendor/symfony/polyfill-php72/Php72.php
+++ b/vendor/symfony/polyfill-php72/Php72.php
@@ -141,6 +141,7 @@ public static function stream_isatty($stream)
if ('\\' === \DIRECTORY_SEPARATOR) {
$stat = @fstat($stream);
+
// Check if formatted mode is S_IFCHR
return $stat ? 0020000 === ($stat['mode'] & 0170000) : false;
}
diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json
index b61b4c8a..1882576d 100644
--- a/vendor/symfony/polyfill-php72/composer.json
+++ b/vendor/symfony/polyfill-php72/composer.json
@@ -24,9 +24,6 @@
},
"minimum-stability": "dev",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
diff --git a/vendor/twig/twig/.github/workflows/ci.yml b/vendor/twig/twig/.github/workflows/ci.yml
index 3f49259c..405f0af1 100644
--- a/vendor/twig/twig/.github/workflows/ci.yml
+++ b/vendor/twig/twig/.github/workflows/ci.yml
@@ -34,7 +34,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP with extensions"
uses: shivammathur/setup-php@v2
@@ -88,7 +88,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP with extensions"
uses: shivammathur/setup-php@v2
@@ -129,11 +129,11 @@ jobs:
strategy:
matrix:
php-version:
- - '7.3'
+ - '8.2'
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP with extensions"
uses: shivammathur/setup-php@v2
@@ -143,6 +143,3 @@ jobs:
php-version: ${{ matrix.php-version }}
ini-values: memory_limit=-1
tools: composer:v2
-
- - run: bash ./tests/drupal_test.sh
- shell: "bash"
diff --git a/vendor/twig/twig/.github/workflows/documentation.yml b/vendor/twig/twig/.github/workflows/documentation.yml
index f2f46fc6..9519f5d1 100644
--- a/vendor/twig/twig/.github/workflows/documentation.yml
+++ b/vendor/twig/twig/.github/workflows/documentation.yml
@@ -18,7 +18,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Set-up PHP"
uses: shivammathur/setup-php@v2
@@ -54,7 +54,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Run DOCtor-RST"
uses: docker://oskarstark/doctor-rst
diff --git a/vendor/twig/twig/CHANGELOG b/vendor/twig/twig/CHANGELOG
index a48393ad..46ef319e 100644
--- a/vendor/twig/twig/CHANGELOG
+++ b/vendor/twig/twig/CHANGELOG
@@ -1,3 +1,15 @@
+**Twig 2 is not maintained anymore**
+
+# 2.16.0 (2023-12-22)
+
+ * Last version for the 2.x series
+ * Add SourcePolicyInterface to selectively enable the Sandbox based on a template's Source
+
+# 2.15.6 (2023-21-11)
+
+ * Add return type for Symfony 7 compatibility
+ * Fix premature loop exit in Security Policy lookup of allowed methods/properties
+
# 2.15.5 (2023-05-03)
* Make the Lexer initialize itself lazily
diff --git a/vendor/twig/twig/README.rst b/vendor/twig/twig/README.rst
index fbe7e9a9..80ceb416 100644
--- a/vendor/twig/twig/README.rst
+++ b/vendor/twig/twig/README.rst
@@ -6,12 +6,15 @@ Twig is a template language for PHP.
Twig uses a syntax similar to the Django and Jinja template languages which
inspired the Twig runtime environment.
+**Twig version 2 is not maintained anymore.**
+Please, upgrade at your earliest convenience.
+
Sponsors
--------
.. raw:: html
-
+
diff --git a/vendor/twig/twig/composer.json b/vendor/twig/twig/composer.json
index 4bc2421a..e999ab4a 100644
--- a/vendor/twig/twig/composer.json
+++ b/vendor/twig/twig/composer.json
@@ -30,7 +30,7 @@
"symfony/polyfill-php72": "^1.8"
},
"require-dev": {
- "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0",
+ "symfony/phpunit-bridge": "^5.4.9|^6.3",
"psr/container": "^1.0"
},
"autoload": {
@@ -48,7 +48,7 @@
},
"extra": {
"branch-alias": {
- "dev-master": "2.15-dev"
+ "dev-master": "2.16-dev"
}
}
}
diff --git a/vendor/twig/twig/src/Environment.php b/vendor/twig/twig/src/Environment.php
index 9cebf35d..aa6ccf38 100644
--- a/vendor/twig/twig/src/Environment.php
+++ b/vendor/twig/twig/src/Environment.php
@@ -38,11 +38,11 @@
*/
class Environment
{
- public const VERSION = '2.15.5';
- public const VERSION_ID = 21505;
+ public const VERSION = '2.16.0';
+ public const VERSION_ID = 21600;
public const MAJOR_VERSION = 2;
- public const MINOR_VERSION = 15;
- public const RELEASE_VERSION = 5;
+ public const MINOR_VERSION = 16;
+ public const RELEASE_VERSION = 0;
public const EXTRA_VERSION = '';
private $charset;
diff --git a/vendor/twig/twig/src/Extension/SandboxExtension.php b/vendor/twig/twig/src/Extension/SandboxExtension.php
index dca3262a..22308103 100644
--- a/vendor/twig/twig/src/Extension/SandboxExtension.php
+++ b/vendor/twig/twig/src/Extension/SandboxExtension.php
@@ -15,6 +15,7 @@
use Twig\Sandbox\SecurityNotAllowedMethodError;
use Twig\Sandbox\SecurityNotAllowedPropertyError;
use Twig\Sandbox\SecurityPolicyInterface;
+use Twig\Sandbox\SourcePolicyInterface;
use Twig\Source;
use Twig\TokenParser\SandboxTokenParser;
@@ -23,11 +24,13 @@ final class SandboxExtension extends AbstractExtension
private $sandboxedGlobally;
private $sandboxed;
private $policy;
+ private $sourcePolicy;
- public function __construct(SecurityPolicyInterface $policy, $sandboxed = false)
+ public function __construct(SecurityPolicyInterface $policy, $sandboxed = false, SourcePolicyInterface $sourcePolicy = null)
{
$this->policy = $policy;
$this->sandboxedGlobally = $sandboxed;
+ $this->sourcePolicy = $sourcePolicy;
}
public function getTokenParsers()
@@ -50,9 +53,9 @@ public function disableSandbox()
$this->sandboxed = false;
}
- public function isSandboxed()
+ public function isSandboxed(Source $source = null)
{
- return $this->sandboxedGlobally || $this->sandboxed;
+ return $this->sandboxedGlobally || $this->sandboxed || $this->isSourceSandboxed($source);
}
public function isSandboxedGlobally()
@@ -60,6 +63,15 @@ public function isSandboxedGlobally()
return $this->sandboxedGlobally;
}
+ private function isSourceSandboxed(?Source $source): bool
+ {
+ if (null === $source || null === $this->sourcePolicy) {
+ return false;
+ }
+
+ return $this->sourcePolicy->enableSandbox($source);
+ }
+
public function setSecurityPolicy(SecurityPolicyInterface $policy)
{
$this->policy = $policy;
@@ -70,16 +82,16 @@ public function getSecurityPolicy()
return $this->policy;
}
- public function checkSecurity($tags, $filters, $functions)
+ public function checkSecurity($tags, $filters, $functions, Source $source = null)
{
- if ($this->isSandboxed()) {
+ if ($this->isSandboxed($source)) {
$this->policy->checkSecurity($tags, $filters, $functions);
}
}
public function checkMethodAllowed($obj, $method, int $lineno = -1, Source $source = null)
{
- if ($this->isSandboxed()) {
+ if ($this->isSandboxed($source)) {
try {
$this->policy->checkMethodAllowed($obj, $method);
} catch (SecurityNotAllowedMethodError $e) {
@@ -93,7 +105,7 @@ public function checkMethodAllowed($obj, $method, int $lineno = -1, Source $sour
public function checkPropertyAllowed($obj, $property, int $lineno = -1, Source $source = null)
{
- if ($this->isSandboxed()) {
+ if ($this->isSandboxed($source)) {
try {
$this->policy->checkPropertyAllowed($obj, $property);
} catch (SecurityNotAllowedPropertyError $e) {
@@ -107,7 +119,7 @@ public function checkPropertyAllowed($obj, $property, int $lineno = -1, Source $
public function ensureToStringAllowed($obj, int $lineno = -1, Source $source = null)
{
- if ($this->isSandboxed() && \is_object($obj) && method_exists($obj, '__toString')) {
+ if ($this->isSandboxed($source) && \is_object($obj) && method_exists($obj, '__toString')) {
try {
$this->policy->checkMethodAllowed($obj, '__toString');
} catch (SecurityNotAllowedMethodError $e) {
diff --git a/vendor/twig/twig/src/Node/CheckSecurityNode.php b/vendor/twig/twig/src/Node/CheckSecurityNode.php
index 489a3652..7b2981bb 100644
--- a/vendor/twig/twig/src/Node/CheckSecurityNode.php
+++ b/vendor/twig/twig/src/Node/CheckSecurityNode.php
@@ -58,7 +58,8 @@ public function compile(Compiler $compiler)
->indent()
->write(!$tags ? "[],\n" : "['".implode("', '", array_keys($tags))."'],\n")
->write(!$filters ? "[],\n" : "['".implode("', '", array_keys($filters))."'],\n")
- ->write(!$functions ? "[]\n" : "['".implode("', '", array_keys($functions))."']\n")
+ ->write(!$functions ? "[],\n" : "['".implode("', '", array_keys($functions))."'],\n")
+ ->write("\$this->source\n")
->outdent()
->write(");\n")
->outdent()
diff --git a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php b/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
index 1406e806..3b79a870 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
@@ -94,9 +94,8 @@ public function checkMethodAllowed($obj, $method)
$allowed = false;
$method = strtr($method, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
foreach ($this->allowedMethods as $class => $methods) {
- if ($obj instanceof $class) {
- $allowed = \in_array($method, $methods);
-
+ if ($obj instanceof $class && \in_array($method, $methods)) {
+ $allowed = true;
break;
}
}
@@ -111,9 +110,8 @@ public function checkPropertyAllowed($obj, $property)
{
$allowed = false;
foreach ($this->allowedProperties as $class => $properties) {
- if ($obj instanceof $class) {
- $allowed = \in_array($property, \is_array($properties) ? $properties : [$properties]);
-
+ if ($obj instanceof $class && \in_array($property, \is_array($properties) ? $properties : [$properties])) {
+ $allowed = true;
break;
}
}
diff --git a/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php b/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php
new file mode 100644
index 00000000..b952f1ea
--- /dev/null
+++ b/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php
@@ -0,0 +1,24 @@
+