 core/core.services.yml                             |  11 ++
 .../Drupal/Core/Profiler/DatabaseDataCollector.php |   0
 .../Drupal/Core/Profiler/ServiceDataCollector.php  |  78 +++++++++++++
 .../install/block.block.bartik_account_menu.yml    |  22 ++++
 .../install/block.block.bartik_breadcrumbs.yml     |  18 +++
 .../config/install/block.block.bartik_content.yml  |  18 +++
 .../config/install/block.block.bartik_footer.yml   |  22 ++++
 .../config/install/block.block.bartik_help.yml     |  18 +++
 .../config/install/block.block.bartik_login.yml    |  18 +++
 .../install/block.block.bartik_main_menu.yml       |  22 ++++
 .../config/install/block.block.bartik_messages.yml |  17 +++
 .../config/install/block.block.bartik_powered.yml  |  18 +++
 .../config/install/block.block.bartik_search.yml   |  18 +++
 .../config/install/block.block.bartik_tools.yml    |  22 ++++
 .../install/block.block.seven_breadcrumbs.yml      |  18 +++
 .../config/install/block.block.seven_content.yml   |  18 +++
 .../config/install/block.block.seven_help.yml      |  18 +++
 .../config/install/block.block.seven_login.yml     |  18 +++
 .../config/install/block.block.seven_messages.yml  |  17 +++
 .../config/install/block_content.type.basic.yml    |   5 +
 .../config/install/comment.type.comment.yml        |   6 +
 .../config/install/contact.form.feedback.yml       |   7 ++
 .../core.base_field_override.node.page.promote.yml |  20 ++++
 ...ty_form_display.block_content.basic.default.yml |  30 +++++
 ...entity_form_display.comment.comment.default.yml |  31 +++++
 ...re.entity_form_display.node.article.default.yml |  85 ++++++++++++++
 .../core.entity_form_display.node.page.default.yml |  62 ++++++++++
 .../core.entity_form_display.user.user.default.yml |  17 +++
 ...ty_view_display.block_content.basic.default.yml |  21 ++++
 ...entity_view_display.comment.comment.default.yml |  23 ++++
 ...re.entity_view_display.node.article.default.yml |  55 +++++++++
 .../core.entity_view_display.node.article.rss.yml  |  26 +++++
 ...ore.entity_view_display.node.article.teaser.yml |  50 +++++++++
 .../core.entity_view_display.node.page.default.yml |  25 +++++
 .../core.entity_view_display.node.page.teaser.yml  |  27 +++++
 .../core.entity_view_display.user.user.compact.yml |  22 ++++
 .../core.entity_view_display.user.user.default.yml |  18 +++
 .../config/install/editor.editor.basic_html.yml    |  48 ++++++++
 .../config/install/editor.editor.full_html.yml     |  60 ++++++++++
 .../field.field.block_content.basic.body.yml       |  22 ++++
 .../field.field.comment.comment.comment_body.yml   |  21 ++++
 .../install/field.field.node.article.body.yml      |  22 ++++
 .../install/field.field.node.article.comment.yml   |  33 ++++++
 .../field.field.node.article.field_image.yml       |  32 ++++++
 .../field.field.node.article.field_tags.yml        |  26 +++++
 .../config/install/field.field.node.page.body.yml  |  22 ++++
 .../install/field.field.user.user.user_picture.yml |  31 +++++
 .../config/install/field.storage.node.comment.yml  |  18 +++
 .../install/field.storage.node.field_image.yml     |  26 +++++
 .../install/field.storage.node.field_tags.yml      |  17 +++
 .../install/field.storage.user.user_picture.yml    |  25 +++++
 .../config/install/filter.format.basic_html.yml    |  50 +++++++++
 .../config/install/filter.format.full_html.yml     |  35 ++++++
 .../install/filter.format.restricted_html.yml      |  36 ++++++
 .../profiling/config/install/node.type.article.yml |   9 ++
 .../profiling/config/install/node.type.page.yml    |   9 ++
 .../config/install/rdf.mapping.comment.comment.yml |  33 ++++++
 .../config/install/rdf.mapping.node.article.yml    |  47 ++++++++
 .../config/install/rdf.mapping.node.page.yml       |  38 +++++++
 .../install/rdf.mapping.taxonomy_term.tags.yml     |  17 +++
 .../profiling/config/install/system.cron.yml       |   4 +
 .../profiling/config/install/system.theme.yml      |   2 +
 .../config/install/taxonomy.vocabulary.tags.yml    |   7 ++
 .../config/install/user.role.administrator.yml     |   5 +
 .../profiling/modules/profiler/profiler.info.yml   |   6 +
 .../modules/profiler/profiler.services.yml         |  16 +++
 .../modules/profiler/src/Compiler/ProfilerPass.php |  38 +++++++
 .../profiler/src/ProfilerServiceProvider.php       |  28 +++++
 core/profiles/profiling/profiling.info.yml         |  46 ++++++++
 core/profiles/profiling/profiling.install          | 105 +++++++++++++++++
 .../profiles/profiling/src/Tests/ProfilingTest.php | 125 +++++++++++++++++++++
 71 files changed, 1980 insertions(+)

diff --git a/core/core.services.yml b/core/core.services.yml
index 4eb462c..84c8c6f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1490,3 +1490,14 @@ services:
     arguments: ['@current_user', '@path.current', '@path.matcher', '@language_manager']
     tags:
       - { name: event_subscriber }
