CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-STAGING-FORENSIC-042
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-vm211-staging-forensic-corrected
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=15b23b8177dd6de06c36b0bff7d6d33adb5d96f9f6016643f8795cfb1c404f88
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=d333fa06430e6f722db581008183763bd599ca73fe5aff35a8a5425cc545bce3
SANITIZED_OUTPUT_SHA256=d333fa06430e6f722db581008183763bd599ca73fe5aff35a8a5425cc545bce3
OUTPUT_BEGIN
SUPPORT042_BEGIN
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
SUPPORT042_SOURCE_POSTROLLBACK={"source_exists":false,"tmp_exists":false}
SUPPORT042_QGA_STATE={"exitcode":0,"state":"COMPLETE"}
SUPPORT042_VM211={"addon_path":{"state":"ABSENT"},"cli":{"commands":["xf:addon-disable","xf:addon-enable","xf:addon-install","xf:addon-list","xf:addon-rebuild","xf:addon-uninstall","xf:addon-upgrade"],"help":{"xf:addon-install":{"options":["--ansi","--force","--help","--no-ansi","--no-interaction","--quiet","--verbose","--version"],"rc":0},"xf:addon-rebuild":{"options":["--ansi","--force","--help","--no-ansi","--no-interaction","--quiet","--verbose","--version"],"rc":0},"xf:addon-uninstall":{"options":["--ansi","--force","--help","--no-ansi","--no-interaction","--quiet","--verbose","--version"],"rc":0},"xf:addon-upgrade":{"options":["--ansi","--force","--help","--no-ansi","--no-interaction","--quiet","--skip-unavailable","--verbose","--version"],"rc":0}},"rc":0},"collection":"COMPLETE","command_id":"SUPPORT-260909-GRAM-XF-STAGING-FORENSIC-042","datatype_contract":{"AbstractDataType.php":{"exists":true,"methods":[[{"line":30,"text":"\tabstract public function getContainerTag();"},{"line":31,"text":""},{"line":32,"text":"\tabstract public function getChildTag();"},{"line":33,"text":""},{"line":34,"text":"\tabstract public function exportAddOnData($addOnId, \\DOMElement $container);"},{"line":35,"text":""},{"line":36,"text":"\tabstract public function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0);"},{"line":37,"text":""},{"line":38,"text":"\tabstract public function deleteOrphanedAddOnData($addOnId, \\SimpleXMLElement $container);"},{"line":39,"text":""},{"line":40,"text":"\tpublic const USE_AUTO_CDATA = false;"},{"line":41,"text":""},{"line":42,"text":"\tpublic function __construct(Manager $em)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$this->em = $em;"},{"line":45,"text":"\t\t$this->structure = $em->getEntityStructure($this->getShortName());"},{"line":46,"text":"\t}"}],[{"line":32,"text":"\tabstract public function getChildTag();"},{"line":33,"text":""},{"line":34,"text":"\tabstract public function exportAddOnData($addOnId, \\DOMElement $container);"},{"line":35,"text":""},{"line":36,"text":"\tabstract public function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0);"},{"line":37,"text":""},{"line":38,"text":"\tabstract public function deleteOrphanedAddOnData($addOnId, \\SimpleXMLElement $container);"},{"line":39,"text":""},{"line":40,"text":"\tpublic const USE_AUTO_CDATA = false;"},{"line":41,"text":""},{"line":42,"text":"\tpublic function __construct(Manager $em)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$this->em = $em;"},{"line":45,"text":"\t\t$this->structure = $em->getEntityStructure($this->getShortName());"},{"line":46,"text":"\t}"}],[{"line":34,"text":"\tabstract public function exportAddOnData($addOnId, \\DOMElement $container);"},{"line":35,"text":""},{"line":36,"text":"\tabstract public function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0);"},{"line":37,"text":""},{"line":38,"text":"\tabstract public function deleteOrphanedAddOnData($addOnId, \\SimpleXMLElement $container);"},{"line":39,"text":""},{"line":40,"text":"\tpublic const USE_AUTO_CDATA = false;"},{"line":41,"text":""},{"line":42,"text":"\tpublic function __construct(Manager $em)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$this->em = $em;"},{"line":45,"text":"\t\t$this->structure = $em->getEntityStructure($this->getShortName());"},{"line":46,"text":"\t}"}],[{"line":36,"text":"\tabstract public function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0);"},{"line":37,"text":""},{"line":38,"text":"\tabstract public function deleteOrphanedAddOnData($addOnId, \\SimpleXMLElement $container);"},{"line":39,"text":""},{"line":40,"text":"\tpublic const USE_AUTO_CDATA = false;"},{"line":41,"text":""},{"line":42,"text":"\tpublic function __construct(Manager $em)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$this->em = $em;"},{"line":45,"text":"\t\t$this->structure = $em->getEntityStructure($this->getShortName());"},{"line":46,"text":"\t}"}],[{"line":174,"text":"\tprotected function getMappedAttributes()"},{"line":175,"text":"\t{"},{"line":176,"text":"\t\treturn [];"},{"line":177,"text":"\t}"}],[{"line":184,"text":"\tprotected function exportArrayToAttributes(\\DOMElement $tag, $attr, Entity $entity)"},{"line":185,"text":"\t{"},{"line":186,"text":"\t\tforeach ($entity->$attr AS $key => $value)"},{"line":187,"text":"\t\t{"},{"line":188,"text":"\t\t\tif ($value === '')"},{"line":189,"text":"\t\t\t{"},{"line":190,"text":"\t\t\t\tcontinue;"},{"line":191,"text":"\t\t\t}"},{"line":192,"text":"\t\t\tif (is_bool($value))"},{"line":193,"text":"\t\t\t{"},{"line":194,"text":"\t\t\t\t$value = $value ? 1 : 0;"},{"line":195,"text":"\t\t\t}"},{"line":196,"text":"\t\t\t$tag->setAttribute($attr . '_' . $key, $value);"},{"line":197,"text":"\t\t}"},{"line":198,"text":"\t}"}],[{"line":200,"text":"\tprotected function exportCdataToNewNode(\\DOMElement $tag, $attr, Entity $entity)"},{"line":201,"text":"\t{"},{"line":202,"text":"\t\t$newNode = $tag->ownerDocument->createElement($attr);"},{"line":203,"text":"\t\t$this->exportCdata($newNode, $entity->{$attr});"},{"line":204,"text":"\t\t$tag->appendChild($newNode);"},{"line":205,"text":"\t}"}],[{"line":207,"text":"\tprotected function exportMappedAttributes(\\DOMElement $tag, Entity $entity)"},{"line":208,"text":"\t{"},{"line":209,"text":"\t\tforeach ($this->getMappedAttributes() AS $attr)"},{"line":210,"text":"\t\t{"},{"line":211,"text":"\t\t\t$value = $entity->getValue($attr);"},{"line":212,"text":""},{"line":213,"text":"\t\t\tif ($value !== '')"},{"line":214,"text":"\t\t\t{"},{"line":215,"text":"\t\t\t\tif (is_bool($value))"},{"line":216,"text":"\t\t\t\t{"},{"line":217,"text":"\t\t\t\t\t$value = $value ? 1 : 0;"},{"line":218,"text":"\t\t\t\t}"},{"line":219,"text":""},{"line":220,"text":"\t\t\t\t// CURRENTLY NOT USED DUE TO BC ISSUES WITH 2.0.x < 2.0.4"},{"line":221,"text":"\t\t\t\tif (self::USE_AUTO_CDATA && is_string($value) && !preg_match('/^[^<>&\"]*$/si', $value))"},{"line":222,"text":"\t\t\t\t{"},{"line":223,"text":"\t\t\t\t\t// This exports CDATA, but does not escape `]]>` like \\XF\\Util\\XML::createDomCdataSection(),"},{"line":224,"text":"\t\t\t\t\t// because it needs to be transparently importable."},{"line":225,"text":"\t\t\t\t\t// If you need to export values containing `]]>`, use exportCdataToNewNode()"},{"line":226,"text":"\t\t\t\t\t// and remove this attribute from exportMappedAttributes()"},{"line":227,"text":""},{"line":228,"text":"\t\t\t\t\t$newNode = $tag->ownerDocument->createElement($attr);"},{"line":229,"text":""},{"line":230,"text":"\t\t\t\t\t$newNode->appendChild("},{"line":231,"text":"\t\t\t\t\t\t$newNode->ownerDocument->createCDATASection($entity->{$attr})"},{"line":232,"text":"\t\t\t\t\t);"},{"line":233,"text":""},{"line":234,"text":"\t\t\t\t\t$tag->appendChild($newNode);"},{"line":235,"text":"\t\t\t\t}"},{"line":236,"text":"\t\t\t\telse"},{"line":237,"text":"\t\t\t\t{"},{"line":238,"text":"\t\t\t\t\t$tag->setAttribute($attr, $value);"},{"line":239,"text":"\t\t\t\t}"},{"line":240,"text":"\t\t\t}"},{"line":241,"text":"\t\t}"},{"line":242,"text":"\t}"}],[{"line":244,"text":"\tprotected function importMappedAttributes(\\SimpleXMLElement $el, Entity $entity, $allowMaintained = true)"},{"line":245,"text":"\t{"},{"line":246,"text":"\t\tif ($entity->exists() && $allowMaintained)"},{"line":247,"text":"\t\t{"},{"line":248,"text":"\t\t\t$maintained = $this->getMaintainedAttributes();"},{"line":249,"text":"\t\t}"},{"line":250,"text":"\t\telse"},{"line":251,"text":"\t\t{"},{"line":252,"text":"\t\t\t$maintained = [];"},{"line":253,"text":"\t\t}"},{"line":254,"text":""},{"line":255,"text":"\t\tforeach ($this->getMappedAttributes() AS $attr)"},{"line":256,"text":"\t\t{"},{"line":257,"text":"\t\t\tif (in_array($attr, $maintained))"},{"line":258,"text":"\t\t\t{"},{"line":259,"text":"\t\t\t\tcontinue;"},{"line":260,"text":"\t\t\t}"},{"line":261,"text":""},{"line":262,"text":"\t\t\tif (self::USE_AUTO_CDATA)"},{"line":263,"text":"\t\t\t{"},{"line":264,"text":"\t\t\t\tif (isset($el[$attr]))"},{"line":265,"text":"\t\t\t\t{"},{"line":266,"text":"\t\t\t\t\t$entity->$attr = (string) $el[$attr];"},{"line":267,"text":"\t\t\t\t}"},{"line":268,"text":"\t\t\t\telse if (isset($el->{$attr}))"},{"line":269,"text":"\t\t\t\t{"},{"line":270,"text":"\t\t\t\t\t$entity->$attr = (string) $el->{$attr};"},{"line":271,"text":"\t\t\t\t}"},{"line":272,"text":"\t\t\t}"},{"line":273,"text":"\t\t\telse"},{"line":274,"text":"\t\t\t{"},{"line":275,"text":"\t\t\t\t$entity->$attr = (string) $el[$attr];"},{"line":276,"text":"\t\t\t}"},{"line":277,"text":"\t\t}"},{"line":278,"text":"\t}"}],[{"line":302,"text":"\tprotected function exportCdata(\\DOMElement $parent, $value)"},{"line":303,"text":"\t{"},{"line":304,"text":"\t\t$cdata = Xml::createDomCdataSection($parent->ownerDocument, $value);"},{"line":305,"text":"\t\t$parent->appendChild($cdata);"},{"line":306,"text":"\t}"}]],"sha256":"a4f6ec14e4009be0029548b07272dc77c6ad96f4cca4e067a7d3ea0004126815"},"CodeEventListener.php":{"exists":true,"methods":[[{"line":16,"text":"\tpublic function getContainerTag()"},{"line":17,"text":"\t{"},{"line":18,"text":"\t\treturn 'code_event_listeners';"},{"line":19,"text":"\t}"}],[{"line":21,"text":"\tpublic function getChildTag()"},{"line":22,"text":"\t{"},{"line":23,"text":"\t\treturn 'listener';"},{"line":24,"text":"\t}"}],[{"line":26,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":27,"text":"\t{"},{"line":28,"text":"\t\t$entries = $this->finder()"},{"line":29,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":30,"text":"\t\t\t->order(['event_id', 'callback_class', 'callback_method'])->fetch();"},{"line":31,"text":""},{"line":32,"text":"\t\tforeach ($entries AS $entry)"},{"line":33,"text":"\t\t{"},{"line":34,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":35,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":36,"text":"\t\t\t$container->appendChild($node);"},{"line":37,"text":"\t\t}"},{"line":38,"text":""},{"line":39,"text":"\t\treturn $entries->count() ? true : false;"},{"line":40,"text":"\t}"}],[{"line":42,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$startTime = microtime(true);"},{"line":45,"text":""},{"line":46,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":47,"text":"\t\tif (!$entries)"},{"line":48,"text":"\t\t{"},{"line":49,"text":"\t\t\treturn false;"},{"line":50,"text":"\t\t}"},{"line":51,"text":""},{"line":52,"text":"\t\t$existing = [];"},{"line":53,"text":"\t\tforeach ($this->findAllForType($addOnId)->fetch() AS $listener)"},{"line":54,"text":"\t\t{"},{"line":55,"text":"\t\t\t$existing[$listener->getAddOnUniqueKey()] = $listener;"},{"line":56,"text":"\t\t}"},{"line":57,"text":""},{"line":58,"text":"\t\t$i = 0;"},{"line":59,"text":"\t\t$last = 0;"},{"line":60,"text":"\t\tforeach ($entries AS $entry)"},{"line":61,"text":"\t\t{"},{"line":62,"text":"\t\t\t$i++;"},{"line":63,"text":""},{"line":64,"text":"\t\t\tif ($i <= $start)"},{"line":65,"text":"\t\t\t{"},{"line":66,"text":"\t\t\t\tcontinue;"},{"line":67,"text":"\t\t\t}"},{"line":68,"text":""},{"line":69,"text":"\t\t\t$key = $this->getAddOnUniqueKeyFromXml($entry);"},{"line":70,"text":"\t\t\t$entity = $existing[$key] ?? $this->create();"},{"line":71,"text":""},{"line":72,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":73,"text":"\t\t\t$entity->setOption('check_duplicate', false);"},{"line":74,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":75,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":76,"text":""},{"line":77,"text":"\t\t\t$entity->save(true, false);"},{"line":78,"text":""},{"line":79,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":80,"text":"\t\t\t{"},{"line":81,"text":"\t\t\t\t$last = $i;"},{"line":82,"text":"\t\t\t\tbreak;"},{"line":83,"text":"\t\t\t}"},{"line":84,"text":"\t\t}"},{"line":85,"text":"\t\treturn ($last ?: false);"},{"line":86,"text":"\t}"}],[{"line":127,"text":"\tprotected function getMappedAttributes()"},{"line":128,"text":"\t{"},{"line":129,"text":"\t\treturn ["},{"line":130,"text":"\t\t\t'event_id',"},{"line":131,"text":"\t\t\t'execute_order',"},{"line":132,"text":"\t\t\t'callback_class',"},{"line":133,"text":"\t\t\t'callback_method',"},{"line":134,"text":"\t\t\t'active',"},{"line":135,"text":"\t\t\t'hint',"},{"line":136,"text":"\t\t\t'description',"},{"line":137,"text":"\t\t];"},{"line":138,"text":"\t}"}]],"sha256":"eba1c2560c9c5c48d1185886609203bf73665d664c2ae0f2db0ff17dbad574ab"},"ContentTypeField.php":{"exists":true,"methods":[[{"line":16,"text":"\tpublic function getContainerTag()"},{"line":17,"text":"\t{"},{"line":18,"text":"\t\treturn 'content_type_fields';"},{"line":19,"text":"\t}"}],[{"line":21,"text":"\tpublic function getChildTag()"},{"line":22,"text":"\t{"},{"line":23,"text":"\t\treturn 'field';"},{"line":24,"text":"\t}"}],[{"line":26,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":27,"text":"\t{"},{"line":28,"text":"\t\t$entries = $this->finder()"},{"line":29,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":30,"text":"\t\t\t->order(['content_type', 'field_name'])->fetch();"},{"line":31,"text":""},{"line":32,"text":"\t\t$doc = $container->ownerDocument;"},{"line":33,"text":""},{"line":34,"text":"\t\tforeach ($entries AS $entry)"},{"line":35,"text":"\t\t{"},{"line":36,"text":"\t\t\t$node = $doc->createElement($this->getChildTag());"},{"line":37,"text":""},{"line":38,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":39,"text":"\t\t\t$node->appendChild($doc->createTextNode($entry->field_value));"},{"line":40,"text":""},{"line":41,"text":"\t\t\t$container->appendChild($node);"},{"line":42,"text":"\t\t}"},{"line":43,"text":""},{"line":44,"text":"\t\treturn $entries->count() ? true : false;"},{"line":45,"text":"\t}"}],[{"line":47,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":48,"text":"\t{"},{"line":49,"text":"\t\t$startTime = microtime(true);"},{"line":50,"text":""},{"line":51,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":52,"text":"\t\tif (!$entries)"},{"line":53,"text":"\t\t{"},{"line":54,"text":"\t\t\treturn false;"},{"line":55,"text":"\t\t}"},{"line":56,"text":""},{"line":57,"text":"\t\t$existing = $this->finder()->fetch()->groupBy('content_type', 'field_name');"},{"line":58,"text":""},{"line":59,"text":"\t\t$i = 0;"},{"line":60,"text":"\t\t$last = 0;"},{"line":61,"text":"\t\tforeach ($entries AS $entry)"},{"line":62,"text":"\t\t{"},{"line":63,"text":"\t\t\t$i++;"},{"line":64,"text":""},{"line":65,"text":"\t\t\tif ($i <= $start)"},{"line":66,"text":"\t\t\t{"},{"line":67,"text":"\t\t\t\tcontinue;"},{"line":68,"text":"\t\t\t}"},{"line":69,"text":""},{"line":70,"text":"\t\t\t$type = (string) $entry['content_type'];"},{"line":71,"text":"\t\t\t$name = (string) $entry['field_name'];"},{"line":72,"text":"\t\t\t$entity = $existing[$type][$name] ?? $this->create();"},{"line":73,"text":""},{"line":74,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":75,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":76,"text":"\t\t\t$entity->field_value = (string) $entry;"},{"line":77,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":78,"text":""},{"line":79,"text":"\t\t\t$entity->save(true, false);"},{"line":80,"text":""},{"line":81,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":82,"text":"\t\t\t{"},{"line":83,"text":"\t\t\t\t$last = $i;"},{"line":84,"text":"\t\t\t\tbreak;"},{"line":85,"text":"\t\t\t}"},{"line":86,"text":"\t\t}"},{"line":87,"text":"\t\treturn ($last ?: false);"},{"line":88,"text":"\t}"}],[{"line":132,"text":"\tprotected function getMappedAttributes()"},{"line":133,"text":"\t{"},{"line":134,"text":"\t\treturn ["},{"line":135,"text":"\t\t\t'content_type',"},{"line":136,"text":"\t\t\t'field_name',"},{"line":137,"text":"\t\t];"},{"line":138,"text":"\t}"}]],"sha256":"6c954db974138ac73a76ba87a119c4efdfb85f922a81832928e9ee022e23f594"},"Option.php":{"exists":true,"methods":[[{"line":17,"text":"\tpublic function getContainerTag()"},{"line":18,"text":"\t{"},{"line":19,"text":"\t\treturn 'options';"},{"line":20,"text":"\t}"}],[{"line":22,"text":"\tpublic function getChildTag()"},{"line":23,"text":"\t{"},{"line":24,"text":"\t\treturn 'option';"},{"line":25,"text":"\t}"}],[{"line":27,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":28,"text":"\t{"},{"line":29,"text":"\t\t$entries = $this->finder()"},{"line":30,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":31,"text":"\t\t\t->order('option_id')->fetch();"},{"line":32,"text":""},{"line":33,"text":"\t\t$doc = $container->ownerDocument;"},{"line":34,"text":""},{"line":35,"text":"\t\tforeach ($entries AS $entry)"},{"line":36,"text":"\t\t{"},{"line":37,"text":"\t\t\t$node = $doc->createElement($this->getChildTag());"},{"line":38,"text":""},{"line":39,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":40,"text":"\t\t\t$node->appendChild(Xml::createDomElement($doc, 'default_value', $entry->getValue('default_value')));"},{"line":41,"text":"\t\t\tif ($entry->edit_format_params !== '')"},{"line":42,"text":"\t\t\t{"},{"line":43,"text":"\t\t\t\t$node->appendChild(Xml::createDomElement($doc, 'edit_format_params', $entry->edit_format_params));"},{"line":44,"text":"\t\t\t}"},{"line":45,"text":"\t\t\tif ($entry->sub_options)"},{"line":46,"text":"\t\t\t{"},{"line":47,"text":"\t\t\t\t$node->appendChild(Xml::createDomElement($doc, 'sub_options', implode(\"\\n\", $entry->sub_options)));"},{"line":48,"text":"\t\t\t}"},{"line":49,"text":""},{"line":50,"text":"\t\t\tforeach ($entry->Relations AS $relation)"},{"line":51,"text":"\t\t\t{"},{"line":52,"text":"\t\t\t\t$relationNode = $doc->createElement('relation');"},{"line":53,"text":"\t\t\t\t$relationNode->setAttribute('group_id', $relation->group_id);"},{"line":54,"text":"\t\t\t\t$relationNode->setAttribute('display_order', $relation->display_order);"},{"line":55,"text":"\t\t\t\t$node->appendChild($relationNode);"},{"line":56,"text":"\t\t\t}"},{"line":57,"text":""},{"line":58,"text":"\t\t\t$container->appendChild($node);"},{"line":59,"text":"\t\t}"},{"line":60,"text":""},{"line":61,"text":"\t\treturn $entries->count() ? true : false;"},{"line":62,"text":"\t}"}],[{"line":64,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":65,"text":"\t{"},{"line":66,"text":"\t\t$startTime = microtime(true);"},{"line":67,"text":""},{"line":68,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":69,"text":"\t\tif (!$entries)"},{"line":70,"text":"\t\t{"},{"line":71,"text":"\t\t\treturn false;"},{"line":72,"text":"\t\t}"},{"line":73,"text":""},{"line":74,"text":"\t\t$ids = $this->pluckXmlAttribute($entries, 'option_id');"},{"line":75,"text":"\t\t$existing = $this->findByIds($ids);"},{"line":76,"text":""},{"line":77,"text":"\t\t$i = 0;"},{"line":78,"text":"\t\t$last = 0;"},{"line":79,"text":"\t\tforeach ($entries AS $entry)"},{"line":80,"text":"\t\t{"},{"line":81,"text":"\t\t\t$id = $ids[$i++];"},{"line":82,"text":""},{"line":83,"text":"\t\t\tif ($i <= $start)"},{"line":84,"text":"\t\t\t{"},{"line":85,"text":"\t\t\t\tcontinue;"},{"line":86,"text":"\t\t\t}"},{"line":87,"text":""},{"line":88,"text":"\t\t\t/** @var \\XF\\Entity\\Option $entity */"},{"line":89,"text":"\t\t\t$entity = $existing[$id] ?? $this->create();"},{"line":90,"text":""},{"line":91,"text":"\t\t\t$entity->setOptions(["},{"line":92,"text":"\t\t\t\t'verify_validation_callback' => false,"},{"line":93,"text":"\t\t\t\t'verify_value' => false,"},{"line":94,"text":"\t\t\t]);"},{"line":95,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":96,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":97,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":98,"text":"\t\t\t$entity->default_value = (string) $entry->default_value;"},{"line":99,"text":"\t\t\t$entity->edit_format_params = (string) $entry->edit_format_params;"},{"line":100,"text":""},{"line":101,"text":"\t\t\t$subOptions = (string) $entry->sub_options;"},{"line":102,"text":"\t\t\t$entity->sub_options = strlen($subOptions) ? explode(\"\\n\", $subOptions) : [];"},{"line":103,"text":""},{"line":104,"text":"\t\t\t$entity->save(true, false);"},{"line":105,"text":""},{"line":106,"text":"\t\t\t$relations = [];"},{"line":107,"text":"\t\t\tforeach ($entry->relation AS $relation)"},{"line":108,"text":"\t\t\t{"},{"line":109,"text":"\t\t\t\t$relations[(string) $relation['group_id']] = (string) $relation['display_order'];"},{"line":110,"text":"\t\t\t}"},{"line":111,"text":""},{"line":112,"text":"\t\t\t$entity->updateRelations($relations);"},{"line":113,"text":""},{"line":114,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":115,"text":"\t\t\t{"},{"line":116,"text":"\t\t\t\t$last = $i;"},{"line":117,"text":"\t\t\t\tbreak;"},{"line":118,"text":"\t\t\t}"},{"line":119,"text":"\t\t}"},{"line":120,"text":"\t\treturn ($last ?: false);"},{"line":121,"text":"\t}"}],[{"line":128,"text":"\tprotected function getMappedAttributes()"},{"line":129,"text":"\t{"},{"line":130,"text":"\t\treturn ["},{"line":131,"text":"\t\t\t'option_id',"},{"line":132,"text":"\t\t\t'edit_format',"},{"line":133,"text":"\t\t\t'data_type',"},{"line":134,"text":"\t\t\t'validation_class',"},{"line":135,"text":"\t\t\t'validation_method',"},{"line":136,"text":"\t\t\t'advanced',"},{"line":137,"text":"\t\t];"},{"line":138,"text":"\t}"}]],"sha256":"d2a6129dbd3f40dde334388d185aec02a74e33e010b5f81305211f093d1e4e60"},"OptionGroup.php":{"exists":true,"methods":[[{"line":14,"text":"\tpublic function getContainerTag()"},{"line":15,"text":"\t{"},{"line":16,"text":"\t\treturn 'option_groups';"},{"line":17,"text":"\t}"}],[{"line":19,"text":"\tpublic function getChildTag()"},{"line":20,"text":"\t{"},{"line":21,"text":"\t\treturn 'group';"},{"line":22,"text":"\t}"}],[{"line":24,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":25,"text":"\t{"},{"line":26,"text":"\t\t$entries = $this->finder()"},{"line":27,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":28,"text":"\t\t\t->order('group_id')->fetch();"},{"line":29,"text":""},{"line":30,"text":"\t\tforeach ($entries AS $entry)"},{"line":31,"text":"\t\t{"},{"line":32,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":33,"text":""},{"line":34,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":35,"text":""},{"line":36,"text":"\t\t\t$container->appendChild($node);"},{"line":37,"text":"\t\t}"},{"line":38,"text":""},{"line":39,"text":"\t\treturn $entries->count() ? true : false;"},{"line":40,"text":"\t}"}],[{"line":42,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":43,"text":"\t{"},{"line":44,"text":"\t\t$startTime = microtime(true);"},{"line":45,"text":""},{"line":46,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":47,"text":"\t\tif (!$entries)"},{"line":48,"text":"\t\t{"},{"line":49,"text":"\t\t\treturn false;"},{"line":50,"text":"\t\t}"},{"line":51,"text":""},{"line":52,"text":"\t\t$ids = $this->pluckXmlAttribute($entries, 'group_id');"},{"line":53,"text":"\t\t$existing = $this->findByIds($ids);"},{"line":54,"text":""},{"line":55,"text":"\t\t$i = 0;"},{"line":56,"text":"\t\t$last = 0;"},{"line":57,"text":"\t\tforeach ($entries AS $entry)"},{"line":58,"text":"\t\t{"},{"line":59,"text":"\t\t\t$id = $ids[$i++];"},{"line":60,"text":""},{"line":61,"text":"\t\t\tif ($i <= $start)"},{"line":62,"text":"\t\t\t{"},{"line":63,"text":"\t\t\t\tcontinue;"},{"line":64,"text":"\t\t\t}"},{"line":65,"text":""},{"line":66,"text":"\t\t\t$entity = $existing[$id] ?? $this->create();"},{"line":67,"text":""},{"line":68,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":69,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":70,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":71,"text":""},{"line":72,"text":"\t\t\t$entity->save(true, false);"},{"line":73,"text":""},{"line":74,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":75,"text":"\t\t\t{"},{"line":76,"text":"\t\t\t\t$last = $i;"},{"line":77,"text":"\t\t\t\tbreak;"},{"line":78,"text":"\t\t\t}"},{"line":79,"text":"\t\t}"},{"line":80,"text":"\t\treturn ($last ?: false);"},{"line":81,"text":"\t}"}],[{"line":88,"text":"\tprotected function getMappedAttributes()"},{"line":89,"text":"\t{"},{"line":90,"text":"\t\treturn ["},{"line":91,"text":"\t\t\t'group_id',"},{"line":92,"text":"\t\t\t'icon',"},{"line":93,"text":"\t\t\t'display_order',"},{"line":94,"text":"\t\t\t'debug_only',"},{"line":95,"text":"\t\t];"},{"line":96,"text":"\t}"}]],"sha256":"9d75fc1cf5be6c69063ecaed7e0d89a5a2e29ff560e6e57125b59f90405718da"},"Permission.php":{"exists":true,"methods":[[{"line":18,"text":"\tpublic function getContainerTag()"},{"line":19,"text":"\t{"},{"line":20,"text":"\t\treturn 'permissions';"},{"line":21,"text":"\t}"}],[{"line":23,"text":"\tpublic function getChildTag()"},{"line":24,"text":"\t{"},{"line":25,"text":"\t\treturn 'permission';"},{"line":26,"text":"\t}"}],[{"line":28,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":29,"text":"\t{"},{"line":30,"text":"\t\t$entries = $this->finder()"},{"line":31,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":32,"text":"\t\t\t->order(['permission_group_id', 'permission_id'])->fetch();"},{"line":33,"text":""},{"line":34,"text":"\t\tforeach ($entries AS $entry)"},{"line":35,"text":"\t\t{"},{"line":36,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":37,"text":""},{"line":38,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":39,"text":""},{"line":40,"text":"\t\t\t$container->appendChild($node);"},{"line":41,"text":"\t\t}"},{"line":42,"text":""},{"line":43,"text":"\t\treturn $entries->count() ? true : false;"},{"line":44,"text":"\t}"}],[{"line":46,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":47,"text":"\t{"},{"line":48,"text":"\t\t$startTime = microtime(true);"},{"line":49,"text":""},{"line":50,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":51,"text":"\t\tif (!$entries)"},{"line":52,"text":"\t\t{"},{"line":53,"text":"\t\t\treturn false;"},{"line":54,"text":"\t\t}"},{"line":55,"text":""},{"line":56,"text":"\t\t$conditions = [];"},{"line":57,"text":"\t\tforeach ($entries AS $entry)"},{"line":58,"text":"\t\t{"},{"line":59,"text":"\t\t\t$conditions[] = ["},{"line":60,"text":"\t\t\t\t'permission_group_id' => (string) $entry['permission_group_id'],"},{"line":61,"text":"\t\t\t\t'permission_id' => (string) $entry['permission_id'],"},{"line":62,"text":"\t\t\t];"},{"line":63,"text":"\t\t}"},{"line":64,"text":"\t\tif ($conditions)"},{"line":65,"text":"\t\t{"},{"line":66,"text":"\t\t\t$existing = $this->finder()->whereOr($conditions)->fetch()->groupBy('permission_group_id', 'permission_id');"},{"line":67,"text":"\t\t}"},{"line":68,"text":"\t\telse"},{"line":69,"text":"\t\t{"},{"line":70,"text":"\t\t\t$existing = [];"},{"line":71,"text":"\t\t}"},{"line":72,"text":""},{"line":73,"text":"\t\t$i = 0;"},{"line":74,"text":"\t\t$last = 0;"},{"line":75,"text":"\t\tforeach ($entries AS $entry)"},{"line":76,"text":"\t\t{"},{"line":77,"text":"\t\t\t$i++;"},{"line":78,"text":""},{"line":79,"text":"\t\t\tif ($i <= $start)"},{"line":80,"text":"\t\t\t{"},{"line":81,"text":"\t\t\t\tcontinue;"},{"line":82,"text":"\t\t\t}"},{"line":83,"text":""},{"line":84,"text":"\t\t\t$groupId = (string) $entry['permission_group_id'];"},{"line":85,"text":"\t\t\t$permissionId = (string) $entry['permission_id'];"},{"line":86,"text":"\t\t\t$entity = $existing[$groupId][$permissionId] ?? $this->create();"},{"line":87,"text":""},{"line":88,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":89,"text":"\t\t\t$entity->setOption('dependent_check', false);"},{"line":90,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":91,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":92,"text":""},{"line":93,"text":"\t\t\t$entity->save(true, false);"},{"line":94,"text":""},{"line":95,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":96,"text":"\t\t\t{"},{"line":97,"text":"\t\t\t\t$last = $i;"},{"line":98,"text":"\t\t\t\tbreak;"},{"line":99,"text":"\t\t\t}"},{"line":100,"text":"\t\t}"},{"line":101,"text":"\t\treturn ($last ?: false);"},{"line":102,"text":"\t}"}],[{"line":149,"text":"\tprotected function getMappedAttributes()"},{"line":150,"text":"\t{"},{"line":151,"text":"\t\treturn ["},{"line":152,"text":"\t\t\t'permission_group_id',"},{"line":153,"text":"\t\t\t'permission_id',"},{"line":154,"text":"\t\t\t'permission_type',"},{"line":155,"text":"\t\t\t'depend_permission_id',"},{"line":156,"text":"\t\t\t'interface_group_id',"},{"line":157,"text":"\t\t\t'display_order',"},{"line":158,"text":"\t\t];"},{"line":159,"text":"\t}"}]],"sha256":"8d6b8657e8585eb8da7f1401df882e0033f93e07179ce4df398b95d22d74c477"},"PermissionInterfaceGroup.php":{"exists":true,"methods":[[{"line":15,"text":"\tpublic function getContainerTag()"},{"line":16,"text":"\t{"},{"line":17,"text":"\t\treturn 'permission_interface_groups';"},{"line":18,"text":"\t}"}],[{"line":20,"text":"\tpublic function getChildTag()"},{"line":21,"text":"\t{"},{"line":22,"text":"\t\treturn 'interface_group';"},{"line":23,"text":"\t}"}],[{"line":25,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":26,"text":"\t{"},{"line":27,"text":"\t\t$entries = $this->finder()"},{"line":28,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":29,"text":"\t\t\t->order('interface_group_id')->fetch();"},{"line":30,"text":""},{"line":31,"text":"\t\tforeach ($entries AS $entry)"},{"line":32,"text":"\t\t{"},{"line":33,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":34,"text":""},{"line":35,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":36,"text":""},{"line":37,"text":"\t\t\t$container->appendChild($node);"},{"line":38,"text":"\t\t}"},{"line":39,"text":""},{"line":40,"text":"\t\treturn $entries->count() ? true : false;"},{"line":41,"text":"\t}"}],[{"line":43,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":44,"text":"\t{"},{"line":45,"text":"\t\t$startTime = microtime(true);"},{"line":46,"text":""},{"line":47,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":48,"text":"\t\tif (!$entries)"},{"line":49,"text":"\t\t{"},{"line":50,"text":"\t\t\treturn false;"},{"line":51,"text":"\t\t}"},{"line":52,"text":""},{"line":53,"text":"\t\t$ids = $this->pluckXmlAttribute($entries, 'interface_group_id');"},{"line":54,"text":"\t\t$existing = $this->findByIds($ids);"},{"line":55,"text":""},{"line":56,"text":"\t\t$i = 0;"},{"line":57,"text":"\t\t$last = 0;"},{"line":58,"text":"\t\tforeach ($entries AS $entry)"},{"line":59,"text":"\t\t{"},{"line":60,"text":"\t\t\t$id = $ids[$i++];"},{"line":61,"text":""},{"line":62,"text":"\t\t\tif ($i <= $start)"},{"line":63,"text":"\t\t\t{"},{"line":64,"text":"\t\t\t\tcontinue;"},{"line":65,"text":"\t\t\t}"},{"line":66,"text":""},{"line":67,"text":"\t\t\t$entity = $existing[$id] ?? $this->create();"},{"line":68,"text":""},{"line":69,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":70,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":71,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":72,"text":""},{"line":73,"text":"\t\t\t$entity->save(true, false);"},{"line":74,"text":""},{"line":75,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":76,"text":"\t\t\t{"},{"line":77,"text":"\t\t\t\t$last = $i;"},{"line":78,"text":"\t\t\t\tbreak;"},{"line":79,"text":"\t\t\t}"},{"line":80,"text":"\t\t}"},{"line":81,"text":"\t\treturn ($last ?: false);"},{"line":82,"text":"\t}"}],[{"line":95,"text":"\tprotected function getMappedAttributes()"},{"line":96,"text":"\t{"},{"line":97,"text":"\t\treturn ["},{"line":98,"text":"\t\t\t'interface_group_id',"},{"line":99,"text":"\t\t\t'display_order',"},{"line":100,"text":"\t\t\t'is_moderator',"},{"line":101,"text":"\t\t];"},{"line":102,"text":"\t}"}]],"sha256":"b2b1397ba1dc3174f680ebe4796a88904aa577db969177485d56cd7568c1f8d6"},"Phrase.php":{"exists":true,"methods":[[{"line":16,"text":"\tpublic function getContainerTag()"},{"line":17,"text":"\t{"},{"line":18,"text":"\t\treturn 'phrases';"},{"line":19,"text":"\t}"}],[{"line":21,"text":"\tpublic function getChildTag()"},{"line":22,"text":"\t{"},{"line":23,"text":"\t\treturn 'phrase';"},{"line":24,"text":"\t}"}],[{"line":26,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":27,"text":"\t{"},{"line":28,"text":"\t\t$entries = $this->finder()"},{"line":29,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":30,"text":"\t\t\t->where('language_id', 0)"},{"line":31,"text":"\t\t\t->order('title')->fetch();"},{"line":32,"text":"\t\tforeach ($entries AS $entry)"},{"line":33,"text":"\t\t{"},{"line":34,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":35,"text":""},{"line":36,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":37,"text":"\t\t\tif ($entry['global_cache'])"},{"line":38,"text":"\t\t\t{"},{"line":39,"text":"\t\t\t\t$node->setAttribute('global_cache', '1');"},{"line":40,"text":"\t\t\t}"},{"line":41,"text":"\t\t\t$this->exportCdata($node, $entry->phrase_text);"},{"line":42,"text":""},{"line":43,"text":"\t\t\t$container->appendChild($node);"},{"line":44,"text":"\t\t}"},{"line":45,"text":""},{"line":46,"text":"\t\treturn $entries->count() ? true : false;"},{"line":47,"text":"\t}"}],[{"line":49,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":50,"text":"\t{"},{"line":51,"text":"\t\t$startTime = microtime(true);"},{"line":52,"text":""},{"line":53,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":54,"text":"\t\tif (!$entries)"},{"line":55,"text":"\t\t{"},{"line":56,"text":"\t\t\treturn false;"},{"line":57,"text":"\t\t}"},{"line":58,"text":""},{"line":59,"text":"\t\t$ids = $this->pluckXmlAttribute($entries, 'title');"},{"line":60,"text":""},{"line":61,"text":"\t\t// This chucking approach has been taken due to a MariaDB performance regression with large"},{"line":62,"text":"\t\t// IN clauses (see #187523). However, this may have benefits on some slower servers as this"},{"line":63,"text":"\t\t// will reduce the number of times we attempt to instantiate phrase entities that won't be"},{"line":64,"text":"\t\t// processed in this run."},{"line":65,"text":"\t\t$chunkSize = 200;"},{"line":66,"text":"\t\t$nextFetch = null;"},{"line":67,"text":""},{"line":68,"text":"\t\t$i = 0;"},{"line":69,"text":"\t\t$last = 0;"},{"line":70,"text":"\t\tforeach ($entries AS $entry)"},{"line":71,"text":"\t\t{"},{"line":72,"text":"\t\t\t$originalI = $i;"},{"line":73,"text":""},{"line":74,"text":"\t\t\t$id = $ids[$i++];"},{"line":75,"text":""},{"line":76,"text":"\t\t\tif ($i <= $start)"},{"line":77,"text":"\t\t\t{"},{"line":78,"text":"\t\t\t\tcontinue;"},{"line":79,"text":"\t\t\t}"},{"line":80,"text":""},{"line":81,"text":"\t\t\tif ($nextFetch === null || $originalI >= $nextFetch)"},{"line":82,"text":"\t\t\t{"},{"line":83,"text":"\t\t\t\t$slice = array_slice($ids, $originalI, $chunkSize);"},{"line":84,"text":"\t\t\t\t$nextFetch = $originalI + $chunkSize;"},{"line":85,"text":""},{"line":86,"text":"\t\t\t\t$existing = $this->finder()"},{"line":87,"text":"\t\t\t\t\t->where('title', $slice)"},{"line":88,"text":"\t\t\t\t\t->where('language_id', 0)"},{"line":89,"text":"\t\t\t\t\t->keyedBy('title')"},{"line":90,"text":"\t\t\t\t\t->fetch();"},{"line":91,"text":"\t\t\t}"},{"line":92,"text":""},{"line":93,"text":"\t\t\t$entity = $existing[$id] ?? $this->create();"},{"line":94,"text":"\t\t\t$entity->setOption('check_duplicate', false);"},{"line":95,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":96,"text":""},{"line":97,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":98,"text":"\t\t\t$entity->language_id = 0;"},{"line":99,"text":"\t\t\t$entity->global_cache = (int) $entry['global_cache'];"},{"line":100,"text":"\t\t\t$entity->phrase_text = $this->getCdataValue($entry);"},{"line":101,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":102,"text":"\t\t\t$entity->save(true, false);"},{"line":103,"text":""},{"line":104,"text":"\t\t\t\\XF::dequeueRunOnce('styleLastModifiedDate');"},{"line":105,"text":""},{"line":106,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":107,"text":"\t\t\t{"},{"line":108,"text":"\t\t\t\t$last = $i;"},{"line":109,"text":"\t\t\t\tbreak;"},{"line":110,"text":"\t\t\t}"},{"line":111,"text":"\t\t}"},{"line":112,"text":""},{"line":113,"text":"\t\treturn ($last ?: false);"},{"line":114,"text":"\t}"}],[{"line":121,"text":"\tprotected function getMappedAttributes()"},{"line":122,"text":"\t{"},{"line":123,"text":"\t\treturn ["},{"line":124,"text":"\t\t\t'title',"},{"line":125,"text":"\t\t\t'version_id',"},{"line":126,"text":"\t\t\t'version_string',"},{"line":127,"text":"\t\t];"},{"line":128,"text":"\t}"}]],"sha256":"af1d53936447b820d9f3dc3e50a7058dfe96890417f5fd466fb1361d99988266"},"Route.php":{"exists":true,"methods":[[{"line":16,"text":"\tpublic function getContainerTag()"},{"line":17,"text":"\t{"},{"line":18,"text":"\t\treturn 'routes';"},{"line":19,"text":"\t}"}],[{"line":21,"text":"\tpublic function getChildTag()"},{"line":22,"text":"\t{"},{"line":23,"text":"\t\treturn 'route';"},{"line":24,"text":"\t}"}],[{"line":26,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":27,"text":"\t{"},{"line":28,"text":"\t\t$entries = $this->finder()"},{"line":29,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":30,"text":"\t\t\t->order(['route_type', 'route_prefix', 'sub_name'])->fetch();"},{"line":31,"text":"\t\tforeach ($entries AS $entry)"},{"line":32,"text":"\t\t{"},{"line":33,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":34,"text":""},{"line":35,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":36,"text":""},{"line":37,"text":"\t\t\t$container->appendChild($node);"},{"line":38,"text":"\t\t}"},{"line":39,"text":""},{"line":40,"text":"\t\treturn $entries->count() ? true : false;"},{"line":41,"text":"\t}"}],[{"line":43,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":44,"text":"\t{"},{"line":45,"text":"\t\t$startTime = microtime(true);"},{"line":46,"text":""},{"line":47,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":48,"text":"\t\tif (!$entries)"},{"line":49,"text":"\t\t{"},{"line":50,"text":"\t\t\treturn false;"},{"line":51,"text":"\t\t}"},{"line":52,"text":""},{"line":53,"text":"\t\t$conditions = [];"},{"line":54,"text":"\t\t$existing = [];"},{"line":55,"text":"\t\tforeach ($entries AS $entry)"},{"line":56,"text":"\t\t{"},{"line":57,"text":"\t\t\t$conditions[] = ["},{"line":58,"text":"\t\t\t\t'route_type' => (string) $entry['route_type'],"},{"line":59,"text":"\t\t\t\t'route_prefix' => (string) $entry['route_prefix'],"},{"line":60,"text":"\t\t\t\t'sub_name' => (string) $entry['sub_name'],"},{"line":61,"text":"\t\t\t];"},{"line":62,"text":"\t\t}"},{"line":63,"text":"\t\tif ($conditions)"},{"line":64,"text":"\t\t{"},{"line":65,"text":"\t\t\tforeach ($this->finder()->whereOr($conditions)->fetch() AS $route)"},{"line":66,"text":"\t\t\t{"},{"line":67,"text":"\t\t\t\t$existing[$route->route_type][$route->route_prefix][$route->sub_name] = $route;"},{"line":68,"text":"\t\t\t}"},{"line":69,"text":"\t\t}"},{"line":70,"text":""},{"line":71,"text":"\t\t$i = 0;"},{"line":72,"text":"\t\t$last = 0;"},{"line":73,"text":"\t\tforeach ($entries AS $entry)"},{"line":74,"text":"\t\t{"},{"line":75,"text":"\t\t\t$i++;"},{"line":76,"text":""},{"line":77,"text":"\t\t\tif ($i <= $start)"},{"line":78,"text":"\t\t\t{"},{"line":79,"text":"\t\t\t\tcontinue;"},{"line":80,"text":"\t\t\t}"},{"line":81,"text":""},{"line":82,"text":"\t\t\t$type = (string) $entry['route_type'];"},{"line":83,"text":"\t\t\t$prefix = (string) $entry['route_prefix'];"},{"line":84,"text":"\t\t\t$subName = (string) $entry['sub_name'];"},{"line":85,"text":"\t\t\t$entity = $existing[$type][$prefix][$subName] ?? $this->create();"},{"line":86,"text":""},{"line":87,"text":"\t\t\t$entity->setOptions(["},{"line":88,"text":"\t\t\t\t'check_duplicate' => false,"},{"line":89,"text":"\t\t\t]);"},{"line":90,"text":""},{"line":91,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":92,"text":""},{"line":93,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":94,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":95,"text":"\t\t\t$entity->save(true, false);"},{"line":96,"text":""},{"line":97,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":98,"text":"\t\t\t{"},{"line":99,"text":"\t\t\t\t$last = $i;"},{"line":100,"text":"\t\t\t\tbreak;"},{"line":101,"text":"\t\t\t}"},{"line":102,"text":"\t\t}"},{"line":103,"text":"\t\treturn ($last ?: false);"},{"line":104,"text":"\t}"}],[{"line":154,"text":"\tprotected function getMappedAttributes()"},{"line":155,"text":"\t{"},{"line":156,"text":"\t\treturn ["},{"line":157,"text":"\t\t\t'route_type',"},{"line":158,"text":"\t\t\t'route_prefix',"},{"line":159,"text":"\t\t\t'sub_name',"},{"line":160,"text":"\t\t\t'format',"},{"line":161,"text":"\t\t\t'build_class',"},{"line":162,"text":"\t\t\t'build_method',"},{"line":163,"text":"\t\t\t'controller',"},{"line":164,"text":"\t\t\t'context',"},{"line":165,"text":"\t\t\t'action_prefix',"},{"line":166,"text":"\t\t];"},{"line":167,"text":"\t}"}]],"sha256":"ffd5dc9411b761a264810af2241af71c553ab2b409f670305687e9d4d75a34bb"},"Template.php":{"exists":true,"methods":[[{"line":15,"text":"\tpublic function getContainerTag()"},{"line":16,"text":"\t{"},{"line":17,"text":"\t\treturn 'templates';"},{"line":18,"text":"\t}"}],[{"line":20,"text":"\tpublic function getChildTag()"},{"line":21,"text":"\t{"},{"line":22,"text":"\t\treturn 'template';"},{"line":23,"text":"\t}"}],[{"line":25,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":26,"text":"\t{"},{"line":27,"text":"\t\t$entries = $this->finder()"},{"line":28,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":29,"text":"\t\t\t->where('style_id', 0)"},{"line":30,"text":"\t\t\t->order(['type', 'title'])->fetch();"},{"line":31,"text":"\t\tforeach ($entries AS $entry)"},{"line":32,"text":"\t\t{"},{"line":33,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":34,"text":""},{"line":35,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":36,"text":"\t\t\t$this->exportCdata($node, $entry->template);"},{"line":37,"text":""},{"line":38,"text":"\t\t\t$container->appendChild($node);"},{"line":39,"text":"\t\t}"},{"line":40,"text":""},{"line":41,"text":"\t\treturn $entries->count() ? true : false;"},{"line":42,"text":"\t}"}],[{"line":44,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":45,"text":"\t{"},{"line":46,"text":"\t\t$startTime = microtime(true);"},{"line":47,"text":""},{"line":48,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":49,"text":"\t\tif (!$entries)"},{"line":50,"text":"\t\t{"},{"line":51,"text":"\t\t\treturn false;"},{"line":52,"text":"\t\t}"},{"line":53,"text":""},{"line":54,"text":"\t\t$conditions = [];"},{"line":55,"text":"\t\tforeach ($entries AS $entry)"},{"line":56,"text":"\t\t{"},{"line":57,"text":"\t\t\t$conditions[] = ["},{"line":58,"text":"\t\t\t\t'type' => (string) $entry['type'],"},{"line":59,"text":"\t\t\t\t'title' => (string) $entry['title'],"},{"line":60,"text":"\t\t\t];"},{"line":61,"text":"\t\t}"},{"line":62,"text":"\t\tif ($conditions)"},{"line":63,"text":"\t\t{"},{"line":64,"text":"\t\t\t$existing = $this->finder()"},{"line":65,"text":"\t\t\t\t->whereOr($conditions)"},{"line":66,"text":"\t\t\t\t->where('style_id', 0)"},{"line":67,"text":"\t\t\t\t->fetch()"},{"line":68,"text":"\t\t\t\t->groupBy('type', 'title');"},{"line":69,"text":"\t\t}"},{"line":70,"text":"\t\telse"},{"line":71,"text":"\t\t{"},{"line":72,"text":"\t\t\t$existing = [];"},{"line":73,"text":"\t\t}"},{"line":74,"text":""},{"line":75,"text":"\t\t$i = 0;"},{"line":76,"text":"\t\t$last = 0;"},{"line":77,"text":""},{"line":78,"text":"\t\tforeach ($entries AS $entry)"},{"line":79,"text":"\t\t{"},{"line":80,"text":"\t\t\t$i++;"},{"line":81,"text":""},{"line":82,"text":"\t\t\tif ($i <= $start)"},{"line":83,"text":"\t\t\t{"},{"line":84,"text":"\t\t\t\tcontinue;"},{"line":85,"text":"\t\t\t}"},{"line":86,"text":""},{"line":87,"text":"\t\t\t$type = (string) $entry['type'];"},{"line":88,"text":"\t\t\t$title = (string) $entry['title'];"},{"line":89,"text":"\t\t\t$entity = $existing[$type][$title] ?? $this->create();"},{"line":90,"text":"\t\t\t$entity->setOption('check_duplicate', false);"},{"line":91,"text":"\t\t\t$entity->setOption('report_modification_errors', false);"},{"line":92,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":93,"text":""},{"line":94,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":95,"text":"\t\t\t$entity->style_id = 0;"},{"line":96,"text":"\t\t\t$entity->template = $this->getCdataValue($entry);"},{"line":97,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":98,"text":"\t\t\t$entity->save(true, false);"},{"line":99,"text":""},{"line":100,"text":"\t\t\t\\XF::dequeueRunOnce('styleLastModifiedDate');"},{"line":101,"text":""},{"line":102,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":103,"text":"\t\t\t{"},{"line":104,"text":"\t\t\t\t$last = $i;"},{"line":105,"text":"\t\t\t\tbreak;"},{"line":106,"text":"\t\t\t}"},{"line":107,"text":"\t\t}"},{"line":108,"text":"\t\treturn ($last ?: false);"},{"line":109,"text":"\t}"}],[{"line":156,"text":"\tprotected function getMappedAttributes()"},{"line":157,"text":"\t{"},{"line":158,"text":"\t\treturn ["},{"line":159,"text":"\t\t\t'type',"},{"line":160,"text":"\t\t\t'title',"},{"line":161,"text":"\t\t\t'version_id',"},{"line":162,"text":"\t\t\t'version_string',"},{"line":163,"text":"\t\t];"},{"line":164,"text":"\t}"}]],"sha256":"fecae5772cfd98cb53672180957a3a50a521d6ee6194dd5d7a346630afb3933a"},"TemplateModification.php":{"exists":true,"methods":[[{"line":18,"text":"\tpublic function getContainerTag()"},{"line":19,"text":"\t{"},{"line":20,"text":"\t\treturn 'template_modifications';"},{"line":21,"text":"\t}"}],[{"line":23,"text":"\tpublic function getChildTag()"},{"line":24,"text":"\t{"},{"line":25,"text":"\t\treturn 'modification';"},{"line":26,"text":"\t}"}],[{"line":28,"text":"\tpublic function exportAddOnData($addOnId, \\DOMElement $container)"},{"line":29,"text":"\t{"},{"line":30,"text":"\t\t$entries = $this->finder()"},{"line":31,"text":"\t\t\t->where('addon_id', $addOnId)"},{"line":32,"text":"\t\t\t->order(['template', 'modification_key'])->fetch();"},{"line":33,"text":"\t\tforeach ($entries AS $entry)"},{"line":34,"text":"\t\t{"},{"line":35,"text":"\t\t\t$node = $container->ownerDocument->createElement($this->getChildTag());"},{"line":36,"text":""},{"line":37,"text":"\t\t\t$this->exportMappedAttributes($node, $entry);"},{"line":38,"text":""},{"line":39,"text":"\t\t\t$this->exportCdataToNewNode($node, 'find', $entry);"},{"line":40,"text":"\t\t\t$this->exportCdataToNewNode($node, 'replace', $entry);"},{"line":41,"text":""},{"line":42,"text":"\t\t\t$container->appendChild($node);"},{"line":43,"text":"\t\t}"},{"line":44,"text":""},{"line":45,"text":"\t\treturn $entries->count() ? true : false;"},{"line":46,"text":"\t}"}],[{"line":48,"text":"\tpublic function importAddOnData($addOnId, \\SimpleXMLElement $container, $start = 0, $maxRunTime = 0)"},{"line":49,"text":"\t{"},{"line":50,"text":"\t\t$startTime = microtime(true);"},{"line":51,"text":""},{"line":52,"text":"\t\t$entries = $this->getEntries($container, $start);"},{"line":53,"text":"\t\tif (!$entries)"},{"line":54,"text":"\t\t{"},{"line":55,"text":"\t\t\treturn false;"},{"line":56,"text":"\t\t}"},{"line":57,"text":""},{"line":58,"text":"\t\t$keys = $this->pluckXmlAttribute($entries, 'modification_key');"},{"line":59,"text":"\t\t$existing = $this->finder()"},{"line":60,"text":"\t\t\t->where('modification_key', $keys)"},{"line":61,"text":"\t\t\t->keyedBy('modification_key')"},{"line":62,"text":"\t\t\t->fetch();"},{"line":63,"text":""},{"line":64,"text":"\t\t$i = 0;"},{"line":65,"text":"\t\t$last = 0;"},{"line":66,"text":"\t\tforeach ($entries AS $entry)"},{"line":67,"text":"\t\t{"},{"line":68,"text":"\t\t\t$i++;"},{"line":69,"text":""},{"line":70,"text":"\t\t\tif ($i <= $start)"},{"line":71,"text":"\t\t\t{"},{"line":72,"text":"\t\t\t\tcontinue;"},{"line":73,"text":"\t\t\t}"},{"line":74,"text":""},{"line":75,"text":"\t\t\t$entity = $existing[(string) $entry['modification_key']] ?? $this->create();"},{"line":76,"text":"\t\t\t$entity->getBehavior(DevOutputWritable::class)->setOption('write_dev_output', false);"},{"line":77,"text":"\t\t\t$entity->setOption('hide_errors', true);"},{"line":78,"text":""},{"line":79,"text":"\t\t\t$this->importMappedAttributes($entry, $entity);"},{"line":80,"text":""},{"line":81,"text":"\t\t\t$entity->find = $this->getCdataValue($entry->find);"},{"line":82,"text":"\t\t\t$entity->replace = $this->getCdataValue($entry->replace);"},{"line":83,"text":""},{"line":84,"text":"\t\t\t$entity->addon_id = $addOnId;"},{"line":85,"text":"\t\t\t$entity->save(true, false);"},{"line":86,"text":""},{"line":87,"text":"\t\t\t\\XF::dequeueRunOnce('styleLastModifiedDate');"},{"line":88,"text":""},{"line":89,"text":"\t\t\tif ($this->resume($maxRunTime, $startTime))"},{"line":90,"text":"\t\t\t{"},{"line":91,"text":"\t\t\t\t$last = $i;"},{"line":92,"text":"\t\t\t\tbreak;"},{"line":93,"text":"\t\t\t}"},{"line":94,"text":"\t\t}"},{"line":95,"text":"\t\treturn ($last ?: false);"},{"line":96,"text":"\t}"}],[{"line":140,"text":"\tprotected function getMappedAttributes()"},{"line":141,"text":"\t{"},{"line":142,"text":"\t\treturn ["},{"line":143,"text":"\t\t\t'type',"},{"line":144,"text":"\t\t\t'template',"},{"line":145,"text":"\t\t\t'modification_key',"},{"line":146,"text":"\t\t\t'description',"},{"line":147,"text":"\t\t\t'execution_order',"},{"line":148,"text":"\t\t\t'enabled',"},{"line":149,"text":"\t\t\t'action',"},{"line":150,"text":"\t\t];"},{"line":151,"text":"\t}"}]],"sha256":"c27e2bb5baa379dcaf0eab73f35fcc62f5ce656fbccbcb4d6ded095d83b4b31a"}},"db":{"addon_rows":0,"board_active":"0","content_type_field_rows":0,"error_count_after_baseline":0,"error_max":43,"listener_addon_rows":0,"option_group_rows":0,"option_rows":0,"permission_rows":0,"phrase_addon_rows":0,"phrase_prefix_rows":0,"route_addon_rows":0,"route_prefix_rows":0,"table_rows":0,"template_addon_rows":0,"template_mod_addon_rows":0,"template_prefix_rows":0},"db_probe":{"rc":0,"stderr_sha256":"","stdout_lines":1},"error_probe":{"rc":0,"stderr_sha256":"","stdout_lines":1},"errors_after_baseline":[],"guest":"newfi-staging","identity_ok":true,"lifecycle_contract":{"src/XF/AddOn/AbstractSetup.php":{"blocks":[[{"line":25,"text":"\tabstract public function install(array $stepParams = []);"},{"line":26,"text":""},{"line":27,"text":"\t/**"},{"line":28,"text":"\t * @param array $stepParams"},{"line":29,"text":"\t *"},{"line":30,"text":"\t * @return null|StepResult"},{"line":31,"text":"\t */"},{"line":32,"text":"\tabstract public function upgrade(array $stepParams = []);"},{"line":33,"text":""},{"line":34,"text":"\t/**"},{"line":35,"text":"\t * @param array $stepParams"},{"line":36,"text":"\t *"},{"line":37,"text":"\t * @return null|StepResult"},{"line":38,"text":"\t */"},{"line":39,"text":"\tabstract public function uninstall(array $stepParams = []);"},{"line":40,"text":""},{"line":41,"text":"\tpublic function __construct(AddOn $addOn, App $app)"},{"line":42,"text":"\t{"},{"line":43,"text":"\t\t$this->addOn = $addOn;"},{"line":44,"text":"\t\t$this->app = $app;"},{"line":45,"text":"\t}"}],[{"line":39,"text":"\tabstract public function uninstall(array $stepParams = []);"},{"line":40,"text":""},{"line":41,"text":"\tpublic function __construct(AddOn $addOn, App $app)"},{"line":42,"text":"\t{"},{"line":43,"text":"\t\t$this->addOn = $addOn;"},{"line":44,"text":"\t\t$this->app = $app;"},{"line":45,"text":"\t}"}]],"exists":true,"sha256":"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88"},"src/XF/AddOn/AddOn.php":{"blocks":[[{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""},{"line":559,"text":"\t\t\t$installed = \\XF::em()->create(\\XF\\Entity\\AddOn::class);"},{"line":560,"text":"\t\t\t$installed->bulkSet(["},{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"},{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"}],[{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"}],[{"line":644,"text":"\tpublic function preUninstall()"},{"line":645,"text":"\t{"},{"line":646,"text":"\t\t$installed = $this->installedAddOn;"},{"line":647,"text":"\t\tif (!$installed)"},{"line":648,"text":"\t\t{"},{"line":649,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":650,"text":"\t\t}"},{"line":651,"text":""},{"line":652,"text":"\t\t$installed->is_processing = true;"},{"line":653,"text":"\t\t$installed->last_pending_action = 'uninstall:0';"},{"line":654,"text":"\t\t$installed->saveIfChanged();"},{"line":655,"text":""},{"line":656,"text":"\t\t$json = $this->getJson();"},{"line":657,"text":"\t\t\\XF::fire('addon_pre_uninstall', [$this, $installed, $json], $installed->addon_id);"},{"line":658,"text":"\t}"}],[{"line":660,"text":"\tpublic function postUninstall()"},{"line":661,"text":"\t{"},{"line":662,"text":"\t\t/** @var FileCheck $fileCheck */"},{"line":663,"text":"\t\t$fileCheck = \\XF::em()->create(FileCheck::class);"},{"line":664,"text":"\t\t$fileCheck->save();"},{"line":665,"text":""},{"line":666,"text":"\t\t\\XF::app()->jobManager()->enqueueUnique('fileCheck', \\XF\\Job\\FileCheck::class, ["},{"line":667,"text":"\t\t\t'check_id' => $fileCheck->check_id,"},{"line":668,"text":"\t\t\t'automated' => true,"},{"line":669,"text":"\t\t], false);"},{"line":670,"text":""},{"line":671,"text":"\t\t$json = $this->getJson();"},{"line":672,"text":""},{"line":673,"text":"\t\t\\XF::fire('addon_post_uninstall', [$this, $this->addOnId, $json], $this->addOnId);"},{"line":674,"text":"\t}"}]],"exists":true,"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},"src/XF/AddOn/DataManager.php":{"blocks":[[{"line":85,"text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"},{"line":86,"text":"\t{"},{"line":87,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, ["},{"line":88,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":89,"text":"\t\t]);"},{"line":90,"text":"\t}"}]],"exists":true,"sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"},"src/XF/Cli/Command/AddOnInstall.php":{"blocks":[[{"line":36,"text":"\tprotected function execute(InputInterface $input, OutputInterface $output)"},{"line":37,"text":"\t{"},{"line":38,"text":"\t\t$id = $input->getArgument('id');"},{"line":39,"text":""},{"line":40,"text":"\t\t$addOnManager = \\XF::app()->addOnManager();"},{"line":41,"text":""},{"line":42,"text":"\t\tif ($this->isAZipFile($id))"},{"line":43,"text":"\t\t{"},{"line":44,"text":"\t\t\t$id = $this->validateAndExtractAddOnZip($id, $error);"},{"line":45,"text":"\t\t\tif (!$id)"},{"line":46,"text":"\t\t\t{"},{"line":47,"text":"\t\t\t\t$output->writeln('<error>' . $error . '</error>');"},{"line":48,"text":"\t\t\t\treturn 1;"},{"line":49,"text":"\t\t\t}"},{"line":50,"text":"\t\t}"},{"line":51,"text":""},{"line":52,"text":"\t\t$addOn = $addOnManager->getById($id);"},{"line":53,"text":"\t\tif (!$addOn)"},{"line":54,"text":"\t\t{"},{"line":55,"text":"\t\t\t$output->writeln(\"<error>\" . \"The add-on '$id' could be found.\" . \"</error>\");"},{"line":56,"text":"\t\t\treturn 1;"},{"line":57,"text":"\t\t}"},{"line":58,"text":""},{"line":59,"text":"\t\tif (!$addOn->canInstall())"},{"line":60,"text":"\t\t{"},{"line":61,"text":"\t\t\tif ($addOn)"},{"line":62,"text":"\t\t\t{"},{"line":63,"text":"\t\t\t\t$output->writeln(\"<error>\" . \\XF::phrase('this_add_on_already_installed_upgrade_instead') . \"</error>\");"},{"line":64,"text":"\t\t\t}"},{"line":65,"text":"\t\t\telse"},{"line":66,"text":"\t\t\t{"},{"line":67,"text":"\t\t\t\t$output->writeln(\"<error>\" . \\XF::phrase('this_add_on_cannot_be_installed') . \"</error>\");"},{"line":68,"text":"\t\t\t}"},{"line":69,"text":"\t\t\treturn 1;"},{"line":70,"text":"\t\t}"},{"line":71,"text":""},{"line":72,"text":"\t\tif (!$this->verifyAddOnAction($input, $output, $addOn))"},{"line":73,"text":"\t\t{"},{"line":74,"text":"\t\t\treturn 1;"},{"line":75,"text":"\t\t}"},{"line":76,"text":""},{"line":77,"text":"\t\t/** @var QuestionHelper $helper */"},{"line":78,"text":"\t\t$helper = $this->getHelper('question');"},{"line":79,"text":""},{"line":80,"text":"\t\t$question = new ConfirmationQuestion(\"<question>\" . \\XF::phrase('please_confirm_that_you_want_to_install_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)</question>\");"},{"line":81,"text":"\t\t$response = $helper->ask($input, $output, $question);"},{"line":82,"text":"\t\tif (!$response)"},{"line":83,"text":"\t\t{"},{"line":84,"text":"\t\t\treturn 1;"},{"line":85,"text":"\t\t}"},{"line":86,"text":""},{"line":87,"text":"\t\t// make sure any errors get logged here"},{"line":88,"text":"\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":89,"text":""},{"line":90,"text":"\t\t$addOn->preInstall();"},{"line":91,"text":""},{"line":92,"text":"\t\t$this->runSubAction($output, $addOn, 'install');"},{"line":93,"text":"\t\t$this->runSubAction($output, $addOn, 'import');"},{"line":94,"text":"\t\t$this->runSubAction($output, $addOn, 'post-install');"},{"line":95,"text":""},{"line":96,"text":"\t\treturn 0;"},{"line":97,"text":"\t}"}]],"exists":true,"sha256":"2407ad9ae20ca8ac1ca84b456ac2adc537f39c79534da5e258167a4d0df2a54f"},"src/XF/Cli/Command/AddOnUninstall.php":{"blocks":[[{"line":36,"text":"\tprotected function execute(InputInterface $input, OutputInterface $output)"},{"line":37,"text":"\t{"},{"line":38,"text":"\t\t$id = $input->getArgument('id');"},{"line":39,"text":""},{"line":40,"text":"\t\t$addOn = $this->checkInstalledAddOn($id, $error);"},{"line":41,"text":"\t\tif (!$addOn)"},{"line":42,"text":"\t\t{"},{"line":43,"text":"\t\t\t$output->writeln('<error>' . $error . '</error>');"},{"line":44,"text":"\t\t\treturn 1;"},{"line":45,"text":"\t\t}"},{"line":46,"text":""},{"line":47,"text":"\t\tif (!$addOn->canUninstall() && !$input->getOption('force'))"},{"line":48,"text":"\t\t{"},{"line":49,"text":"\t\t\t$output->writeln(\"<error>\" . \\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \"</error>\");"},{"line":50,"text":"\t\t\treturn 1;"},{"line":51,"text":"\t\t}"},{"line":52,"text":""},{"line":53,"text":"\t\t/** @var QuestionHelper $helper */"},{"line":54,"text":"\t\t$helper = $this->getHelper('question');"},{"line":55,"text":""},{"line":56,"text":"\t\t$question = new ConfirmationQuestion(\"<question>\" . \\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)</question>\");"},{"line":57,"text":"\t\t$response = $helper->ask($input, $output, $question);"},{"line":58,"text":"\t\tif (!$response)"},{"line":59,"text":"\t\t{"},{"line":60,"text":"\t\t\treturn 1;"},{"line":61,"text":"\t\t}"},{"line":62,"text":""},{"line":63,"text":"\t\t// make sure any errors get logged here"},{"line":64,"text":"\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":65,"text":""},{"line":66,"text":"\t\t$addOn->preUninstall();"},{"line":67,"text":""},{"line":68,"text":"\t\t$this->runSubAction($output, $addOn, 'uninstall');"},{"line":69,"text":"\t\t$this->runSubAction($output, $addOn, 'uninstall-data');"},{"line":70,"text":"\t\t$this->runSubAction($output, $addOn, 'post-uninstall');"},{"line":71,"text":""},{"line":72,"text":"\t\treturn 0;"},{"line":73,"text":"\t}"}]],"exists":true,"sha256":"6dc768f60efd4af161b549cd54c01ae8922326cf7fd230b8ef93403bf8dba90c"}},"runtime":{"http_code":"503","http_rc":0,"services":{"mariadb":{"rc":0,"state":"active"},"nginx":{"rc":0,"state":"active"},"php8.3-fpm":{"rc":0,"state":"active"}}},"scope":"READ_ONLY_NO_MUTATION","stage039":{"state":"ABSENT"}}
SUPPORT042_RESIDUAL_SUM=0
SUPPORT042_NEW_ERROR_COUNT=0
SUPPORT042_POSTROLLBACK_CLEAN=True
SUPPORT042_DECISION=FORENSIC_CAPTURE_COMPLETE
SUPPORT042_MUTATION_SCOPE=NONE_READ_ONLY
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260909-GRAM-XF-STAGING-FORENSIC-042","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
SUPPORT042_END

OUTPUT_END
CHAT_OUTPUT_END