+
+  # Data collectors for profiling.
+  profiler.memory:
+    class: Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector
+    tags:
+      - { name: profiler_data_collector }
+  profiler.service:
+    class: Drupal\Core\Profiler\ServiceDataCollector
+    arguments: ['@service_container']
+    tags:
+      - { name: profiler_data_collector }
diff --git a/core/lib/Drupal/Core/Profiler/DatabaseDataCollector.php b/core/lib/Drupal/Core/Profiler/DatabaseDataCollector.php
new file mode 100644
index 0000000..e69de29
diff --git a/core/lib/Drupal/Core/Profiler/ServiceDataCollector.php b/core/lib/Drupal/Core/Profiler/ServiceDataCollector.php
new file mode 100644
index 0000000..06c3237
--- /dev/null
+++ b/core/lib/Drupal/Core/Profiler/ServiceDataCollector.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Drupal\Core\Profiler;
+
+use Symfony\Component\DependencyInjection\IntrospectableContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+
+class ServiceDataCollector extends DataCollector {
+
+  /**
+   * @var \Symfony\Component\DependencyInjection\IntrospectableContainerInterface
+   */
+  private $container;
+
+  /**
+   * @param \Symfony\Component\DependencyInjection\IntrospectableContainerInterface $container
+   */
+  public function __construct(IntrospectableContainerInterface $container) {
+    $this->container = $container;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function collect(Request $request, Response $response, \Exception $exception = NULL) {
+    $available_services = $this->container->getServiceIds();
+
+    $this->data['available_services'] = $available_services;
+
+    $this->data['initialized_services'] = [];
+    foreach ($available_services as $id) {
+      if ($this->container->initialized($id)) {
+        $this->data['initialized_services'][] = $id;
+      }
+    }
+  }
+
+  /**
+   * Gets the number of available services.
+   *
+   * @return int
+   */
+  public function getServicesCount() {
+    return count($this->data['available_services']);
+  }
+
+  /**
+   * Gets the number of initialized services.
+   *
+   * @return int
+   */
+  public function getInitializedServicesCount() {
+    return count($this->data['initialized_services']);
+  }
+
+  /**
+   * @return int
+   */
+  public function getInitializedServicesWithoutProfilerServices() {
+    $count = 0;
+    foreach ($this->data['initialized_services'] as $service) {
+      if (strpos($service, 'profiler') !== 0) {
+        $count++;
+      }
+    }
+    return $count;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getName() {
+    return 'service';
+  }
+
+}
diff --git a/core/profiles/profiling/config/install/block.block.bartik_account_menu.yml b/core/profiles/profiling/config/install/block.block.bartik_account_menu.yml
new file mode 100644
index 0000000..ef0f44c
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_account_menu.yml
@@ -0,0 +1,22 @@
+id: bartik_account_menu
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: secondary_menu
+plugin: 'system_menu_block:account'
+settings:
+  id: 'system_menu_block:account'
+  label: 'User account menu'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 1
+dependencies:
+  config:
+    - system.menu.account
+  module:
+    - system
+  theme:
+    - bartik
+visibility: { }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_breadcrumbs.yml b/core/profiles/profiling/config/install/block.block.bartik_breadcrumbs.yml
new file mode 100644
index 0000000..5589c10
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_breadcrumbs.yml
@@ -0,0 +1,18 @@
+id: bartik_breadcrumbs
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: breadcrumb
+plugin: system_breadcrumb_block
+settings:
+  id: system_breadcrumb_block
+  label: Breadcrumbs
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_content.yml b/core/profiles/profiling/config/install/block.block.bartik_content.yml
new file mode 100644
index 0000000..87d320f
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_content.yml
@@ -0,0 +1,18 @@
+id: bartik_content
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: content
+plugin: system_main_block
+settings:
+  id: system_main_block
+  label: 'Main page content'
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_footer.yml b/core/profiles/profiling/config/install/block.block.bartik_footer.yml
new file mode 100644
index 0000000..f3a4dcf
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_footer.yml
@@ -0,0 +1,22 @@
+id: bartik_footer
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: footer_fifth
+plugin: 'system_menu_block:footer'
+settings:
+  id: 'system_menu_block:footer'
+  label: 'Footer menu'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 0
+dependencies:
+  config:
+    - system.menu.footer
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_help.yml b/core/profiles/profiling/config/install/block.block.bartik_help.yml
new file mode 100644
index 0000000..88c4f1a
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_help.yml
@@ -0,0 +1,18 @@
+id: bartik_help
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: help
+plugin: help_block
+settings:
+  id: help_block
+  label: 'Help'
+  provider: help
+  label_display: '0'
+dependencies:
+  module:
+    - help
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_login.yml b/core/profiles/profiling/config/install/block.block.bartik_login.yml
new file mode 100644
index 0000000..3a5f543
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_login.yml
@@ -0,0 +1,18 @@
+id: bartik_login
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: sidebar_first
+plugin: user_login_block
+settings:
+  id: user_login_block
+  label: 'User login'
+  provider: user
+  label_display: visible
+dependencies:
+  module:
+    - user
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_main_menu.yml b/core/profiles/profiling/config/install/block.block.bartik_main_menu.yml
new file mode 100644
index 0000000..32a3d1d
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_main_menu.yml
@@ -0,0 +1,22 @@
+id: bartik_main_menu
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: primary_menu
+plugin: 'system_menu_block:main'
+settings:
+  id: 'system_menu_block:main'
+  label: 'Main navigation'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 1
+dependencies:
+  config:
+    - system.menu.main
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {}
diff --git a/core/profiles/profiling/config/install/block.block.bartik_messages.yml b/core/profiles/profiling/config/install/block.block.bartik_messages.yml
new file mode 100644
index 0000000..0bb9590
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_messages.yml
@@ -0,0 +1,17 @@
+id: bartik_messages
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: highlighted
+plugin: system_messages_block
+settings:
+  id: system_messages_block
+  label: 'Status messages'
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - bartik
diff --git a/core/profiles/profiling/config/install/block.block.bartik_powered.yml b/core/profiles/profiling/config/install/block.block.bartik_powered.yml
new file mode 100644
index 0000000..f7e4c90
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_powered.yml
@@ -0,0 +1,18 @@
+id: bartik_powered
+theme: bartik
+weight: 10
+status: true
+langcode: en
+region: footer_fifth
+plugin: system_powered_by_block
+settings:
+  id: system_powered_by_block
+  label: 'Powered by Drupal'
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_search.yml b/core/profiles/profiling/config/install/block.block.bartik_search.yml
new file mode 100644
index 0000000..af99dea
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_search.yml
@@ -0,0 +1,18 @@
+id: bartik_search
+theme: bartik
+weight: -1
+status: true
+langcode: en
+region: sidebar_first
+plugin: search_form_block
+settings:
+  id: search_form_block
+  label: Search
+  provider: search
+  label_display: visible
+dependencies:
+  module:
+    - search
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.bartik_tools.yml b/core/profiles/profiling/config/install/block.block.bartik_tools.yml
new file mode 100644
index 0000000..af3672d
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.bartik_tools.yml
@@ -0,0 +1,22 @@
+id: bartik_tools
+theme: bartik
+weight: 0
+status: true
+langcode: en
+region: sidebar_first
+plugin: 'system_menu_block:tools'
+settings:
+  id: 'system_menu_block:tools'
+  label: Tools
+  provider: system
+  label_display: visible
+  level: 1
+  depth: 0
+dependencies:
+  config:
+    - system.menu.tools
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.seven_breadcrumbs.yml b/core/profiles/profiling/config/install/block.block.seven_breadcrumbs.yml
new file mode 100644
index 0000000..fc95b02
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.seven_breadcrumbs.yml
@@ -0,0 +1,18 @@
+id: seven_breadcrumbs
+theme: seven
+weight: 0
+status: true
+langcode: en
+region: breadcrumb
+plugin: system_breadcrumb_block
+settings:
+  id: system_breadcrumb_block
+  label: Breadcrumbs
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - seven
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.seven_content.yml b/core/profiles/profiling/config/install/block.block.seven_content.yml
new file mode 100644
index 0000000..dd2bfbe
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.seven_content.yml
@@ -0,0 +1,18 @@
+id: seven_content
+theme: seven
+weight: 0
+status: true
+langcode: en
+region: content
+plugin: system_main_block
+settings:
+  id: system_main_block
+  label: 'Main page content'
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - seven
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.seven_help.yml b/core/profiles/profiling/config/install/block.block.seven_help.yml
new file mode 100644
index 0000000..5bb3529
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.seven_help.yml
@@ -0,0 +1,18 @@
+id: seven_help
+theme: seven
+weight: 0
+status: true
+langcode: en
+region: help
+plugin: help_block
+settings:
+  id: help_block
+  label: 'Help'
+  provider: help
+  label_display: '0'
+dependencies:
+  module:
+    - help
+  theme:
+    - seven
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.seven_login.yml b/core/profiles/profiling/config/install/block.block.seven_login.yml
new file mode 100644
index 0000000..0a488a7
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.seven_login.yml
@@ -0,0 +1,18 @@
+id: seven_login
+theme: seven
+weight: 10
+status: true
+langcode: en
+region: content
+plugin: user_login_block
+settings:
+  id: user_login_block
+  label: 'User login'
+  provider: user
+  label_display: visible
+dependencies:
+  module:
+    - user
+  theme:
+    - seven
+visibility: {  }
diff --git a/core/profiles/profiling/config/install/block.block.seven_messages.yml b/core/profiles/profiling/config/install/block.block.seven_messages.yml
new file mode 100644
index 0000000..35c3531
--- /dev/null
+++ b/core/profiles/profiling/config/install/block.block.seven_messages.yml
@@ -0,0 +1,17 @@
+id: seven_messages
+theme: seven
+weight: 0
+status: true
+langcode: en
+region: highlighted
+plugin: system_messages_block
+settings:
+  id: system_messages_block
+  label: 'Status messages'
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - seven
diff --git a/core/profiles/profiling/config/install/block_content.type.basic.yml b/core/profiles/profiling/config/install/block_content.type.basic.yml
new file mode 100644
index 0000000..02982e4
--- /dev/null
+++ b/core/profiles/profiling/config/install/block_content.type.basic.yml
@@ -0,0 +1,5 @@
+id: basic
+label: 'Basic block'
+revision: 0
+description: 'A basic block contains a title and a body.'
+langcode: en
diff --git a/core/profiles/profiling/config/install/comment.type.comment.yml b/core/profiles/profiling/config/install/comment.type.comment.yml
new file mode 100644
index 0000000..6510287
--- /dev/null
+++ b/core/profiles/profiling/config/install/comment.type.comment.yml
@@ -0,0 +1,6 @@
+id: comment
+label: 'Default comments'
+description: 'Allows commenting on content'
+target_entity_type_id: node
+status: true
+langcode: en
diff --git a/core/profiles/profiling/config/install/contact.form.feedback.yml b/core/profiles/profiling/config/install/contact.form.feedback.yml
new file mode 100644
index 0000000..8fb7765
--- /dev/null
+++ b/core/profiles/profiling/config/install/contact.form.feedback.yml
@@ -0,0 +1,7 @@
+id: feedback
+label: 'Website feedback'
+recipients: {  }
+reply: ''
+weight: 0
+status: true
+langcode: en
diff --git a/core/profiles/profiling/config/install/core.base_field_override.node.page.promote.yml b/core/profiles/profiling/config/install/core.base_field_override.node.page.promote.yml
new file mode 100644
index 0000000..0f35334
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.base_field_override.node.page.promote.yml
@@ -0,0 +1,20 @@
+# Changes the default value of the promote base field on the page node type.
+langcode: en
+status: true
+dependencies:
+  config:
+    - node.type.page
+id: node.page.promote
+field_name: promote
+entity_type: node
+bundle: page
+label: Promoted to front page
+description: ''
+required: false
+translatable: true
+default_value:
+  -
+    value: 0
+default_value_callback: ''
+settings: {  }
+field_type: boolean
diff --git a/core/profiles/profiling/config/install/core.entity_form_display.block_content.basic.default.yml b/core/profiles/profiling/config/install/core.entity_form_display.block_content.basic.default.yml
new file mode 100644
index 0000000..b146f34
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_form_display.block_content.basic.default.yml
@@ -0,0 +1,30 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.basic
+    - field.field.block_content.basic.body
+  module:
+    - text
+id: block_content.basic.default
+targetEntityType: block_content
+bundle: basic
+mode: default
+content:
+  info:
+    type: string_textfield
+    weight: -5
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  body:
+    type: text_textarea_with_summary
+    weight: -4
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_form_display.comment.comment.default.yml b/core/profiles/profiling/config/install/core.entity_form_display.comment.comment.default.yml
new file mode 100644
index 0000000..51a97b1
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_form_display.comment.comment.default.yml
@@ -0,0 +1,31 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.field.comment.comment.comment_body
+  module:
+    - text
+id: comment.comment.default
+targetEntityType: comment
+bundle: comment
+mode: default
+content:
+  author:
+    weight: -2
+  subject:
+    type: string_textfield
+    weight: 10
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  comment_body:
+    type: text_textarea
+    weight: 11
+    settings:
+      rows: 5
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/profiling/config/install/core.entity_form_display.node.article.default.yml
new file mode 100644
index 0000000..64f8efc
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_form_display.node.article.default.yml
@@ -0,0 +1,85 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - comment
+    - entity_reference
+    - image
+    - path
+    - taxonomy
+    - text
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  title:
+    type: string_textfield
+    weight: 0
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  body:
+    type: text_textarea_with_summary
+    weight: 1
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+  field_tags:
+    type: entity_reference_autocomplete_tags
+    weight: 3
+    settings: {  }
+    third_party_settings: {  }
+  field_image:
+    type: image_image
+    weight: 4
+    settings:
+      progress_indicator: throbber
+      preview_image_style: thumbnail
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    settings:
+      match_operator: CONTAINS
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  created:
+    type: datetime_timestamp
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    third_party_settings: {  }
+  comment:
+    type: comment_default
+    weight: 20
+    settings: {  }
+    third_party_settings: {  }
+  path:
+    type: path
+    weight: 30
+    settings: {  }
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/profiling/config/install/core.entity_form_display.node.page.default.yml
new file mode 100644
index 0000000..967c74e
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_form_display.node.page.default.yml
@@ -0,0 +1,62 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - entity_reference
+    - path
+    - text
+id: node.page.default
+targetEntityType: node
+bundle: page
+mode: default
+content:
+  title:
+    type: string_textfield
+    weight: -5
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    settings:
+      match_operator: CONTAINS
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  created:
+    type: datetime_timestamp
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    third_party_settings: {  }
+  path:
+    type: path
+    weight: 30
+    settings: {  }
+    third_party_settings: {  }
+  body:
+    type: text_textarea_with_summary
+    weight: 31
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_form_display.user.user.default.yml b/core/profiles/profiling/config/install/core.entity_form_display.user.user.default.yml
new file mode 100644
index 0000000..d93cb2c
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_form_display.user.user.default.yml
@@ -0,0 +1,17 @@
+id: user.user.default
+targetEntityType: user
+bundle: user
+mode: default
+content:
+  user_picture:
+    type: image_image
+    settings:
+      progress_indicator: throbber
+      preview_image_style: thumbnail
+    third_party_settings: {  }
+    weight: -1
+status: true
+dependencies:
+  module:
+    - image
+    - user
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.block_content.basic.default.yml b/core/profiles/profiling/config/install/core.entity_view_display.block_content.basic.default.yml
new file mode 100644
index 0000000..f9ee027
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.block_content.basic.default.yml
@@ -0,0 +1,21 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.basic
+    - field.field.block_content.basic.body
+  module:
+    - text
+id: block_content.basic.default
+targetEntityType: block_content
+bundle: basic
+mode: default
+content:
+  body:
+    label: hidden
+    type: text_default
+    weight: 0
+    settings: {  }
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.comment.comment.default.yml b/core/profiles/profiling/config/install/core.entity_view_display.comment.comment.default.yml
new file mode 100644
index 0000000..0489d23
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.comment.comment.default.yml
@@ -0,0 +1,23 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.field.comment.comment.comment_body
+  module:
+    - text
+id: comment.comment.default
+targetEntityType: comment
+bundle: comment
+mode: default
+content:
+  comment_body:
+    label: hidden
+    type: text_default
+    weight: 0
+    settings: {  }
+    third_party_settings: {  }
+  links:
+    weight: 100
+hidden: {  }
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.node.article.default.yml b/core/profiles/profiling/config/install/core.entity_view_display.node.article.default.yml
new file mode 100644
index 0000000..0689b22
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.node.article.default.yml
@@ -0,0 +1,55 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - comment
+    - image
+    - taxonomy
+    - text
+    - user
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  field_image:
+    type: image
+    weight: -1
+    settings:
+      image_style: large
+      image_link: ''
+    third_party_settings: {  }
+    label: hidden
+  body:
+    type: text_default
+    weight: 0
+    settings: {  }
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    label: above
+    settings:
+      link: true
+    third_party_settings: {  }
+  comment:
+    label: above
+    type: comment_default
+    weight: 20
+    settings:
+      pager_id: 0
+    third_party_settings: {  }
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  field_image: true
+  field_tags: true
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.node.article.rss.yml b/core/profiles/profiling/config/install/core.entity_view_display.node.article.rss.yml
new file mode 100644
index 0000000..4308faf
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.node.article.rss.yml
@@ -0,0 +1,26 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.rss
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - user
+id: node.article.rss
+targetEntityType: node
+bundle: article
+mode: rss
+content:
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  body: true
+  comment: true
+  field_image: true
+  field_tags: true
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.node.article.teaser.yml b/core/profiles/profiling/config/install/core.entity_view_display.node.article.teaser.yml
new file mode 100644
index 0000000..464606d
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.node.article.teaser.yml
@@ -0,0 +1,50 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - image
+    - taxonomy
+    - text
+    - user
+id: node.article.teaser
+targetEntityType: node
+bundle: article
+mode: teaser
+content:
+  field_image:
+    type: image
+    weight: -1
+    settings:
+      image_style: medium
+      image_link: content
+    third_party_settings: {  }
+    label: hidden
+  body:
+    type: text_summary_or_trimmed
+    weight: 0
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    settings:
+      link: true
+    third_party_settings: {  }
+    label: above
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  field_image: true
+  field_tags: true
+  comment: true
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.node.page.default.yml b/core/profiles/profiling/config/install/core.entity_view_display.node.page.default.yml
new file mode 100644
index 0000000..d331484
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.node.page.default.yml
@@ -0,0 +1,25 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - text
+    - user
+id: node.page.default
+targetEntityType: node
+bundle: page
+mode: default
+content:
+  body:
+    label: hidden
+    type: text_default
+    weight: 100
+    settings: {  }
+    third_party_settings: {  }
+  links:
+    weight: 101
+hidden:
+  langcode: true
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.node.page.teaser.yml b/core/profiles/profiling/config/install/core.entity_view_display.node.page.teaser.yml
new file mode 100644
index 0000000..3d4d9ed
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.node.page.teaser.yml
@@ -0,0 +1,27 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - text
+    - user
+id: node.page.teaser
+targetEntityType: node
+bundle: page
+mode: teaser
+content:
+  body:
+    label: hidden
+    type: text_summary_or_trimmed
+    weight: 100
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+  links:
+    weight: 101
+hidden:
+  langcode: true
+third_party_settings: {  }
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.user.user.compact.yml b/core/profiles/profiling/config/install/core.entity_view_display.user.user.compact.yml
new file mode 100644
index 0000000..a46bd1b
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.user.user.compact.yml
@@ -0,0 +1,22 @@
+id: user.user.compact
+targetEntityType: user
+bundle: user
+mode: compact
+content:
+  user_picture:
+    type: image
+    weight: 0
+    settings:
+      image_style: thumbnail
+      image_link: content
+    third_party_settings: {  }
+    label: hidden
+hidden:
+  member_for: true
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.user.compact
+  module:
+    - image
+    - user
diff --git a/core/profiles/profiling/config/install/core.entity_view_display.user.user.default.yml b/core/profiles/profiling/config/install/core.entity_view_display.user.user.default.yml
new file mode 100644
index 0000000..ebf106c
--- /dev/null
+++ b/core/profiles/profiling/config/install/core.entity_view_display.user.user.default.yml
@@ -0,0 +1,18 @@
+id: user.user.default
+targetEntityType: user
+bundle: user
+mode: default
+content:
+  user_picture:
+    type: image
+    weight: 0
+    settings:
+      image_style: thumbnail
+      image_link: content
+    third_party_settings: {  }
+    label: hidden
+status: true
+dependencies:
+  module:
+    - image
+    - user
diff --git a/core/profiles/profiling/config/install/editor.editor.basic_html.yml b/core/profiles/profiling/config/install/editor.editor.basic_html.yml
new file mode 100644
index 0000000..54ad5b1
--- /dev/null
+++ b/core/profiles/profiling/config/install/editor.editor.basic_html.yml
@@ -0,0 +1,48 @@
+format: basic_html
+editor: ckeditor
+settings:
+  toolbar:
+    rows:
+      -
+        -
+          name: Formatting
+          items:
+            - Bold
+            - Italic
+        -
+          name: Linking
+          items:
+            - DrupalLink
+            - DrupalUnlink
+        -
+          name: Lists
+          items:
+            - BulletedList
+            - NumberedList
+        -
+          name: Media
+          items:
+            - Blockquote
+            - DrupalImage
+        -
+          name: Tools
+          items:
+            - Source
+  plugins:
+    stylescombo:
+      styles: ''
+image_upload:
+  status: true
+  scheme: public
+  directory: inline-images
+  max_size: ''
+  max_dimensions:
+    width: 0
+    height: 0
+status: true
+langcode: en
+dependencies:
+  config:
+    - filter.format.basic_html
+  module:
+    - ckeditor
diff --git a/core/profiles/profiling/config/install/editor.editor.full_html.yml b/core/profiles/profiling/config/install/editor.editor.full_html.yml
new file mode 100644
index 0000000..80da28c
--- /dev/null
+++ b/core/profiles/profiling/config/install/editor.editor.full_html.yml
@@ -0,0 +1,60 @@
+format: full_html
+editor: ckeditor
+settings:
+  toolbar:
+    rows:
+      -
+        -
+          name: Formatting
+          items:
+            - Bold
+            - Italic
+            - Strike
+            - Superscript
+            - Subscript
+            - -
+            - RemoveFormat
+        -
+          name: Linking
+          items:
+            - DrupalLink
+            - DrupalUnlink
+        -
+          name: Lists
+          items:
+            - BulletedList
+            - NumberedList
+        -
+          name: Media
+          items:
+            - Blockquote
+            - DrupalImage
+            - Table
+            - HorizontalRule
+        -
+          name: 'Block Formatting'
+          items:
+            - Format
+        -
+          name: Tools
+          items:
+            - ShowBlocks
+            - Source
+  plugins:
+    stylescombo:
+      styles: ''
+image_upload:
+  status: true
+  scheme: public
+  directory: inline-images
+  max_size: ''
+  max_dimensions:
+    width: 0
+    height: 0
+status: true
+langcode: en
+dependencies:
+  config:
+    - filter.format.full_html
+  module:
+    - ckeditor
diff --git a/core/profiles/profiling/config/install/field.field.block_content.basic.body.yml b/core/profiles/profiling/config/install/field.field.block_content.basic.body.yml
new file mode 100644
index 0000000..e115700
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.block_content.basic.body.yml
@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.basic
+    - field.storage.block_content.body
+  module:
+    - text
+id: block_content.basic.body
+field_name: body
+entity_type: block_content
+bundle: basic
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: false
+third_party_settings: {  }
+field_type: text_with_summary
diff --git a/core/profiles/profiling/config/install/field.field.comment.comment.comment_body.yml b/core/profiles/profiling/config/install/field.field.comment.comment.comment_body.yml
new file mode 100644
index 0000000..30aaabe
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.comment.comment.comment_body.yml
@@ -0,0 +1,21 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.storage.comment.comment_body
+  module:
+    - text
+id: comment.comment.comment_body
+field_name: comment_body
+entity_type: comment
+bundle: comment
+label: Comment
+description: ''
+required: true
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+third_party_settings: {  }
+field_type: text_long
diff --git a/core/profiles/profiling/config/install/field.field.node.article.body.yml b/core/profiles/profiling/config/install/field.field.node.article.body.yml
new file mode 100644
index 0000000..e2cdb3a
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.node.article.body.yml
@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.article
+  module:
+    - text
+id: node.article.body
+field_name: body
+entity_type: node
+bundle: article
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+third_party_settings: {  }
+field_type: text_with_summary
diff --git a/core/profiles/profiling/config/install/field.field.node.article.comment.yml b/core/profiles/profiling/config/install/field.field.node.article.comment.yml
new file mode 100644
index 0000000..932daff
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.node.article.comment.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.comment
+    - node.type.article
+  module:
+    - comment
+id: node.article.comment
+field_name: comment
+entity_type: node
+bundle: article
+label: Comments
+description: ''
+required: true
+translatable: true
+default_value:
+  -
+    status: 2
+    cid: 0
+    last_comment_name: null
+    last_comment_timestamp: 0
+    last_comment_uid: 0
+    comment_count: 0
+default_value_callback: ''
+settings:
+  default_mode: 1
+  per_page: 50
+  form_location: true
+  anonymous: 0
+  preview: 1
+third_party_settings: {  }
+field_type: comment
diff --git a/core/profiles/profiling/config/install/field.field.node.article.field_image.yml b/core/profiles/profiling/config/install/field.field.node.article.field_image.yml
new file mode 100644
index 0000000..0a7c7f6
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.node.article.field_image.yml
@@ -0,0 +1,32 @@
+id: node.article.field_image
+entity_type: node
+bundle: article
+field_name: field_image
+label: Image
+description: ''
+required: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  file_directory: field/image
+  file_extensions: 'png gif jpg jpeg'
+  max_filesize: ''
+  max_resolution: ''
+  min_resolution: ''
+  alt_field: true
+  title_field: false
+  alt_field_required: true
+  title_field_required: false
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+status: true
+langcode: en
+field_type: image
+dependencies:
+  config:
+    - field.storage.node.field_image
+    - node.type.article
diff --git a/core/profiles/profiling/config/install/field.field.node.article.field_tags.yml b/core/profiles/profiling/config/install/field.field.node.article.field_tags.yml
new file mode 100644
index 0000000..d69a558
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.node.article.field_tags.yml
@@ -0,0 +1,26 @@
+id: node.article.field_tags
+entity_type: node
+bundle: article
+field_name: field_tags
+field_type: entity_reference
+label: Tags
+description: 'Enter a comma-separated list. For example: Amsterdam, Mexico City, "Cleveland, Ohio"'
+required: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: default
+  handler_settings:
+    target_bundles:
+      tags: tags
+    sort:
+      field: _none
+    auto_create: true
+status: true
+langcode: en
+dependencies:
+  config:
+    - field.storage.node.field_tags
+    - node.type.article
+  module:
+    - entity_reference
diff --git a/core/profiles/profiling/config/install/field.field.node.page.body.yml b/core/profiles/profiling/config/install/field.field.node.page.body.yml
new file mode 100644
index 0000000..57bb0b0
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.node.page.body.yml
@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.page
+  module:
+    - text
+id: node.page.body
+field_name: body
+entity_type: node
+bundle: page
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+third_party_settings: {  }
+field_type: text_with_summary
diff --git a/core/profiles/profiling/config/install/field.field.user.user.user_picture.yml b/core/profiles/profiling/config/install/field.field.user.user.user_picture.yml
new file mode 100644
index 0000000..e1d8b64
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.field.user.user.user_picture.yml
@@ -0,0 +1,31 @@
+id: user.user.user_picture
+status: true
+langcode: en
+entity_type: user
+bundle: user
+field_name: user_picture
+label: Picture
+description: 'Your virtual face or picture.'
+required: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  file_extensions: 'png gif jpg jpeg'
+  file_directory: pictures
+  max_filesize: '30 KB'
+  alt_field: false
+  title_field: false
+  max_resolution: 85x85
+  min_resolution: ''
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+  alt_field_required: false
+  title_field_required: false
+field_type: image
+dependencies:
+  config:
+    - field.storage.user.user_picture
diff --git a/core/profiles/profiling/config/install/field.storage.node.comment.yml b/core/profiles/profiling/config/install/field.storage.node.comment.yml
new file mode 100644
index 0000000..4713148
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.storage.node.comment.yml
@@ -0,0 +1,18 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - comment
+    - node
+id: node.comment
+field_name: comment
+entity_type: node
+type: comment
+settings:
+  comment_type: comment
+module: comment
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
diff --git a/core/profiles/profiling/config/install/field.storage.node.field_image.yml b/core/profiles/profiling/config/install/field.storage.node.field_image.yml
new file mode 100644
index 0000000..eb40f37
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.storage.node.field_image.yml
@@ -0,0 +1,26 @@
+id: node.field_image
+field_name: field_image
+entity_type: node
+type: image
+module: image
+settings:
+  uri_scheme: public
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+locked: false
+cardinality: 1
+translatable: true
+indexes:
+  target_id:
+    - target_id
+status: true
+langcode: en
+dependencies:
+  module:
+    - node
+    - image
+persist_with_no_fields: false
diff --git a/core/profiles/profiling/config/install/field.storage.node.field_tags.yml b/core/profiles/profiling/config/install/field.storage.node.field_tags.yml
new file mode 100644
index 0000000..71e0425
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.storage.node.field_tags.yml
@@ -0,0 +1,17 @@
+id: node.field_tags
+field_name: field_tags
+entity_type: node
+type: entity_reference
+module: taxonomy
+settings:
+  target_type: taxonomy_term
+locked: false
+cardinality: -1
+translatable: true
+status: true
+langcode: en
+dependencies:
+  module:
+    - node
+    - taxonomy
+persist_with_no_fields: false
diff --git a/core/profiles/profiling/config/install/field.storage.user.user_picture.yml b/core/profiles/profiling/config/install/field.storage.user.user_picture.yml
new file mode 100644
index 0000000..b7e3141
--- /dev/null
+++ b/core/profiles/profiling/config/install/field.storage.user.user_picture.yml
@@ -0,0 +1,25 @@
+id: user.user_picture
+status: true
+langcode: en
+field_name: user_picture
+entity_type: user
+type: image
+settings:
+  uri_scheme: public
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+module: image
+locked: false
+cardinality: 1
+indexes:
+  target_id:
+    - target_id
+dependencies:
+  module:
+    - image
+    - user
+persist_with_no_fields: false
diff --git a/core/profiles/profiling/config/install/filter.format.basic_html.yml b/core/profiles/profiling/config/install/filter.format.basic_html.yml
new file mode 100644
index 0000000..4d187b7
--- /dev/null
+++ b/core/profiles/profiling/config/install/filter.format.basic_html.yml
@@ -0,0 +1,50 @@
+format: basic_html
+name: 'Basic HTML'
+status: true
+weight: 0
+roles:
+  - authenticated
+filters:
+  filter_html:
+    id: filter_html
+    provider: filter
+    status: true
+    weight: -10
+    settings:
+      allowed_html: '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <h4> <h5> <h6> <p> <br> <span> <img>'
+      filter_html_help: false
+      filter_html_nofollow: false
+  filter_align:
+    id: filter_align
+    provider: filter
+    status: true
+    weight: 7
+    settings: {  }
+  filter_caption:
+    id: filter_caption
+    provider: filter
+    status: true
+    weight: 8
+    settings: {  }
+  filter_html_image_secure:
+    id: filter_html_image_secure
+    provider: filter
+    status: true
+    weight: 9
+    settings: {  }
+  filter_htmlcorrector:
+    id: filter_htmlcorrector
+    provider: filter
+    status: true
+    weight: 10
+    settings: {  }
+  editor_file_reference:
+    id: editor_file_reference
+    provider: editor
+    status: true
+    weight: 11
+    settings: {  }
+langcode: en
+dependencies:
+  module:
+    - editor
diff --git a/core/profiles/profiling/config/install/filter.format.full_html.yml b/core/profiles/profiling/config/install/filter.format.full_html.yml
new file mode 100644
index 0000000..cfdf9e2
--- /dev/null
+++ b/core/profiles/profiling/config/install/filter.format.full_html.yml
@@ -0,0 +1,35 @@
+format: full_html
+name: 'Full HTML'
+status: true
+weight: 1
+roles:
+  - administrator
+filters:
+  filter_align:
+    id: filter_align
+    provider: filter
+    status: true
+    weight: 8
+    settings: {  }
+  filter_caption:
+    id: filter_caption
+    provider: filter
+    status: true
+    weight: 9
+    settings: {  }
+  filter_htmlcorrector:
+    id: filter_htmlcorrector
+    provider: filter
+    status: true
+    weight: 10
+    settings: {  }
+  editor_file_reference:
+    id: editor_file_reference
+    provider: editor
+    status: true
+    weight: 11
+    settings: {  }
+langcode: en
+dependencies:
+  module:
+    - editor
diff --git a/core/profiles/profiling/config/install/filter.format.restricted_html.yml b/core/profiles/profiling/config/install/filter.format.restricted_html.yml
new file mode 100644
index 0000000..95a20e5
--- /dev/null
+++ b/core/profiles/profiling/config/install/filter.format.restricted_html.yml
@@ -0,0 +1,36 @@
+format: restricted_html
+name: 'Restricted HTML'
+status: true
+weight: 0
+roles:
+  - anonymous
+filters:
+  filter_html:
+    id: filter_html
+    provider: filter
+    status: true
+    weight: -10
+    settings:
+      allowed_html: '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <h4> <h5> <h6>'
+      filter_html_help: true
+      filter_html_nofollow: false
+  filter_autop:
+    id: filter_autop
+    provider: filter
+    status: true
+    weight: 0
+    settings: {  }
+  filter_url:
+    id: filter_url
+    provider: filter
+    status: true
+    weight: 0
+    settings:
+      filter_url_length: 72
+  filter_htmlcorrector:
+    id: filter_htmlcorrector
+    provider: filter
+    status: true
+    weight: 10
+    settings: {  }
+langcode: en
diff --git a/core/profiles/profiling/config/install/node.type.article.yml b/core/profiles/profiling/config/install/node.type.article.yml
new file mode 100644
index 0000000..7cb127d
--- /dev/null
+++ b/core/profiles/profiling/config/install/node.type.article.yml
@@ -0,0 +1,9 @@
+type: article
+name: Article
+description: 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'
+help: ''
+new_revision: false
+preview_mode: 1
+display_submitted: true
+status: true
+langcode: en
diff --git a/core/profiles/profiling/config/install/node.type.page.yml b/core/profiles/profiling/config/install/node.type.page.yml
new file mode 100644
index 0000000..f9b4353
--- /dev/null
+++ b/core/profiles/profiling/config/install/node.type.page.yml
@@ -0,0 +1,9 @@
+type: page
+name: 'Basic page'
+description: 'Use <em>basic pages</em> for your static content, such as an ''About us'' page.'
+help: ''
+new_revision: false
+preview_mode: 1
+display_submitted: false
+status: true
+langcode: en
diff --git a/core/profiles/profiling/config/install/rdf.mapping.comment.comment.yml b/core/profiles/profiling/config/install/rdf.mapping.comment.comment.yml
new file mode 100644
index 0000000..f0d587a
--- /dev/null
+++ b/core/profiles/profiling/config/install/rdf.mapping.comment.comment.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+  module:
+    - comment
+id: comment.comment
+targetEntityType: comment
+bundle: comment
+types:
+  - 'schema:Comment'
+fieldMappings:
+  subject:
+    properties:
+      - 'schema:name'
+  created:
+    properties:
+      - 'schema:dateCreated'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  changed:
+    properties:
+      - 'schema:dateModified'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  comment_body:
+    properties:
+      - 'schema:text'
+  uid:
+    properties:
+      - 'schema:author'
+    mapping_type: rel
diff --git a/core/profiles/profiling/config/install/rdf.mapping.node.article.yml b/core/profiles/profiling/config/install/rdf.mapping.node.article.yml
new file mode 100644
index 0000000..f1b167e
--- /dev/null
+++ b/core/profiles/profiling/config/install/rdf.mapping.node.article.yml
@@ -0,0 +1,47 @@
+id: node.article
+targetEntityType: node
+bundle: article
+types:
+  - 'schema:Article'
+fieldMappings:
+  title:
+    properties:
+      - 'schema:name'
+  created:
+    properties:
+      - 'schema:dateCreated'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  changed:
+    properties:
+      - 'schema:dateModified'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  body:
+    properties:
+      - 'schema:text'
+  uid:
+    properties:
+      - 'schema:author'
+  comment:
+    properties:
+      - 'schema:comment'
+    mapping_type: 'rel'
+  comment_count:
+    properties:
+      - 'schema:interactionCount'
+    datatype_callback:
+      callable: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      arguments:
+        interaction_type: 'UserComments'
+  field_image:
+    properties:
+      - 'schema:image'
+  field_tags:
+    properties:
+      - 'schema:about'
+dependencies:
+  config:
+    - node.type.article
+  module:
+    - node
diff --git a/core/profiles/profiling/config/install/rdf.mapping.node.page.yml b/core/profiles/profiling/config/install/rdf.mapping.node.page.yml
new file mode 100644
index 0000000..166bd2a
--- /dev/null
+++ b/core/profiles/profiling/config/install/rdf.mapping.node.page.yml
@@ -0,0 +1,38 @@
+id: node.page
+targetEntityType: node
+bundle: page
+types:
+  - 'schema:WebPage'
+fieldMappings:
+  title:
+    properties:
+      - 'schema:name'
+  created:
+    properties:
+      - 'schema:dateCreated'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  changed:
+    properties:
+      - 'schema:dateModified'
+    datatype_callback:
+      callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
+  body:
+    properties:
+      - 'schema:text'
+  uid:
+    properties:
+      - 'schema:author'
+    mapping_type: 'rel'
+  comment_count:
+    properties:
+      - 'schema:interactionCount'
+    datatype_callback:
+      callable: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      arguments:
+        interaction_type: 'UserComments'
+dependencies:
+  config:
+    - node.type.page
+  module:
+    - node
diff --git a/core/profiles/profiling/config/install/rdf.mapping.taxonomy_term.tags.yml b/core/profiles/profiling/config/install/rdf.mapping.taxonomy_term.tags.yml
new file mode 100644
index 0000000..9c7b4dc
--- /dev/null
+++ b/core/profiles/profiling/config/install/rdf.mapping.taxonomy_term.tags.yml
@@ -0,0 +1,17 @@
+id: taxonomy_term.tags
+targetEntityType: taxonomy_term
+bundle: tags
+types:
+  - 'schema:Thing'
+fieldMappings:
+  name:
+    properties:
+      - 'schema:name'
+  description:
+    properties:
+      - 'schema:description'
+dependencies:
+  config:
+    - taxonomy.vocabulary.tags
+  module:
+    - taxonomy
diff --git a/core/profiles/profiling/config/install/system.cron.yml b/core/profiles/profiling/config/install/system.cron.yml
new file mode 100644
index 0000000..9289f28
--- /dev/null
+++ b/core/profiles/profiling/config/install/system.cron.yml
@@ -0,0 +1,4 @@
+threshold:
+  autorun: 10800
+  requirements_warning: 172800
+  requirements_error: 1209600
diff --git a/core/profiles/profiling/config/install/system.theme.yml b/core/profiles/profiling/config/install/system.theme.yml
new file mode 100644
index 0000000..57dadd4
--- /dev/null
+++ b/core/profiles/profiling/config/install/system.theme.yml
@@ -0,0 +1,2 @@
+admin: seven
+default: bartik
diff --git a/core/profiles/profiling/config/install/taxonomy.vocabulary.tags.yml b/core/profiles/profiling/config/install/taxonomy.vocabulary.tags.yml
new file mode 100644
index 0000000..0f8001e
--- /dev/null
+++ b/core/profiles/profiling/config/install/taxonomy.vocabulary.tags.yml
@@ -0,0 +1,7 @@
+vid: tags
+name: Tags
+description: 'Use tags to group articles on similar topics into categories.'
+hierarchy: 0
+weight: 0
+status: true
+langcode: en
diff --git a/core/profiles/profiling/config/install/user.role.administrator.yml b/core/profiles/profiling/config/install/user.role.administrator.yml
new file mode 100644
index 0000000..daf926b
--- /dev/null
+++ b/core/profiles/profiling/config/install/user.role.administrator.yml
@@ -0,0 +1,5 @@
+id: administrator
+label: Administrator
+weight: 2
+langcode: en
+is_admin: true
diff --git a/core/profiles/profiling/modules/profiler/profiler.info.yml b/core/profiles/profiling/modules/profiler/profiler.info.yml
new file mode 100644
index 0000000..3e7bac6
--- /dev/null
+++ b/core/profiles/profiling/modules/profiler/profiler.info.yml
@@ -0,0 +1,6 @@
+name: 'Simple profiler'
+type: module
+description: 'Gathers simple profiling data (peak memory, number of initialized services, and so on).'
+package: Profiling
+version: VERSION
+core: 8.x
diff --git a/core/profiles/profiling/modules/profiler/profiler.services.yml b/core/profiles/profiling/modules/profiler/profiler.services.yml
new file mode 100644
index 0000000..e4d31d5
--- /dev/null
+++ b/core/profiles/profiling/modules/profiler/profiler.services.yml
@@ -0,0 +1,16 @@
+services:
+  profiler:
+    class: Symfony\Component\HttpKernel\Profiler\Profiler
+    arguments: ['@profiler.file_storage', '@logger.channel.profiler']
+  profiler.listener:
+    class: Symfony\Component\HttpKernel\EventListener\ProfilerListener
+    arguments: ['@profiler']
+    tags:
+      - { name: event_subscriber }
+  profiler.file_storage:
+    class: Symfony\Component\HttpKernel\Profiler\FileProfilerStorage
+    arguments: ['%data_collector.storage%']
+  logger.channel.profiler:
+    class: Drupal\Core\Logger\LoggerChannel
+    parent: logger.channel_base
+    arguments: ['profiler']
diff --git a/core/profiles/profiling/modules/profiler/src/Compiler/ProfilerPass.php b/core/profiles/profiling/modules/profiler/src/Compiler/ProfilerPass.php
new file mode 100644
index 0000000..34f8bf2
--- /dev/null
+++ b/core/profiles/profiling/modules/profiler/src/Compiler/ProfilerPass.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Drupal\profiler\Compiler;
+
+use Drupal\Core\StreamWrapper\PublicStream;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Class ProfilerPass
+ */
+class ProfilerPass implements CompilerPassInterface {
+
+  /**
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *
+   * @throws \InvalidArgumentException
+   */
+  public function process(ContainerBuilder $container) {
+    // Return early if the 'profiler' service is missing.
+    if (FALSE === $container->hasDefinition('profiler')) {
+      return;
+    }
+
+    $definition = $container->getDefinition('profiler');
+
+    foreach ($container->findTaggedServiceIds('profiler_data_collector') as $id => $attributes) {
+      $definition->addMethodCall('add', array(new Reference($id)));
+    }
+
+    // Configure the data collector file storage to a 'profiler' subdirectory in
+    // the public files directory.
+    $path = 'file://' . DRUPAL_ROOT . '/' . PublicStream::basePath() . '/profiler';
+    $container->setParameter('data_collector.storage', $path);
+  }
+
+}
diff --git a/core/profiles/profiling/modules/profiler/src/ProfilerServiceProvider.php b/core/profiles/profiling/modules/profiler/src/ProfilerServiceProvider.php
new file mode 100644
index 0000000..e62d30b
--- /dev/null
+++ b/core/profiles/profiling/modules/profiler/src/ProfilerServiceProvider.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\profiler\ProfilerServiceProvider.
+ */
+
+namespace Drupal\profiler;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+use Drupal\profiler\Compiler\ProfilerPass;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Defines a service provider for the Profiler module.
+ */
+class ProfilerServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container) {
+    // Add a compiler pass to discover all data collector services.
+    $container->addCompilerPass(new ProfilerPass());
+  }
+
+}
diff --git a/core/profiles/profiling/profiling.info.yml b/core/profiles/profiling/profiling.info.yml
new file mode 100644
index 0000000..3be2670
--- /dev/null
+++ b/core/profiles/profiling/profiling.info.yml
@@ -0,0 +1,46 @@
+name: Profiling
+type: profile
+description: 'Profile for profiling (measuring performance). Includes various scenarios to track Drupal performance.'
+version: VERSION
+core: 8.x
+hidden: true
+dependencies:
+  - node
+  - history
+  - block
+  - breakpoint
+  - ckeditor
+  - color
+  - config
+  - comment
+  - contextual
+  - contact
+  - menu_link_content
+  - datetime
+  - block_content
+  - quickedit
+  - editor
+  - entity_reference
+  - help
+  - image
+  - menu_ui
+  - options
+  - path
+  # The Page Cache module is not enabled in the Profiling install profile
+  # because it runs in a middleware and hence HTTP kernel events do not run,
+  # which means we cannot profile it.
+  # - page_cache
+  - taxonomy
+  - dblog
+  - search
+  - shortcut
+  - toolbar
+  - field_ui
+  - file
+  - rdf
+  - views
+  - views_ui
+  - tour
+themes:
+  - bartik
+  - seven
diff --git a/core/profiles/profiling/profiling.install b/core/profiles/profiling/profiling.install
new file mode 100644
index 0000000..991da78
--- /dev/null
+++ b/core/profiles/profiling/profiling.install
@@ -0,0 +1,105 @@
+<?php
+/**
+ * @file
+ * Install, update and uninstall functions for the profiling installation profile.
+ */
+
+use Drupal\Component\Utility\Random;
+use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\menu_link_content\Entity\MenuLinkContent;
+use Drupal\node\Entity\Node;
+use Drupal\taxonomy\Entity\Term;
+
+/**
+ * Implements hook_install().
+ *
+ * Perform actions to set up the site for this profile.
+ *
+ * @see standard_install()
+ */
+function profiling_install() {
+  // This builds on top of the "Standard" profile.
+  require_once DRUPAL_ROOT . '/core/profiles/standard/standard.install';
+  standard_install();
+
+  /** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */
+  $container = \Drupal::getContainer();
+
+  /** @var \Drupal\Core\Path\AliasStorageInterface $path_alias_storage */
+  $path_alias_storage = $container->get('path.alias_storage');
+
+  $random = new Random();
+
+  // Create an "About" page, with path alias and a link in the main menu.
+  /** @var \Drupal\node\NodeInterface $node */
+  $node = Node::create(array(
+    'type' => 'page',
+    'title' => 'About',
+    'body' => array(
+      array(
+        'value' => 'Hi, welcome to ' . $random->string() . '!',
+        'format' => 'basic_html',
+      ),
+    ),
+    'uid' => array(
+      'target_id' => 1,
+    ),
+    'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+  ));
+  $node->save();
+  $path_alias_storage->save('/node/' . $node->id(), '/about');
+  MenuLinkContent::create(array(
+    'title' => 'About',
+    'link' => ['uri' => 'entity:node/' . $node->id()],
+    'menu_name' => 'main',
+  ))->save();
+
+  // Create 50 taxonomy terms, each with path alias.
+  for ($i = 0; $i < 50; $i++) {
+    /** @var \Drupal\taxonomy\TermInterface $term */
+    $term = Term::create(array(
+      'name' => $random->name(),
+      'vid' => 'tags',
+      'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+    ));
+    $term->save();
+    $path_alias_storage->save('/' . $term->urlInfo()->getInternalPath(), '/tags/' . Unicode::strtolower($term->getName()));
+  }
+
+  // Create 100 articles, the first 10 in the main menu, and each with:
+  // - a path alias
+  // - two referenced taxonomy terms from the "Tags" vocabulary
+  for ($i = 0; $i < 50; $i++) {
+    /** @var \Drupal\node\NodeInterface $node */
+    $node = Node::create(array(
+      'type' => 'article',
+      'title' => $random->name(),
+      'promote' => NODE_PROMOTED,
+      'body' => array(
+        array(
+          'value' => $random->string(100),
+          'format' => 'basic_html',
+        ),
+      ),
+      'field_tags' => array(
+        array('target_id' => $i),
+        array('target_id' => ($i + 10) % 50),
+      ),
+      'uid' => array(
+        'target_id' => 1,
+      ),
+      'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+    ));
+    $node->save();
+    $path_alias_storage->save('/node/' . $node->id(), '/article/' . Unicode::strtolower($node->getTitle()));
+    if ($i < 10) {
+      MenuLinkContent::create(array(
+        'title' => $node->getTitle(),
+        'link' => ['uri' => 'entity:node/' . $node->id()],
+        'menu_name' => 'main',
+      ))->save();
+    }
+  }
+
+}
diff --git a/core/profiles/profiling/src/Tests/ProfilingTest.php b/core/profiles/profiling/src/Tests/ProfilingTest.php
new file mode 100644
index 0000000..b62e336
--- /dev/null
+++ b/core/profiles/profiling/src/Tests/ProfilingTest.php
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\profiling\Tests\ProfilingTest.
+ */
+
+namespace Drupal\profiling\Tests;
+
+use Drupal\Component\Utility\SafeMarkup;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Holds profiling data.
+ * In a basic form, this class encapsolates an array, but does not allow
+ * setting values once they have been initialized.
+ */
+class ExpectedProfilingData {
+  /** @var array */
+  private$data;
+  function __construct($data) {
+    $this->data = $data;
+  }
+  
+    public function get($val) {
+        return $this->data[$val];
+    }
+}
+
+/**
+ * Tests Profiling installation profile expectations.
+ *
+ * @group profiling
+ */
+class ProfilingTest extends WebTestBase {
+
+  protected $profile = 'profiling';
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('profiler');
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function tearDown() {
+    parent::tearDown();
+
+    /** @var \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface $profiles */
+    $profiles = $this->container->get('profiler.file_storage');
+
+    // Purge all profiling data.
+    $profiles->purge();
+  }
+
+  /**
+   * Profiles various scenarios, compares with the expected profiling data.
+   */
+  public function testScenarios() {
+    $this->profileScenario('anon, /node/1, cold cache', '', new ExpectedProfilingData(array('memory_peak' => 32 * 1024 * 1024, 'initialized_services' => 252)));
+    $this->profileScenario('anon, /node/1, warm cache', '', new ExpectedProfilingData(array('memory_peak' => 12 * 1024 * 1024, 'initialized_services' => 225)));
+  }
+  
+  /**
+   * Profiles a scenario.
+   *
+   * @param string $scenario_name
+   *   The name of the scenario being tested.
+   * @param string $path
+   *   The path at which the scenario has been set up.
+   * @param ExpectedProfilingData $expected
+   *   The expected profiling data; the data to compare with.
+   */
+  protected function profileScenario($scenario_name, $path, ExpectedProfilingData $expected) {
+    $this->pass(SafeMarkup::format('Profiling scenario %name.', array('%name' => $scenario_name)), 'Debug');
+
+    // Perform a request.
+    $this->drupalGet($path);
+
+    // Get the token from the response that lets us find the corresponding
+    // profile.
+    $token = $this->drupalGetHeader('X-Debug-Token');
+
+    // Retrieve the profile and assert all expectations are met.
+    /** @var \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface $profiles */
+    $profiles = $this->container->get('profiler.file_storage');
+    $profile = $profiles->read($token);
+
+    /** @var \Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector $memory_collector */
+    $memory_collector = $profile->getCollector('memory');
+    $this->assertProfilingCount($expected->get('memory_peak'), $memory_collector->getMemory(), 'Memory peak');
+    /** @var \Drupal\Core\Profiler\ServiceDataCollector $service_collector */
+    $service_collector = $profile->getCollector('service');
+    $this->assertProfilingCount($expected->get('initialized_services'), $service_collector->getInitializedServicesWithoutProfilerServices(), 'Initialized services');
+  }
+
+  /**
+   * Like ::assertEqual(), but informs us about a regression or improvement.
+   */
+  protected function assertProfilingCount($expected, $actual, $category) {
+    $delta = $actual - $expected;
+    $args = array(
+      '%category' => $category,
+      '@expected' => $expected,
+      '@actual' => $actual,
+      '@delta' => $delta,
+      '@relative-delta-if-any' => '',
+    );
+    // Status quo.
+    if ($delta == 0) {
+      $this->pass(SafeMarkup::format('%category: as expected. (Δ = @delta, @expected → @actual)', $args));
+    }
+    // Improvement or regression.
+    else {
+      if ($expected != 0) {
+        $args['@relative-delta-if-any'] = ' (' . (($delta > 0) ? '+' : '-') . round(abs($delta) / $expected * 100, 2) . '%)';
+      }
+      $this->assert('exception', SafeMarkup::format('%category: Δ = @delta, @expected → @actual@relative-delta-if-any', $args));
+    }
+  }
+
+}
