('system.admin_config_content','/admin/config/content','/admin/config/content',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1175:{a:9:{s:4:\"path\";s:21:\"/admin/config/content\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:17:\"Content authoring\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":358:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:26:\"#^/admin/config/content$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:21:\"/admin/config/content\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:21:\"/admin/config/content\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_development','/admin/config/development','/admin/config/development',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1185:{a:9:{s:4:\"path\";s:25:\"/admin/config/development\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:11:\"Development\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":370:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/config/development$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/config/development\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:25:\"/admin/config/development\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_media','/admin/config/media','/admin/config/media',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1154:{a:9:{s:4:\"path\";s:19:\"/admin/config/media\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:5:\"Media\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":352:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:24:\"#^/admin/config/media$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:19:\"/admin/config/media\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:19:\"/admin/config/media\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_regional','/admin/config/regional','/admin/config/regional',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1183:{a:9:{s:4:\"path\";s:22:\"/admin/config/regional\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:21:\"Regional and language\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/config/regional$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/config/regional\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/config/regional\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_search','/admin/config/search','/admin/config/search',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1173:{a:9:{s:4:\"path\";s:20:\"/admin/config/search\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:19:\"Search and metadata\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/config/search$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/config/search\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/config/search\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_services','/admin/config/services','/admin/config/services',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1174:{a:9:{s:4:\"path\";s:22:\"/admin/config/services\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:12:\"Web services\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/config/services$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/config/services\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/config/services\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_system','/admin/config/system','/admin/config/system',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1159:{a:9:{s:4:\"path\";s:20:\"/admin/config/system\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:6:\"System\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/config/system$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/config/system\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/config/system\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_ui','/admin/config/user-interface','/admin/config/user-interface',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1201:{a:9:{s:4:\"path\";s:28:\"/admin/config/user-interface\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:14:\"User interface\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":380:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:34:\"#^/admin/config/user\\-interface$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:28:\"/admin/config/user-interface\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:28:\"/admin/config/user-interface\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_config_workflow','/admin/config/workflow','/admin/config/workflow',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1169:{a:9:{s:4:\"path\";s:22:\"/admin/config/workflow\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:8:\"Workflow\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/config/workflow$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/config/workflow\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/config/workflow\";s:8:\"numParts\";i:3;}}}}',3),('system.admin_content','/admin/content','/admin/content',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1354:{a:9:{s:4:\"path\";s:14:\"/admin/content\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:7:\"Content\";s:7:\"view_id\";s:7:\"content\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:0;}s:12:\"requirements\";a:1:{s:11:\"_permission\";s:23:\"access content overview\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:0;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:1:{i:0;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:0:{}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/admin/content$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/admin/content\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/admin/content\";s:8:\"numParts\";i:2;}}}}',2),('system.admin_index','/admin/index','/admin/index',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1116:{a:9:{s:4:\"path\";s:12:\"/admin/index\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:48:\"\\Drupal\\system\\Controller\\AdminController::index\";s:6:\"_title\";s:14:\"Administration\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":331:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:17:\"#^/admin/index$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:12:\"/admin/index\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:12:\"/admin/index\";s:8:\"numParts\";i:2;}}}}',2),('system.admin_reports','/admin/reports','/admin/reports',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1128:{a:9:{s:4:\"path\";s:14:\"/admin/reports\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:7:\"Reports\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:19:\"access site reports\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/admin/reports$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/admin/reports\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/admin/reports\";s:8:\"numParts\";i:2;}}}}',2),('system.admin_structure','/admin/structure','/admin/structure',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1146:{a:9:{s:4:\"path\";s:16:\"/admin/structure\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:9:\"Structure\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":343:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:21:\"#^/admin/structure$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:16:\"/admin/structure\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:16:\"/admin/structure\";s:8:\"numParts\";i:2;}}}}',2),('system.batch_page.html','/batch','/batch',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1178:{a:9:{s:4:\"path\";s:6:\"/batch\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:52:\"\\Drupal\\system\\Controller\\BatchController::batchPage\";s:15:\"_title_callback\";s:57:\"\\Drupal\\system\\Controller\\BatchController::batchPageTitle\";}s:12:\"requirements\";a:3:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_format\";s:4:\"html\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:3:{i:0;s:27:\"request_format_route_filter\";i:1;s:13:\"method_filter\";i:2;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":311:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:11:\"#^/batch$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:6:\"/batch\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:6:\"/batch\";s:8:\"numParts\";i:1;}}}}',1),('system.batch_page.json','/batch','/batch',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1090:{a:9:{s:4:\"path\";s:6:\"/batch\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:52:\"\\Drupal\\system\\Controller\\BatchController::batchPage\";}s:12:\"requirements\";a:3:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_format\";s:4:\"json\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:3:{i:0;s:27:\"request_format_route_filter\";i:1;s:13:\"method_filter\";i:2;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":311:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:11:\"#^/batch$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:6:\"/batch\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:6:\"/batch\";s:8:\"numParts\";i:1;}}}}',1),('system.cron','/cron/{key}','/cron/%',2,'C:31:\"Symfony\\Component\\Routing\\Route\":1134:{a:9:{s:4:\"path\";s:11:\"/cron/{key}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:34:\"\\Drupal\\system\\CronController::run\";}s:12:\"requirements\";a:2:{s:19:\"_access_system_cron\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:8:\"no_cache\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:17:\"access_check.cron\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":426:{a:11:{s:4:\"vars\";a:1:{i:0;s:3:\"key\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:26:\"#^/cron/(?P<key>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:3:\"key\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:5:\"/cron\";}}s:9:\"path_vars\";a:1:{i:0;s:3:\"key\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:2;s:14:\"patternOutline\";s:7:\"/cron/%\";s:8:\"numParts\";i:2;}}}}',2),('system.cron_settings','/admin/config/system/cron','/admin/config/system/cron',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1163:{a:9:{s:4:\"path\";s:25:\"/admin/config/system/cron\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:27:\"Drupal\\system\\Form\\CronForm\";s:6:\"_title\";s:4:\"Cron\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":371:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/config/system/cron$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/config/system/cron\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:25:\"/admin/config/system/cron\";s:8:\"numParts\";i:4;}}}}',4),('system.csrftoken','/session/token','/session/token',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1041:{a:9:{s:4:\"path\";s:14:\"/session/token\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:56:\"\\Drupal\\system\\Controller\\CsrfTokenController::csrfToken\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/session/token$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/session/token\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/session/token\";s:8:\"numParts\";i:2;}}}}',2),('system.date_format_add','/admin/config/regional/date-time/formats/add','/admin/config/regional/date-time/formats/add',63,'C:31:\"Symfony\\Component\\Routing\\Route\":1250:{a:9:{s:4:\"path\";s:44:\"/admin/config/regional/date-time/formats/add\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:12:\"_entity_form\";s:15:\"date_format.add\";s:6:\"_title\";s:15:\"Add date format\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:21:\"route_enhancer.entity\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":429:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:50:\"#^/admin/config/regional/date\\-time/formats/add$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:44:\"/admin/config/regional/date-time/formats/add\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:63;s:14:\"patternOutline\";s:44:\"/admin/config/regional/date-time/formats/add\";s:8:\"numParts\";i:6;}}}}',6),('system.db_update','/update.php/{op}','/update.php',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1166:{a:9:{s:4:\"path\";s:16:\"/update.php/{op}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:2:\"op\";s:4:\"info\";}s:12:\"requirements\";a:2:{s:21:\"_access_system_update\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"default_url_options\";a:1:{s:15:\"path_processing\";b:0;}s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:22:\"access_check.db_update\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":446:{a:11:{s:4:\"vars\";a:1:{i:0;s:2:\"op\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:37:\"#^/update\\.php(?:/(?P<op>[^/]++))?$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:2:\"op\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/update.php\";}}s:9:\"path_vars\";a:1:{i:0;s:2:\"op\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:11:\"/update.php\";s:8:\"numParts\";i:2;}}}}',2),('system.entity_autocomplete','/entity_reference_autocomplete/{target_type}/{selection_handler}/{selection_settings_key}','/entity_reference_autocomplete/%/%/%',8,'C:31:\"Symfony\\Component\\Routing\\Route\":1710:{a:9:{s:4:\"path\";s:89:\"/entity_reference_autocomplete/{target_type}/{selection_handler}/{selection_settings_key}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:74:\"\\Drupal\\system\\Controller\\EntityAutocompleteController::handleAutocomplete\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":913:{a:11:{s:4:\"vars\";a:3:{i:0;s:11:\"target_type\";i:1;s:17:\"selection_handler\";i:2;s:22:\"selection_settings_key\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:124:\"#^/entity_reference_autocomplete/(?P<target_type>[^/]++)/(?P<selection_handler>[^/]++)/(?P<selection_settings_key>[^/]++)$#s\";s:11:\"path_tokens\";a:4:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:22:\"selection_settings_key\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:17:\"selection_handler\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:11:\"target_type\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:30:\"/entity_reference_autocomplete\";}}s:9:\"path_vars\";a:3:{i:0;s:11:\"target_type\";i:1;s:17:\"selection_handler\";i:2;s:22:\"selection_settings_key\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:8;s:14:\"patternOutline\";s:36:\"/entity_reference_autocomplete/%/%/%\";s:8:\"numParts\";i:4;}}}}',4),('system.files','/system/files/{scheme}','/system/files',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1233:{a:9:{s:4:\"path\";s:22:\"/system/files/{scheme}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:3:{s:11:\"_controller\";s:46:\"Drupal\\system\\FileDownloadController::download\";s:6:\"scheme\";s:7:\"private\";s:25:\"_disable_route_normalizer\";b:1;}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":467:{a:11:{s:4:\"vars\";a:1:{i:0;s:6:\"scheme\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:42:\"#^/system/files(?:/(?P<scheme>[^/]++))?$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:6:\"scheme\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:13:\"/system/files\";}}s:9:\"path_vars\";a:1:{i:0;s:6:\"scheme\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:13:\"/system/files\";s:8:\"numParts\";i:3;}}}}',3),('system.file_system_settings','/admin/config/media/file-system','/admin/config/media/file-system',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1202:{a:9:{s:4:\"path\";s:31:\"/admin/config/media/file-system\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:33:\"Drupal\\system\\Form\\FileSystemForm\";s:6:\"_title\";s:11:\"File system\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":390:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:37:\"#^/admin/config/media/file\\-system$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:31:\"/admin/config/media/file-system\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:31:\"/admin/config/media/file-system\";s:8:\"numParts\";i:4;}}}}',4),('system.image_toolkit_settings','/admin/config/media/image-toolkit','/admin/config/media/image-toolkit',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1214:{a:9:{s:4:\"path\";s:33:\"/admin/config/media/image-toolkit\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:35:\"Drupal\\system\\Form\\ImageToolkitForm\";s:6:\"_title\";s:13:\"Image toolkit\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":396:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:39:\"#^/admin/config/media/image\\-toolkit$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:33:\"/admin/config/media/image-toolkit\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:33:\"/admin/config/media/image-toolkit\";s:8:\"numParts\";i:4;}}}}',4),('system.logging_settings','/admin/config/development/logging','/admin/config/development/logging',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1213:{a:9:{s:4:\"path\";s:33:\"/admin/config/development/logging\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:30:\"Drupal\\system\\Form\\LoggingForm\";s:6:\"_title\";s:18:\"Logging and errors\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":395:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:38:\"#^/admin/config/development/logging$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:33:\"/admin/config/development/logging\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:33:\"/admin/config/development/logging\";s:8:\"numParts\";i:4;}}}}',4),('system.machine_name_transliterate','/machine_name/transliterate','/machine_name/transliterate',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1107:{a:9:{s:4:\"path\";s:27:\"/machine_name/transliterate\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:51:\"\\Drupal\\system\\MachineNameController::transliterate\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":376:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:32:\"#^/machine_name/transliterate$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:27:\"/machine_name/transliterate\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:27:\"/machine_name/transliterate\";s:8:\"numParts\";i:2;}}}}',2),('system.modules_list','/admin/modules','/admin/modules',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1161:{a:9:{s:4:\"path\";s:14:\"/admin/modules\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:3:{s:6:\"_title\";s:6:\"Extend\";s:14:\"_title_context\";s:15:\"With components\";s:5:\"_form\";s:34:\"Drupal\\system\\Form\\ModulesListForm\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/admin/modules$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/admin/modules\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/admin/modules\";s:8:\"numParts\";i:2;}}}}',2),('system.modules_list_confirm','/admin/modules/list/confirm','/admin/modules/list/confirm',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1208:{a:9:{s:4:\"path\";s:27:\"/admin/modules/list/confirm\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:41:\"Drupal\\system\\Form\\ModulesListConfirmForm\";s:6:\"_title\";s:37:\"Some required modules must be enabled\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":377:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:32:\"#^/admin/modules/list/confirm$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:27:\"/admin/modules/list/confirm\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:27:\"/admin/modules/list/confirm\";s:8:\"numParts\";i:4;}}}}',4),('system.modules_list_experimental_confirm','/admin/modules/list/confirm-experimental','/admin/modules/list/confirm-experimental',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1256:{a:9:{s:4:\"path\";s:40:\"/admin/modules/list/confirm-experimental\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:53:\"Drupal\\system\\Form\\ModulesListExperimentalConfirmForm\";s:6:\"_title\";s:20:\"Experimental modules\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":417:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:46:\"#^/admin/modules/list/confirm\\-experimental$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:40:\"/admin/modules/list/confirm-experimental\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:40:\"/admin/modules/list/confirm-experimental\";s:8:\"numParts\";i:4;}}}}',4),('system.modules_uninstall','/admin/modules/uninstall','/admin/modules/uninstall',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1164:{a:9:{s:4:\"path\";s:24:\"/admin/modules/uninstall\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:39:\"Drupal\\system\\Form\\ModulesUninstallForm\";s:6:\"_title\";s:9:\"Uninstall\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":367:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:29:\"#^/admin/modules/uninstall$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:24:\"/admin/modules/uninstall\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:24:\"/admin/modules/uninstall\";s:8:\"numParts\";i:3;}}}}',3),('system.modules_uninstall_confirm','/admin/modules/uninstall/confirm','/admin/modules/uninstall/confirm',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1213:{a:9:{s:4:\"path\";s:32:\"/admin/modules/uninstall/confirm\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:46:\"Drupal\\system\\Form\\ModulesUninstallConfirmForm\";s:6:\"_title\";s:17:\"Confirm uninstall\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":392:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:37:\"#^/admin/modules/uninstall/confirm$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:32:\"/admin/modules/uninstall/confirm\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:32:\"/admin/modules/uninstall/confirm\";s:8:\"numParts\";i:4;}}}}',4),('system.performance_settings','/admin/config/development/performance','/admin/config/development/performance',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1226:{a:9:{s:4:\"path\";s:37:\"/admin/config/development/performance\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:34:\"Drupal\\system\\Form\\PerformanceForm\";s:6:\"_title\";s:11:\"Performance\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":407:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:42:\"#^/admin/config/development/performance$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:37:\"/admin/config/development/performance\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:37:\"/admin/config/development/performance\";s:8:\"numParts\";i:4;}}}}',4),('system.php','/admin/reports/status/php','/admin/reports/status/php',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1138:{a:9:{s:4:\"path\";s:25:\"/admin/reports/status/php\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:50:\"Drupal\\system\\Controller\\SystemInfoController::php\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":371:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/reports/status/php$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/reports/status/php\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:25:\"/admin/reports/status/php\";s:8:\"numParts\";i:4;}}}}',4),('system.prepare_modules_entity_uninstall','/admin/modules/uninstall/entity/{entity_type_id}','/admin/modules/uninstall/entity/%',30,'C:31:\"Symfony\\Component\\Routing\\Route\":1455:{a:9:{s:4:\"path\";s:48:\"/admin/modules/uninstall/entity/{entity_type_id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:53:\"\\Drupal\\system\\Form\\PrepareModulesEntityUninstallForm\";s:15:\"_title_callback\";s:64:\"\\Drupal\\system\\Form\\PrepareModulesEntityUninstallForm::formTitle\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:18:\"administer modules\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":554:{a:11:{s:4:\"vars\";a:1:{i:0;s:14:\"entity_type_id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:63:\"#^/admin/modules/uninstall/entity/(?P<entity_type_id>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:14:\"entity_type_id\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:31:\"/admin/modules/uninstall/entity\";}}s:9:\"path_vars\";a:1:{i:0;s:14:\"entity_type_id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:30;s:14:\"patternOutline\";s:33:\"/admin/modules/uninstall/entity/%\";s:8:\"numParts\";i:5;}}}}',5),('system.private_file_download','/system/files/{filepath}','/system/files/%',6,'C:31:\"Symfony\\Component\\Routing\\Route\":1192:{a:9:{s:4:\"path\";s:24:\"/system/files/{filepath}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:46:\"Drupal\\system\\FileDownloadController::download\";}s:12:\"requirements\";a:3:{s:8:\"filepath\";s:2:\".+\";s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":464:{a:11:{s:4:\"vars\";a:1:{i:0;s:8:\"filepath\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:35:\"#^/system/files/(?P<filepath>.+)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:2:\".+\";i:3;s:8:\"filepath\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:13:\"/system/files\";}}s:9:\"path_vars\";a:1:{i:0;s:8:\"filepath\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:6;s:14:\"patternOutline\";s:15:\"/system/files/%\";s:8:\"numParts\";i:3;}}}}',3),('system.regional_settings','/admin/config/regional/settings','/admin/config/regional/settings',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1205:{a:9:{s:4:\"path\";s:31:\"/admin/config/regional/settings\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:31:\"Drupal\\system\\Form\\RegionalForm\";s:6:\"_title\";s:17:\"Regional settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":389:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:36:\"#^/admin/config/regional/settings$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:31:\"/admin/config/regional/settings\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:31:\"/admin/config/regional/settings\";s:8:\"numParts\";i:4;}}}}',4),('system.rss_feeds_settings','/admin/config/services/rss-publishing','/admin/config/services/rss-publishing',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1227:{a:9:{s:4:\"path\";s:37:\"/admin/config/services/rss-publishing\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:31:\"Drupal\\system\\Form\\RssFeedsForm\";s:6:\"_title\";s:14:\"RSS publishing\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":408:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:43:\"#^/admin/config/services/rss\\-publishing$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:37:\"/admin/config/services/rss-publishing\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:37:\"/admin/config/services/rss-publishing\";s:8:\"numParts\";i:4;}}}}',4),('system.run_cron','/admin/reports/status/run-cron','/admin/reports/status/run-cron',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1229:{a:9:{s:4:\"path\";s:30:\"/admin/reports/status/run-cron\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:42:\"\\Drupal\\system\\CronController::runManually\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:29:\"administer site configuration\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:8:\"no_cache\";b:1;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":387:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:36:\"#^/admin/reports/status/run\\-cron$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:30:\"/admin/reports/status/run-cron\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:30:\"/admin/reports/status/run-cron\";s:8:\"numParts\";i:4;}}}}',4),('system.site_information_settings','/admin/config/system/site-information','/admin/config/system/site-information',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1239:{a:9:{s:4:\"path\";s:37:\"/admin/config/system/site-information\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:38:\"Drupal\\system\\Form\\SiteInformationForm\";s:6:\"_title\";s:19:\"Basic site settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":408:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:43:\"#^/admin/config/system/site\\-information$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:37:\"/admin/config/system/site-information\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:37:\"/admin/config/system/site-information\";s:8:\"numParts\";i:4;}}}}',4),('system.site_maintenance_mode','/admin/config/development/maintenance','/admin/config/development/maintenance',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1239:{a:9:{s:4:\"path\";s:37:\"/admin/config/development/maintenance\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:42:\"Drupal\\system\\Form\\SiteMaintenanceModeForm\";s:6:\"_title\";s:16:\"Maintenance mode\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":407:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:42:\"#^/admin/config/development/maintenance$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:37:\"/admin/config/development/maintenance\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:37:\"/admin/config/development/maintenance\";s:8:\"numParts\";i:4;}}}}',4),('system.status','/admin/reports/status','/admin/reports/status',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1159:{a:9:{s:4:\"path\";s:21:\"/admin/reports/status\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:54:\"\\Drupal\\system\\Controller\\SystemInfoController::status\";s:6:\"_title\";s:13:\"Status report\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":358:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:26:\"#^/admin/reports/status$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:21:\"/admin/reports/status\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:21:\"/admin/reports/status\";s:8:\"numParts\";i:3;}}}}',3),('system.temporary','/system/temporary','/system/temporary',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1073:{a:9:{s:4:\"path\";s:17:\"/system/temporary\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:47:\"\\Drupal\\system\\FileDownloadController::download\";s:6:\"scheme\";s:9:\"temporary\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":346:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:22:\"#^/system/temporary$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/system/temporary\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:17:\"/system/temporary\";s:8:\"numParts\";i:2;}}}}',2),('system.themes_page','/admin/appearance','/admin/appearance',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1128:{a:9:{s:4:\"path\";s:17:\"/admin/appearance\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:6:\"_title\";s:10:\"Appearance\";s:11:\"_controller\";s:54:\"\\Drupal\\system\\Controller\\SystemController::themesPage\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:17:\"administer themes\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":346:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:22:\"#^/admin/appearance$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/admin/appearance\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:17:\"/admin/appearance\";s:8:\"numParts\";i:2;}}}}',2),('system.theme_install','/admin/appearance/install','/admin/appearance/install',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1183:{a:9:{s:4:\"path\";s:25:\"/admin/appearance/install\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:49:\"Drupal\\system\\Controller\\ThemeController::install\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:17:\"administer themes\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":370:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/appearance/install$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/appearance/install\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:25:\"/admin/appearance/install\";s:8:\"numParts\";i:3;}}}}',3),('system.theme_settings','/admin/appearance/settings','/admin/appearance/settings',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1180:{a:9:{s:4:\"path\";s:26:\"/admin/appearance/settings\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:37:\"\\Drupal\\system\\Form\\ThemeSettingsForm\";s:6:\"_title\";s:19:\"Appearance settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:17:\"administer themes\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":373:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:31:\"#^/admin/appearance/settings$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:26:\"/admin/appearance/settings\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:26:\"/admin/appearance/settings\";s:8:\"numParts\";i:3;}}}}',3),('system.theme_settings_theme','/admin/appearance/settings/{theme}','/admin/appearance/settings/%',14,'C:31:\"Symfony\\Component\\Routing\\Route\":1327:{a:9:{s:4:\"path\";s:34:\"/admin/appearance/settings/{theme}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:37:\"\\Drupal\\system\\Form\\ThemeSettingsForm\";s:15:\"_title_callback\";s:21:\"theme_handler:getName\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:17:\"administer themes\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":500:{a:11:{s:4:\"vars\";a:1:{i:0;s:5:\"theme\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:49:\"#^/admin/appearance/settings/(?P<theme>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:5:\"theme\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:26:\"/admin/appearance/settings\";}}s:9:\"path_vars\";a:1:{i:0;s:5:\"theme\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:14;s:14:\"patternOutline\";s:28:\"/admin/appearance/settings/%\";s:8:\"numParts\";i:4;}}}}',4),('system.theme_set_default','/admin/appearance/default','/admin/appearance/default',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1233:{a:9:{s:4:\"path\";s:25:\"/admin/appearance/default\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:6:\"_title\";s:20:\"Set as default theme\";s:11:\"_controller\";s:58:\"\\Drupal\\system\\Controller\\ThemeController::setDefaultTheme\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:17:\"administer themes\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":370:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/appearance/default$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/appearance/default\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:25:\"/admin/appearance/default\";s:8:\"numParts\";i:3;}}}}',3),('system.theme_uninstall','/admin/appearance/uninstall','/admin/appearance/uninstall',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1193:{a:9:{s:4:\"path\";s:27:\"/admin/appearance/uninstall\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:51:\"Drupal\\system\\Controller\\ThemeController::uninstall\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:17:\"administer themes\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":376:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:32:\"#^/admin/appearance/uninstall$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:27:\"/admin/appearance/uninstall\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:27:\"/admin/appearance/uninstall\";s:8:\"numParts\";i:3;}}}}',3),('system.timezone','/system/timezone/{abbreviation}/{offset}/{is_daylight_saving_time}','/system/timezone',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1676:{a:9:{s:4:\"path\";s:66:\"/system/timezone/{abbreviation}/{offset}/{is_daylight_saving_time}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:4:{s:11:\"_controller\";s:57:\"\\Drupal\\system\\Controller\\TimezoneController::getTimezone\";s:12:\"abbreviation\";s:0:\"\";s:6:\"offset\";i:-1;s:23:\"is_daylight_saving_time\";N;}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":841:{a:11:{s:4:\"vars\";a:3:{i:0;s:12:\"abbreviation\";i:1;s:6:\"offset\";i:2;s:23:\"is_daylight_saving_time\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:116:\"#^/system/timezone(?:/(?P<abbreviation>[^/]++)(?:/(?P<offset>[^/]++)(?:/(?P<is_daylight_saving_time>[^/]++))?)?)?$#s\";s:11:\"path_tokens\";a:4:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:23:\"is_daylight_saving_time\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:6:\"offset\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:12:\"abbreviation\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:16:\"/system/timezone\";}}s:9:\"path_vars\";a:3:{i:0;s:12:\"abbreviation\";i:1;s:6:\"offset\";i:2;s:23:\"is_daylight_saving_time\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:16:\"/system/timezone\";s:8:\"numParts\";i:5;}}}}',5),('token.autocomplete','/token/autocomplete/{token_type}/{filter}','/token/autocomplete/%/%',12,'C:31:\"Symfony\\Component\\Routing\\Route\":1373:{a:9:{s:4:\"path\";s:41:\"/token/autocomplete/{token_type}/{filter}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:66:\"\\Drupal\\token\\Controller\\TokenAutocompleteController::autocomplete\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":632:{a:11:{s:4:\"vars\";a:2:{i:0;s:10:\"token_type\";i:1;s:6:\"filter\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:66:\"#^/token/autocomplete/(?P<token_type>[^/]++)/(?P<filter>[^/]++)$#s\";s:11:\"path_tokens\";a:3:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:6:\"filter\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"token_type\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:19:\"/token/autocomplete\";}}s:9:\"path_vars\";a:2:{i:0;s:10:\"token_type\";i:1;s:6:\"filter\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:12;s:14:\"patternOutline\";s:23:\"/token/autocomplete/%/%\";s:8:\"numParts\";i:4;}}}}',4),('token.tree','/token/tree','/token/tree',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1031:{a:9:{s:4:\"path\";s:11:\"/token/tree\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:56:\"\\Drupal\\token\\Controller\\TokenTreeController::outputTree\";}s:12:\"requirements\";a:2:{s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":328:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:16:\"#^/token/tree$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/token/tree\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:11:\"/token/tree\";s:8:\"numParts\";i:2;}}}}',2),('toolbar.subtrees','/toolbar/subtrees/{hash}','/toolbar/subtrees/%',6,'C:31:\"Symfony\\Component\\Routing\\Route\":1252:{a:9:{s:4:\"path\";s:24:\"/toolbar/subtrees/{hash}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:58:\"\\Drupal\\toolbar\\Controller\\ToolbarController::subtreesAjax\";}s:12:\"requirements\";a:2:{s:14:\"_custom_access\";s:64:\"\\Drupal\\toolbar\\Controller\\ToolbarController::checkSubTreeAccess\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.custom\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":468:{a:11:{s:4:\"vars\";a:1:{i:0;s:4:\"hash\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:39:\"#^/toolbar/subtrees/(?P<hash>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"hash\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/toolbar/subtrees\";}}s:9:\"path_vars\";a:1:{i:0;s:4:\"hash\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:6;s:14:\"patternOutline\";s:19:\"/toolbar/subtrees/%\";s:8:\"numParts\";i:3;}}}}',3),('update.confirmation_page','/admin/update/ready','/admin/update/ready',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1239:{a:9:{s:4:\"path\";s:19:\"/admin/update/ready\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:31:\"\\Drupal\\update\\Form\\UpdateReady\";s:6:\"_title\";s:15:\"Ready to update\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":352:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:24:\"#^/admin/update/ready$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:19:\"/admin/update/ready\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:19:\"/admin/update/ready\";s:8:\"numParts\";i:3;}}}}',3),('update.manual_status','/admin/reports/updates/check','/admin/reports/updates/check',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1263:{a:9:{s:4:\"path\";s:28:\"/admin/reports/updates/check\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:6:\"_title\";s:19:\"Manual update check\";s:11:\"_controller\";s:64:\"\\Drupal\\update\\Controller\\UpdateController::updateStatusManually\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:29:\"administer site configuration\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":380:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:33:\"#^/admin/reports/updates/check$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:28:\"/admin/reports/updates/check\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:28:\"/admin/reports/updates/check\";s:8:\"numParts\";i:4;}}}}',4),('update.module_install','/admin/modules/install','/admin/modules/install',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1263:{a:9:{s:4:\"path\";s:22:\"/admin/modules/install\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:40:\"\\Drupal\\update\\Form\\UpdateManagerInstall\";s:6:\"_title\";s:18:\"Install new module\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/modules/install$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/modules/install\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/modules/install\";s:8:\"numParts\";i:3;}}}}',3),('update.module_update','/admin/modules/update','/admin/modules/update',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1245:{a:9:{s:4:\"path\";s:21:\"/admin/modules/update\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:39:\"\\Drupal\\update\\Form\\UpdateManagerUpdate\";s:6:\"_title\";s:6:\"Update\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":358:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:26:\"#^/admin/modules/update$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:21:\"/admin/modules/update\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:21:\"/admin/modules/update\";s:8:\"numParts\";i:3;}}}}',3),('update.report_install','/admin/reports/updates/install','/admin/reports/updates/install',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1284:{a:9:{s:4:\"path\";s:30:\"/admin/reports/updates/install\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:40:\"\\Drupal\\update\\Form\\UpdateManagerInstall\";s:6:\"_title\";s:7:\"Install\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":386:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:35:\"#^/admin/reports/updates/install$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:30:\"/admin/reports/updates/install\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:30:\"/admin/reports/updates/install\";s:8:\"numParts\";i:4;}}}}',4),('update.report_update','/admin/reports/updates/update','/admin/reports/updates/update',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1278:{a:9:{s:4:\"path\";s:29:\"/admin/reports/updates/update\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:39:\"\\Drupal\\update\\Form\\UpdateManagerUpdate\";s:6:\"_title\";s:6:\"Update\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":383:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:34:\"#^/admin/reports/updates/update$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:29:\"/admin/reports/updates/update\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:29:\"/admin/reports/updates/update\";s:8:\"numParts\";i:4;}}}}',4),('update.settings','/admin/reports/updates/settings','/admin/reports/updates/settings',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1213:{a:9:{s:4:\"path\";s:31:\"/admin/reports/updates/settings\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:33:\"\\Drupal\\update\\UpdateSettingsForm\";s:6:\"_title\";s:23:\"Update Manager settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":389:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:36:\"#^/admin/reports/updates/settings$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:31:\"/admin/reports/updates/settings\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:31:\"/admin/reports/updates/settings\";s:8:\"numParts\";i:4;}}}}',4),('update.status','/admin/reports/updates','/admin/reports/updates',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1169:{a:9:{s:4:\"path\";s:22:\"/admin/reports/updates\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:56:\"\\Drupal\\update\\Controller\\UpdateController::updateStatus\";s:6:\"_title\";s:17:\"Available updates\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:29:\"administer site configuration\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/reports/updates$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/reports/updates\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/reports/updates\";s:8:\"numParts\";i:3;}}}}',3),('update.theme_install','/admin/theme/install','/admin/theme/install',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1254:{a:9:{s:4:\"path\";s:20:\"/admin/theme/install\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:40:\"\\Drupal\\update\\Form\\UpdateManagerInstall\";s:6:\"_title\";s:17:\"Install new theme\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/theme/install$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/theme/install\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/theme/install\";s:8:\"numParts\";i:3;}}}}',3),('update.theme_update','/admin/theme/update','/admin/theme/update',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1237:{a:9:{s:4:\"path\";s:19:\"/admin/theme/update\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:39:\"\\Drupal\\update\\Form\\UpdateManagerUpdate\";s:6:\"_title\";s:6:\"Update\";}s:12:\"requirements\";a:3:{s:11:\"_permission\";s:27:\"administer software updates\";s:22:\"_access_update_manager\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:2:{i:0;s:23:\"access_check.permission\";i:1;s:34:\"access_check.update.manager_access\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":352:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:24:\"#^/admin/theme/update$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:19:\"/admin/theme/update\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:19:\"/admin/theme/update\";s:8:\"numParts\";i:3;}}}}',3),('user.admin_create','/admin/people/create','/admin/people/create',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1129:{a:9:{s:4:\"path\";s:20:\"/admin/people/create\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:12:\"_entity_form\";s:13:\"user.register\";s:6:\"_title\";s:8:\"Add user\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer users\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:21:\"route_enhancer.entity\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/people/create$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/people/create\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/people/create\";s:8:\"numParts\";i:3;}}}}',3),('user.admin_index','/admin/config/people','/admin/config/people',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1159:{a:9:{s:4:\"path\";s:20:\"/admin/config/people\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:68:\"\\Drupal\\system\\Controller\\SystemController::systemAdminMenuBlockPage\";s:6:\"_title\";s:6:\"People\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:27:\"access administration pages\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/config/people$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/config/people\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/config/people\";s:8:\"numParts\";i:3;}}}}',3),('user.admin_permissions','/admin/people/permissions','/admin/people/permissions',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1173:{a:9:{s:4:\"path\";s:25:\"/admin/people/permissions\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:37:\"\\Drupal\\user\\Form\\UserPermissionsForm\";s:6:\"_title\";s:11:\"Permissions\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:22:\"administer permissions\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":370:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:30:\"#^/admin/people/permissions$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:25:\"/admin/people/permissions\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:25:\"/admin/people/permissions\";s:8:\"numParts\";i:3;}}}}',3),('user.cancel_confirm','/user/{user}/cancel/confirm/{timestamp}/{hashed_pass}','/user/%/cancel/confirm',11,'C:31:\"Symfony\\Component\\Routing\\Route\":1796:{a:9:{s:4:\"path\";s:53:\"/user/{user}/cancel/confirm/{timestamp}/{hashed_pass}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:4:{s:6:\"_title\";s:28:\"Confirm account cancellation\";s:11:\"_controller\";s:53:\"\\Drupal\\user\\Controller\\UserController::confirmCancel\";s:9:\"timestamp\";i:0;s:11:\"hashed_pass\";s:0:\"\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"user.delete\";s:4:\"user\";s:3:\"\\d+\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"user\";a:2:{s:4:\"type\";s:11:\"entity:user\";s:9:\"converter\";s:21:\"paramconverter.entity\";}}s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":809:{a:11:{s:4:\"vars\";a:3:{i:0;s:4:\"user\";i:1;s:9:\"timestamp\";i:2;s:11:\"hashed_pass\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:95:\"#^/user/(?P<user>\\d+)/cancel/confirm(?:/(?P<timestamp>[^/]++)(?:/(?P<hashed_pass>[^/]++))?)?$#s\";s:11:\"path_tokens\";a:5:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:11:\"hashed_pass\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:9:\"timestamp\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:15:\"/cancel/confirm\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:3:\"\\d+\";i:3;s:4:\"user\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:5:\"/user\";}}s:9:\"path_vars\";a:3:{i:0;s:4:\"user\";i:1;s:9:\"timestamp\";i:2;s:11:\"hashed_pass\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:11;s:14:\"patternOutline\";s:22:\"/user/%/cancel/confirm\";s:8:\"numParts\";i:6;}}}}',6),('user.login','/user/login','/user/login',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1108:{a:9:{s:4:\"path\";s:11:\"/user/login\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:31:\"\\Drupal\\user\\Form\\UserLoginForm\";s:6:\"_title\";s:6:\"Log in\";}s:12:\"requirements\";a:2:{s:18:\"_user_is_logged_in\";s:5:\"FALSE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"_maintenance_access\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":328:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:16:\"#^/user/login$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/user/login\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:11:\"/user/login\";s:8:\"numParts\";i:2;}}}}',2),('user.login.http','/user/login','/user/login',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1101:{a:9:{s:4:\"path\";s:11:\"/user/login\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:59:\"\\Drupal\\user\\Controller\\UserAuthenticationController::login\";}s:12:\"requirements\";a:3:{s:18:\"_user_is_logged_in\";s:5:\"FALSE\";s:7:\"_format\";s:4:\"json\";s:7:\"_method\";s:4:\"POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:3:{i:0;s:27:\"request_format_route_filter\";i:1;s:13:\"method_filter\";i:2;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:1:{i:0;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":328:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:16:\"#^/user/login$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/user/login\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:11:\"/user/login\";s:8:\"numParts\";i:2;}}}}',2),('user.login_status.http','/user/login_status','/user/login_status',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1110:{a:9:{s:4:\"path\";s:18:\"/user/login_status\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:65:\"\\Drupal\\user\\Controller\\UserAuthenticationController::loginStatus\";}s:12:\"requirements\";a:3:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_format\";s:4:\"json\";s:7:\"_method\";s:3:\"GET\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:3:{i:0;s:27:\"request_format_route_filter\";i:1;s:13:\"method_filter\";i:2;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:1:{i:0;s:3:\"GET\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":349:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:23:\"#^/user/login_status$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:18:\"/user/login_status\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:18:\"/user/login_status\";s:8:\"numParts\";i:2;}}}}',2),('user.logout','/user/logout','/user/logout',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1045:{a:9:{s:4:\"path\";s:12:\"/user/logout\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:46:\"\\Drupal\\user\\Controller\\UserController::logout\";}s:12:\"requirements\";a:2:{s:18:\"_user_is_logged_in\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":331:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:17:\"#^/user/logout$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:12:\"/user/logout\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:12:\"/user/logout\";s:8:\"numParts\";i:2;}}}}',2),('user.logout.http','/user/logout','/user/logout',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1164:{a:9:{s:4:\"path\";s:12:\"/user/logout\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:60:\"\\Drupal\\user\\Controller\\UserAuthenticationController::logout\";}s:12:\"requirements\";a:4:{s:18:\"_user_is_logged_in\";s:4:\"TRUE\";s:7:\"_format\";s:4:\"json\";s:11:\"_csrf_token\";s:4:\"TRUE\";s:7:\"_method\";s:4:\"POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:3:{i:0;s:27:\"request_format_route_filter\";i:1;s:13:\"method_filter\";i:2;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:2:{i:0;s:30:\"access_check.user.login_status\";i:1;s:17:\"access_check.csrf\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:1:{i:0;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":331:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:17:\"#^/user/logout$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:12:\"/user/logout\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:12:\"/user/logout\";s:8:\"numParts\";i:2;}}}}',2),('user.multiple_cancel_confirm','/admin/people/cancel','/admin/people/cancel',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1153:{a:9:{s:4:\"path\";s:20:\"/admin/people/cancel\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:43:\"\\Drupal\\user\\Form\\UserMultipleCancelConfirm\";s:6:\"_title\";s:11:\"Cancel user\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer users\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/people/cancel$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/people/cancel\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/people/cancel\";s:8:\"numParts\";i:3;}}}}',3),('user.page','/user','/user',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1047:{a:9:{s:4:\"path\";s:5:\"/user\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:48:\"\\Drupal\\user\\Controller\\UserController::userPage\";s:6:\"_title\";s:10:\"My account\";}s:12:\"requirements\";a:2:{s:18:\"_user_is_logged_in\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":308:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:10:\"#^/user$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:5:\"/user\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:5:\"/user\";s:8:\"numParts\";i:1;}}}}',1),('user.pass','/user/password','/user/password',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1114:{a:9:{s:4:\"path\";s:14:\"/user/password\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:34:\"\\Drupal\\user\\Form\\UserPasswordForm\";s:6:\"_title\";s:19:\"Reset your password\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"_maintenance_access\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/user/password$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/user/password\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/user/password\";s:8:\"numParts\";i:2;}}}}',2),('user.register','/user/register','/user/register',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1092:{a:9:{s:4:\"path\";s:14:\"/user/register\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:12:\"_entity_form\";s:13:\"user.register\";s:6:\"_title\";s:18:\"Create new account\";}s:12:\"requirements\";a:2:{s:21:\"_access_user_register\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:21:\"route_enhancer.entity\";}s:14:\"_access_checks\";a:1:{i:0;s:26:\"access_check.user.register\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/user/register$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/user/register\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/user/register\";s:8:\"numParts\";i:2;}}}}',2),('user.reset','/user/reset/{uid}/{timestamp}/{hash}','/user/reset/%/%/%',24,'C:31:\"Symfony\\Component\\Routing\\Route\":1515:{a:9:{s:4:\"path\";s:36:\"/user/reset/{uid}/{timestamp}/{hash}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:49:\"\\Drupal\\user\\Controller\\UserController::resetPass\";s:6:\"_title\";s:14:\"Reset password\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"_maintenance_access\";b:1;s:8:\"no_cache\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":711:{a:11:{s:4:\"vars\";a:3:{i:0;s:3:\"uid\";i:1;s:9:\"timestamp\";i:2;s:4:\"hash\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:71:\"#^/user/reset/(?P<uid>[^/]++)/(?P<timestamp>[^/]++)/(?P<hash>[^/]++)$#s\";s:11:\"path_tokens\";a:4:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"hash\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:9:\"timestamp\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:3:\"uid\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/user/reset\";}}s:9:\"path_vars\";a:3:{i:0;s:3:\"uid\";i:1;s:9:\"timestamp\";i:2;s:4:\"hash\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:24;s:14:\"patternOutline\";s:17:\"/user/reset/%/%/%\";s:8:\"numParts\";i:5;}}}}',5),('user.reset.form','/user/reset/{uid}','/user/reset/%',6,'C:31:\"Symfony\\Component\\Routing\\Route\":1261:{a:9:{s:4:\"path\";s:17:\"/user/reset/{uid}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:56:\"\\Drupal\\user\\Controller\\UserController::getResetPassForm\";s:6:\"_title\";s:14:\"Reset password\";}s:12:\"requirements\";a:2:{s:18:\"_user_is_logged_in\";s:5:\"FALSE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"_maintenance_access\";b:1;s:8:\"no_cache\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":446:{a:11:{s:4:\"vars\";a:1:{i:0;s:3:\"uid\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:32:\"#^/user/reset/(?P<uid>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:3:\"uid\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/user/reset\";}}s:9:\"path_vars\";a:1:{i:0;s:3:\"uid\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:6;s:14:\"patternOutline\";s:13:\"/user/reset/%\";s:8:\"numParts\";i:3;}}}}',3),('user.reset.login','/user/reset/{uid}/{timestamp}/{hash}/login','/user/reset/%/%/%/login',49,'C:31:\"Symfony\\Component\\Routing\\Route\":1603:{a:9:{s:4:\"path\";s:42:\"/user/reset/{uid}/{timestamp}/{hash}/login\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:54:\"\\Drupal\\user\\Controller\\UserController::resetPassLogin\";s:6:\"_title\";s:14:\"Reset password\";}s:12:\"requirements\";a:2:{s:18:\"_user_is_logged_in\";s:5:\"FALSE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:19:\"_maintenance_access\";b:1;s:8:\"no_cache\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:30:\"access_check.user.login_status\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":765:{a:11:{s:4:\"vars\";a:3:{i:0;s:3:\"uid\";i:1;s:9:\"timestamp\";i:2;s:4:\"hash\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:77:\"#^/user/reset/(?P<uid>[^/]++)/(?P<timestamp>[^/]++)/(?P<hash>[^/]++)/login$#s\";s:11:\"path_tokens\";a:5:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:6:\"/login\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"hash\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:9:\"timestamp\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:3:\"uid\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/user/reset\";}}s:9:\"path_vars\";a:3:{i:0;s:3:\"uid\";i:1;s:9:\"timestamp\";i:2;s:4:\"hash\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:49;s:14:\"patternOutline\";s:23:\"/user/reset/%/%/%/login\";s:8:\"numParts\";i:6;}}}}',6),('user.role_add','/admin/people/roles/add','/admin/people/roles/add',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1152:{a:9:{s:4:\"path\";s:23:\"/admin/people/roles/add\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:12:\"_entity_form\";s:17:\"user_role.default\";s:6:\"_title\";s:8:\"Add role\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:22:\"administer permissions\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:21:\"route_enhancer.entity\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":365:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:28:\"#^/admin/people/roles/add$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:23:\"/admin/people/roles/add\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:23:\"/admin/people/roles/add\";s:8:\"numParts\";i:4;}}}}',4),('view.block_content.page_1','/admin/structure/block/block-content','/admin/structure/block/block-content',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1542:{a:9:{s:4:\"path\";s:36:\"/admin/structure/block/block-content\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:20:\"Custom block library\";s:7:\"view_id\";s:13:\"block_content\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:17:\"administer blocks\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":405:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:42:\"#^/admin/structure/block/block\\-content$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:36:\"/admin/structure/block/block-content\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:36:\"/admin/structure/block/block-content\";s:8:\"numParts\";i:4;}}}}',4),('view.content.page_1','/admin/content','/admin/content',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1437:{a:9:{s:4:\"path\";s:14:\"/admin/content\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:7:\"Content\";s:7:\"view_id\";s:7:\"content\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:0;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:23:\"access content overview\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:0;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":337:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:19:\"#^/admin/content$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/admin/content\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:14:\"/admin/content\";s:8:\"numParts\";i:2;}}}}',2),('view.files.page_1','/admin/content/files','/admin/content/files',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1455:{a:9:{s:4:\"path\";s:20:\"/admin/content/files\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:5:\"Files\";s:7:\"view_id\";s:5:\"files\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:21:\"access files overview\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/content/files$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/content/files\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/content/files\";s:8:\"numParts\";i:3;}}}}',3),('view.files.page_2','/admin/content/files/usage/{arg_0}','/admin/content/files/usage/%',30,'C:31:\"Symfony\\Component\\Routing\\Route\":1644:{a:9:{s:4:\"path\";s:34:\"/admin/content/files/usage/{arg_0}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:10:\"File usage\";s:7:\"view_id\";s:5:\"files\";s:10:\"display_id\";s:6:\"page_2\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:21:\"access files overview\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:1:{s:5:\"arg_0\";s:5:\"arg_0\";}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":500:{a:11:{s:4:\"vars\";a:1:{i:0;s:5:\"arg_0\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:49:\"#^/admin/content/files/usage/(?P<arg_0>[^/]++)$#s\";s:11:\"path_tokens\";a:2:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:5:\"arg_0\";}i:1;a:2:{i:0;s:4:\"text\";i:1;s:26:\"/admin/content/files/usage\";}}s:9:\"path_vars\";a:1:{i:0;s:5:\"arg_0\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:30;s:14:\"patternOutline\";s:28:\"/admin/content/files/usage/%\";s:8:\"numParts\";i:5;}}}}',5),('view.fontyourface_font_manager.page_1','/admin/appearance/font','/admin/appearance/font',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1496:{a:9:{s:4:\"path\";s:22:\"/admin/appearance/font\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"Font Selector\";s:7:\"view_id\";s:25:\"fontyourface_font_manager\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:24:\"administer font entities\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":361:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:27:\"#^/admin/appearance/font$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/appearance/font\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:22:\"/admin/appearance/font\";s:8:\"numParts\";i:3;}}}}',3),('view.frontpage.feed_1','/rss.xml','/rss.xml',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1372:{a:9:{s:4:\"path\";s:8:\"/rss.xml\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:0:\"\";s:7:\"view_id\";s:9:\"frontpage\";s:10:\"display_id\";s:6:\"feed_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"feed\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Feed\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":318:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:14:\"#^/rss\\.xml$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:8:\"/rss.xml\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:8:\"/rss.xml\";s:8:\"numParts\";i:1;}}}}',1),('view.frontpage.page_1','/node','/node',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1359:{a:9:{s:4:\"path\";s:5:\"/node\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:0:\"\";s:7:\"view_id\";s:9:\"frontpage\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":308:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:10:\"#^/node$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:5:\"/node\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:5:\"/node\";s:8:\"numParts\";i:1;}}}}',1),('view.highlighted_yaffs_features.page_1','/features','/features',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1407:{a:9:{s:4:\"path\";s:9:\"/features\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"The best bits\";s:7:\"view_id\";s:26:\"highlighted_yaffs_features\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":320:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:14:\"#^/features$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:9:\"/features\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:9:\"/features\";s:8:\"numParts\";i:1;}}}}',1),('view.highlighted_yaffs_features.page_2','/admin/yaffs-dashboard/order-features','/admin/yaffs-dashboard/order-features',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1549:{a:9:{s:4:\"path\";s:37:\"/admin/yaffs-dashboard/order-features\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"The best bits\";s:7:\"view_id\";s:26:\"highlighted_yaffs_features\";s:10:\"display_id\";s:6:\"page_2\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":408:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:44:\"#^/admin/yaffs\\-dashboard/order\\-features$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:37:\"/admin/yaffs-dashboard/order-features\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:37:\"/admin/yaffs-dashboard/order-features\";s:8:\"numParts\";i:3;}}}}',3),('view.media_library.global_media_library_page','/admin/content/media','/admin/content/media',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1493:{a:9:{s:4:\"path\";s:20:\"/admin/content/media\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"Media Library\";s:7:\"view_id\";s:13:\"media_library\";s:10:\"display_id\";s:25:\"global_media_library_page\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:21:\"access media overview\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/admin/content/media$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/admin/content/media\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:20:\"/admin/content/media\";s:8:\"numParts\";i:3;}}}}',3),('view.media_library.user_media_library','/user/{user}/media','/user/%/media',5,'C:31:\"Symfony\\Component\\Routing\\Route\":1613:{a:9:{s:4:\"path\";s:18:\"/user/{user}/media\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"Media Library\";s:7:\"view_id\";s:13:\"media_library\";s:10:\"display_id\";s:18:\"user_media_library\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:22:\"edit own media content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:1:{s:5:\"arg_0\";s:4:\"user\";}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":485:{a:11:{s:4:\"vars\";a:1:{i:0;s:4:\"user\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:33:\"#^/user/(?P<user>[^/]++)/media$#s\";s:11:\"path_tokens\";a:3:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:6:\"/media\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"user\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:5:\"/user\";}}s:9:\"path_vars\";a:1:{i:0;s:4:\"user\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:5;s:14:\"patternOutline\";s:13:\"/user/%/media\";s:8:\"numParts\";i:3;}}}}',3),('view.redirect.page_1','/admin/config/search/redirect','/admin/config/search/redirect',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1497:{a:9:{s:4:\"path\";s:29:\"/admin/config/search/redirect\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:8:\"Redirect\";s:7:\"view_id\";s:8:\"redirect\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:20:\"administer redirects\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":383:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:34:\"#^/admin/config/search/redirect$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:29:\"/admin/config/search/redirect\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:29:\"/admin/config/search/redirect\";s:8:\"numParts\";i:4;}}}}',4),('view.redirect_404.page_1','/admin/config/search/redirect/404','/admin/config/search/redirect/404',31,'C:31:\"Symfony\\Component\\Routing\\Route\":1523:{a:9:{s:4:\"path\";s:33:\"/admin/config/search/redirect/404\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:13:\"Fix 404 pages\";s:7:\"view_id\";s:12:\"redirect_404\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:19:\"access site reports\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":395:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:38:\"#^/admin/config/search/redirect/404$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:33:\"/admin/config/search/redirect/404\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:31;s:14:\"patternOutline\";s:33:\"/admin/config/search/redirect/404\";s:8:\"numParts\";i:5;}}}}',5),('view.testi.page_1','/testi','/testi',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1364:{a:9:{s:4:\"path\";s:6:\"/testi\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:5:\"testi\";s:7:\"view_id\";s:5:\"testi\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":311:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:11:\"#^/testi$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:6:\"/testi\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:6:\"/testi\";s:8:\"numParts\";i:1;}}}}',1),('view.user_admin_people.page_1','/admin/people','/admin/people',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1436:{a:9:{s:4:\"path\";s:13:\"/admin/people\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:6:\"People\";s:7:\"view_id\";s:17:\"user_admin_people\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:0;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer users\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:0;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":334:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:18:\"#^/admin/people$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:13:\"/admin/people\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:13:\"/admin/people\";s:8:\"numParts\";i:2;}}}}',2),('view.yaffs_documents.page_1','/documents','/documents',1,'C:31:\"Symfony\\Component\\Routing\\Route\":1398:{a:9:{s:4:\"path\";s:10:\"/documents\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:9:\"Documents\";s:7:\"view_id\";s:15:\"yaffs_documents\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":325:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:15:\"#^/documents$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:10:\"/documents\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:1;s:14:\"patternOutline\";s:10:\"/documents\";s:8:\"numParts\";i:1;}}}}',1),('view.yaffs_documents.page_2','/documents/detail','/documents/detail',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1436:{a:9:{s:4:\"path\";s:17:\"/documents/detail\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:18:\"Documents - Detail\";s:7:\"view_id\";s:15:\"yaffs_documents\";s:10:\"display_id\";s:6:\"page_2\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":346:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:22:\"#^/documents/detail$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/documents/detail\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:17:\"/documents/detail\";s:8:\"numParts\";i:2;}}}}',2),('view.yaffs_documents.page_3','/documents/technical','/documents/technical',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1451:{a:9:{s:4:\"path\";s:20:\"/documents/technical\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:21:\"Documents - Technical\";s:7:\"view_id\";s:15:\"yaffs_documents\";s:10:\"display_id\";s:6:\"page_3\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":355:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:25:\"#^/documents/technical$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:20:\"/documents/technical\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:20:\"/documents/technical\";s:8:\"numParts\";i:2;}}}}',2),('view.yaffs_documents.page_4','/documents/archive','/documents/archive',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1441:{a:9:{s:4:\"path\";s:18:\"/documents/archive\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:19:\"Documents - Archive\";s:7:\"view_id\";s:15:\"yaffs_documents\";s:10:\"display_id\";s:6:\"page_4\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":349:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:23:\"#^/documents/archive$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:18:\"/documents/archive\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:18:\"/documents/archive\";s:8:\"numParts\";i:2;}}}}',2),('view.yaffs_documents.page_5','/documents/video','/documents/video',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1431:{a:9:{s:4:\"path\";s:16:\"/documents/video\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:17:\"Documents - Video\";s:7:\"view_id\";s:15:\"yaffs_documents\";s:10:\"display_id\";s:6:\"page_5\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:9:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":343:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:21:\"#^/documents/video$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:16:\"/documents/video\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:16:\"/documents/video\";s:8:\"numParts\";i:2;}}}}',2),('view.yaffs_documents_highlights.page_1','/admin/yaffs-dashboard/ordering/document_highlights','/admin/yaffs-dashboard/ordering/document_highlights',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1633:{a:9:{s:4:\"path\";s:51:\"/admin/yaffs-dashboard/ordering/document_highlights\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:35:\"Yaffs documents highlights ordering\";s:7:\"view_id\";s:26:\"yaffs_documents_highlights\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:5:\"_role\";s:28:\"administrators+administrator\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:22:\"access_check.user.role\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":450:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:57:\"#^/admin/yaffs\\-dashboard/ordering/document_highlights$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:51:\"/admin/yaffs-dashboard/ordering/document_highlights\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:51:\"/admin/yaffs-dashboard/ordering/document_highlights\";s:8:\"numParts\";i:4;}}}}',4),('view.yaffs_user_logos.page_1','/admin/yaffs-dashboard/order-logos','/admin/yaffs-dashboard/order-logos',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1530:{a:9:{s:4:\"path\";s:34:\"/admin/yaffs-dashboard/order-logos\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:5:{s:11:\"_controller\";s:47:\"Drupal\\views\\Routing\\ViewPageController::handle\";s:6:\"_title\";s:16:\"Yaffs user logos\";s:7:\"view_id\";s:16:\"yaffs_user_logos\";s:10:\"display_id\";s:6:\"page_1\";s:30:\"_view_display_show_admin_links\";b:1;}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:14:\"access content\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:10:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:18:\"_view_argument_map\";a:0:{}s:23:\"_view_display_plugin_id\";s:4:\"page\";s:26:\"_view_display_plugin_class\";s:38:\"Drupal\\views\\Plugin\\views\\display\\Page\";s:30:\"_view_display_show_admin_links\";b:1;s:16:\"returns_response\";b:0;s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":399:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:41:\"#^/admin/yaffs\\-dashboard/order\\-logos$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:34:\"/admin/yaffs-dashboard/order-logos\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:34:\"/admin/yaffs-dashboard/order-logos\";s:8:\"numParts\";i:3;}}}}',3),('views.ajax','/views/ajax','/views/ajax',3,'C:31:\"Symfony\\Component\\Routing\\Route\":1026:{a:9:{s:4:\"path\";s:11:\"/views/ajax\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:53:\"\\Drupal\\views\\Controller\\ViewAjaxController::ajaxView\";}s:12:\"requirements\";a:2:{s:7:\"_access\";s:4:\"TRUE\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:4:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:20:\"access_check.default\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":328:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:16:\"#^/views/ajax$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:11:\"/views/ajax\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:3;s:14:\"patternOutline\";s:11:\"/views/ajax\";s:8:\"numParts\";i:2;}}}}',2),('views_ui.add','/admin/structure/views/add','/admin/structure/views/add',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1148:{a:9:{s:4:\"path\";s:26:\"/admin/structure/views/add\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:12:\"_entity_form\";s:8:\"view.add\";s:6:\"_title\";s:8:\"Add view\";}s:12:\"requirements\";a:2:{s:21:\"_entity_create_access\";s:4:\"view\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:21:\"route_enhancer.entity\";}s:14:\"_access_checks\";a:1:{i:0;s:26:\"access_check.entity_create\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":374:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:31:\"#^/admin/structure/views/add$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:26:\"/admin/structure/views/add\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:26:\"/admin/structure/views/add\";s:8:\"numParts\";i:4;}}}}',4),('views_ui.autocomplete','/admin/views/ajax/autocomplete/tag','/admin/views/ajax/autocomplete/tag',31,'C:31:\"Symfony\\Component\\Routing\\Route\":1173:{a:9:{s:4:\"path\";s:34:\"/admin/views/ajax/autocomplete/tag\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:62:\"\\Drupal\\views_ui\\Controller\\ViewsUIController::autocompleteTag\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer views\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":398:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:39:\"#^/admin/views/ajax/autocomplete/tag$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:34:\"/admin/views/ajax/autocomplete/tag\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:31;s:14:\"patternOutline\";s:34:\"/admin/views/ajax/autocomplete/tag\";s:8:\"numParts\";i:5;}}}}',5),('views_ui.form_add_handler','/admin/structure/views/{js}/add-handler/{view}/{display_id}/{type}','/admin/structure/views/%/add-handler/%/%/%',232,'C:31:\"Symfony\\Component\\Routing\\Route\":1929:{a:9:{s:4:\"path\";s:66:\"/admin/structure/views/{js}/add-handler/{view}/{display_id}/{type}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:46:\"\\Drupal\\views_ui\\Form\\Ajax\\AddHandler::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":951:{a:11:{s:4:\"vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:115:\"#^/admin/structure/views/(?P<js>nojs|ajax)/add\\-handler/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)$#s\";s:11:\"path_tokens\";a:6:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:12:\"/add-handler\";}i:4;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:5;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:232;s:14:\"patternOutline\";s:42:\"/admin/structure/views/%/add-handler/%/%/%\";s:8:\"numParts\";i:8;}}}}',8);
INSERT INTO `router` VALUES ('views_ui.form_analyze','/admin/structure/views/{js}/analyze/{view}/{display_id}','/admin/structure/views/%/analyze/%/%',116,'C:31:\"Symfony\\Component\\Routing\\Route\":1778:{a:9:{s:4:\"path\";s:55:\"/admin/structure/views/{js}/analyze/{view}/{display_id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:43:\"\\Drupal\\views_ui\\Form\\Ajax\\Analyze::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":814:{a:11:{s:4:\"vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:93:\"#^/admin/structure/views/(?P<js>nojs|ajax)/analyze/(?P<view>[^/]++)/(?P<display_id>[^/]++)$#s\";s:11:\"path_tokens\";a:5:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:8:\"/analyze\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:116;s:14:\"patternOutline\";s:36:\"/admin/structure/views/%/analyze/%/%\";s:8:\"numParts\";i:7;}}}}',7),('views_ui.form_display','/admin/structure/views/{js}/display/{view}/{display_id}/{type}','/admin/structure/views/%/display/%/%/%',232,'C:31:\"Symfony\\Component\\Routing\\Route\":1908:{a:9:{s:4:\"path\";s:62:\"/admin/structure/views/{js}/display/{view}/{display_id}/{type}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:43:\"\\Drupal\\views_ui\\Form\\Ajax\\Display::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":937:{a:11:{s:4:\"vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:110:\"#^/admin/structure/views/(?P<js>nojs|ajax)/display/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)$#s\";s:11:\"path_tokens\";a:6:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:8:\"/display\";}i:4;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:5;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:232;s:14:\"patternOutline\";s:38:\"/admin/structure/views/%/display/%/%/%\";s:8:\"numParts\";i:8;}}}}',8),('views_ui.form_edit_details','/admin/structure/views/{js}/edit-details/{view}/{display_id}','/admin/structure/views/%/edit-details/%/%',116,'C:31:\"Symfony\\Component\\Routing\\Route\":1804:{a:9:{s:4:\"path\";s:60:\"/admin/structure/views/{js}/edit-details/{view}/{display_id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:47:\"\\Drupal\\views_ui\\Form\\Ajax\\EditDetails::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":831:{a:11:{s:4:\"vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:99:\"#^/admin/structure/views/(?P<js>nojs|ajax)/edit\\-details/(?P<view>[^/]++)/(?P<display_id>[^/]++)$#s\";s:11:\"path_tokens\";a:5:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:13:\"/edit-details\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:116;s:14:\"patternOutline\";s:41:\"/admin/structure/views/%/edit-details/%/%\";s:8:\"numParts\";i:7;}}}}',7),('views_ui.form_handler','/admin/structure/views/{js}/handler/{view}/{display_id}/{type}/{id}','/admin/structure/views/%/handler/%/%/%/%',464,'C:31:\"Symfony\\Component\\Routing\\Route\":2034:{a:9:{s:4:\"path\";s:67:\"/admin/structure/views/{js}/handler/{view}/{display_id}/{type}/{id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:49:\"\\Drupal\\views_ui\\Form\\Ajax\\ConfigHandler::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":1051:{a:11:{s:4:\"vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:125:\"#^/admin/structure/views/(?P<js>nojs|ajax)/handler/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)/(?P<id>[^/]++)$#s\";s:11:\"path_tokens\";a:7:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:2:\"id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:8:\"/handler\";}i:5;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:6;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:464;s:14:\"patternOutline\";s:40:\"/admin/structure/views/%/handler/%/%/%/%\";s:8:\"numParts\";i:9;}}}}',9),('views_ui.form_handler_extra','/admin/structure/views/{js}/handler-extra/{view}/{display_id}/{type}/{id}','/admin/structure/views/%/handler-extra/%/%/%/%',464,'C:31:\"Symfony\\Component\\Routing\\Route\":2065:{a:9:{s:4:\"path\";s:73:\"/admin/structure/views/{js}/handler-extra/{view}/{display_id}/{type}/{id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:54:\"\\Drupal\\views_ui\\Form\\Ajax\\ConfigHandlerExtra::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":1071:{a:11:{s:4:\"vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:132:\"#^/admin/structure/views/(?P<js>nojs|ajax)/handler\\-extra/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)/(?P<id>[^/]++)$#s\";s:11:\"path_tokens\";a:7:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:2:\"id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/handler-extra\";}i:5;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:6;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:464;s:14:\"patternOutline\";s:46:\"/admin/structure/views/%/handler-extra/%/%/%/%\";s:8:\"numParts\";i:9;}}}}',9),('views_ui.form_handler_group','/admin/structure/views/{js}/handler-group/{view}/{display_id}/{type}/{id}','/admin/structure/views/%/handler-group/%/%/%/%',464,'C:31:\"Symfony\\Component\\Routing\\Route\":2085:{a:9:{s:4:\"path\";s:73:\"/admin/structure/views/{js}/handler-group/{view}/{display_id}/{type}/{id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:54:\"\\Drupal\\views_ui\\Form\\Ajax\\ConfigHandlerGroup::getForm\";s:10:\"form_state\";N;}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":1071:{a:11:{s:4:\"vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:132:\"#^/admin/structure/views/(?P<js>nojs|ajax)/handler\\-group/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)/(?P<id>[^/]++)$#s\";s:11:\"path_tokens\";a:7:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:2:\"id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:14:\"/handler-group\";}i:5;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:6;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:5:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";i:4;s:2:\"id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:464;s:14:\"patternOutline\";s:46:\"/admin/structure/views/%/handler-group/%/%/%/%\";s:8:\"numParts\";i:9;}}}}',9),('views_ui.form_rearrange','/admin/structure/views/{js}/rearrange/{view}/{display_id}/{type}','/admin/structure/views/%/rearrange/%/%/%',232,'C:31:\"Symfony\\Component\\Routing\\Route\":1919:{a:9:{s:4:\"path\";s:64:\"/admin/structure/views/{js}/rearrange/{view}/{display_id}/{type}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:45:\"\\Drupal\\views_ui\\Form\\Ajax\\Rearrange::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":944:{a:11:{s:4:\"vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:112:\"#^/admin/structure/views/(?P<js>nojs|ajax)/rearrange/(?P<view>[^/]++)/(?P<display_id>[^/]++)/(?P<type>[^/]++)$#s\";s:11:\"path_tokens\";a:6:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"type\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:2;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:3;a:2:{i:0;s:4:\"text\";i:1;s:10:\"/rearrange\";}i:4;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:5;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:4:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";i:3;s:4:\"type\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:232;s:14:\"patternOutline\";s:40:\"/admin/structure/views/%/rearrange/%/%/%\";s:8:\"numParts\";i:8;}}}}',8),('views_ui.form_rearrange_filter','/admin/structure/views/{js}/rearrange-filter/{view}/{display_id}','/admin/structure/views/%/rearrange-filter/%/%',116,'C:31:\"Symfony\\Component\\Routing\\Route\":1825:{a:9:{s:4:\"path\";s:64:\"/admin/structure/views/{js}/rearrange-filter/{view}/{display_id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:51:\"\\Drupal\\views_ui\\Form\\Ajax\\RearrangeFilter::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":844:{a:11:{s:4:\"vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:103:\"#^/admin/structure/views/(?P<js>nojs|ajax)/rearrange\\-filter/(?P<view>[^/]++)/(?P<display_id>[^/]++)$#s\";s:11:\"path_tokens\";a:5:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/rearrange-filter\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:116;s:14:\"patternOutline\";s:45:\"/admin/structure/views/%/rearrange-filter/%/%\";s:8:\"numParts\";i:7;}}}}',7),('views_ui.form_reorder_displays','/admin/structure/views/{js}/reorder-displays/{view}/{display_id}','/admin/structure/views/%/reorder-displays/%/%',116,'C:31:\"Symfony\\Component\\Routing\\Route\":1825:{a:9:{s:4:\"path\";s:64:\"/admin/structure/views/{js}/reorder-displays/{view}/{display_id}\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:1:{s:11:\"_controller\";s:51:\"\\Drupal\\views_ui\\Form\\Ajax\\ReorderDisplays::getForm\";}s:12:\"requirements\";a:3:{s:14:\"_entity_access\";s:11:\"view.update\";s:2:\"js\";s:9:\"nojs|ajax\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:6:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:10:\"parameters\";a:1:{s:4:\"view\";a:3:{s:9:\"tempstore\";b:1;s:4:\"type\";s:11:\"entity:view\";s:9:\"converter\";s:53:\"drupal.proxy_original_service.paramconverter.views_ui\";}}s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:19:\"access_check.entity\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":844:{a:11:{s:4:\"vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:103:\"#^/admin/structure/views/(?P<js>nojs|ajax)/reorder\\-displays/(?P<view>[^/]++)/(?P<display_id>[^/]++)$#s\";s:11:\"path_tokens\";a:5:{i:0;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:10:\"display_id\";}i:1;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:6:\"[^/]++\";i:3;s:4:\"view\";}i:2;a:2:{i:0;s:4:\"text\";i:1;s:17:\"/reorder-displays\";}i:3;a:4:{i:0;s:8:\"variable\";i:1;s:1:\"/\";i:2;s:9:\"nojs|ajax\";i:3;s:2:\"js\";}i:4;a:2:{i:0;s:4:\"text\";i:1;s:22:\"/admin/structure/views\";}}s:9:\"path_vars\";a:3:{i:0;s:2:\"js\";i:1;s:4:\"view\";i:2;s:10:\"display_id\";}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:116;s:14:\"patternOutline\";s:45:\"/admin/structure/views/%/reorder-displays/%/%\";s:8:\"numParts\";i:7;}}}}',7),('views_ui.reports_fields','/admin/reports/fields/views-fields','/admin/reports/fields/views-fields',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1205:{a:9:{s:4:\"path\";s:34:\"/admin/reports/fields/views-fields\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:59:\"\\Drupal\\views_ui\\Controller\\ViewsUIController::reportFields\";s:6:\"_title\";s:13:\"Used in views\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer views\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":399:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:40:\"#^/admin/reports/fields/views\\-fields$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:34:\"/admin/reports/fields/views-fields\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:34:\"/admin/reports/fields/views-fields\";s:8:\"numParts\";i:4;}}}}',4),('views_ui.reports_plugins','/admin/reports/views-plugins','/admin/reports/views-plugins',7,'C:31:\"Symfony\\Component\\Routing\\Route\":1181:{a:9:{s:4:\"path\";s:28:\"/admin/reports/views-plugins\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:11:\"_controller\";s:60:\"\\Drupal\\views_ui\\Controller\\ViewsUIController::reportPlugins\";s:6:\"_title\";s:13:\"Views plugins\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer views\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:1:{i:0;s:31:\"route_enhancer.param_conversion\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":380:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:34:\"#^/admin/reports/views\\-plugins$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:28:\"/admin/reports/views-plugins\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:7;s:14:\"patternOutline\";s:28:\"/admin/reports/views-plugins\";s:8:\"numParts\";i:3;}}}}',3),('views_ui.settings_advanced','/admin/structure/views/settings/advanced','/admin/structure/views/settings/advanced',31,'C:31:\"Symfony\\Component\\Routing\\Route\":1245:{a:9:{s:4:\"path\";s:40:\"/admin/structure/views/settings/advanced\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:42:\"\\Drupal\\views_ui\\Form\\AdvancedSettingsForm\";s:6:\"_title\";s:23:\"Advanced Views settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer views\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":416:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:45:\"#^/admin/structure/views/settings/advanced$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:40:\"/admin/structure/views/settings/advanced\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:31;s:14:\"patternOutline\";s:40:\"/admin/structure/views/settings/advanced\";s:8:\"numParts\";i:5;}}}}',5),('views_ui.settings_basic','/admin/structure/views/settings','/admin/structure/views/settings',15,'C:31:\"Symfony\\Component\\Routing\\Route\":1197:{a:9:{s:4:\"path\";s:31:\"/admin/structure/views/settings\";s:4:\"host\";s:0:\"\";s:8:\"defaults\";a:2:{s:5:\"_form\";s:39:\"\\Drupal\\views_ui\\Form\\BasicSettingsForm\";s:6:\"_title\";s:14:\"Views settings\";}s:12:\"requirements\";a:2:{s:11:\"_permission\";s:16:\"administer views\";s:7:\"_method\";s:8:\"GET|POST\";}s:7:\"options\";a:5:{s:14:\"compiler_class\";s:34:\"\\Drupal\\Core\\Routing\\RouteCompiler\";s:12:\"_admin_route\";b:1;s:14:\"_route_filters\";a:2:{i:0;s:13:\"method_filter\";i:1;s:27:\"content_type_header_matcher\";}s:16:\"_route_enhancers\";a:2:{i:0;s:31:\"route_enhancer.param_conversion\";i:1;s:19:\"route_enhancer.form\";}s:14:\"_access_checks\";a:1:{i:0;s:23:\"access_check.permission\";}}s:7:\"schemes\";a:0:{}s:7:\"methods\";a:2:{i:0;s:3:\"GET\";i:1;s:4:\"POST\";}s:9:\"condition\";s:0:\"\";s:8:\"compiled\";C:33:\"Drupal\\Core\\Routing\\CompiledRoute\":389:{a:11:{s:4:\"vars\";a:0:{}s:11:\"path_prefix\";s:0:\"\";s:10:\"path_regex\";s:36:\"#^/admin/structure/views/settings$#s\";s:11:\"path_tokens\";a:1:{i:0;a:2:{i:0;s:4:\"text\";i:1;s:31:\"/admin/structure/views/settings\";}}s:9:\"path_vars\";a:0:{}s:10:\"host_regex\";N;s:11:\"host_tokens\";a:0:{}s:9:\"host_vars\";a:0:{}s:3:\"fit\";i:15;s:14:\"patternOutline\";s:31:\"/admin/structure/views/settings\";s:8:\"numParts\";i:4;}}}}',4);
commit;

--
-- Table structure for table `search_dataset`
--

CREATE TABLE `search_dataset` (
  `sid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Search item ID, e.g. node ID for nodes.',
  `langcode` varchar(12) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'The languages.langcode of the item variant.',
  `type` varchar(64) CHARACTER SET ascii NOT NULL COMMENT 'Type of item, e.g. node.',
  `data` longtext NOT NULL COMMENT 'List of space-separated words from the item.',
  `reindex` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Set to force node reindexing.',
  PRIMARY KEY (`sid`,`langcode`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Stores items that will be searched.';

--
-- Dumping data for table `search_dataset`
--

set autocommit=0;
INSERT INTO `search_dataset` VALUES (31,'und','node_search',' legal legal cookies we may store information about you using cookies files which are sent by us to your computer or other access device which we can access when you visit our site in future we do this to enable functions like the text resize in the right hand column if you want to delete any cookies that are already on your computer please refer to the instructions for your file management software to locate the file or directory that stores cookies our cookies will have file names starting yaffsnet these may be found among the privacy settings for your web browser information on deleting or controlling cookies is available at the excellent and informative site wwwaboutcookiesorg please note that by deleting our cookies or disabling future cookies you may not be able to access certain areas or features of our site privacy we like all british companies handling data on computers are registered under the data protection act which requires us amongst many other things to describe what use we shall make of the data we keep and have the authorities record and accept that use and permits you access to the data about you for a reasonable fee in practice when we write an invoice we do it on a computer and we keep the invoice details for a few months and our paper copy much longer we do not ever pass this information on or sell it to any other company we never have done so and we expect never to do so in the future details of your transaction with us remain private to us and you can expect them to be seen only by our staff and possibly by our professional auditors we suffer enough from junk mail and junk email to wish not to inflict any of it on anyone else we do not promise not to tell you if we have a new product we think you might be interested in we very rarely do this but as our product range develops and changes for the better we might at some future time want to tell you about what was both new and likely to be relevant to you if you tell us not to send you any mail about new developments then we will not do so we do also run email lists for some types of product but you only receive emails if you ask to do so where such a list exists you will find details on the page about that product  guarantee of goods our policy has always been to provide all the information a buyer needs to make an informed choice among our products if you have questions to which you do not see answers we are happy to try to answer those specific questions if you make clear to what product they relate for this reason our guarantee is as follows our hardware products except balloon boards and instruments are guaranteed against defects in materials or workmanship for a period of twelve months from date of purchase our software products and balloon boards and related hardware are offered only on an as is basis without any warranty as to their suitability for any particular purpose this may seem unfair but it follows from the terms of the gnu public licence and the licence for the hardware designs in practice we stand behind our products and exchange them if they prove faulty in all cases the company shall not be liable for any losses damage costs expenses including without limitation any loss of profits any loss or damage to property and any indirect or consequential loss howsoever caused including any liability to third parties this guarantee does not alter your statutory rights which are described in more detail for private buyers not businesses within the ec at http wwwdtigovuk cacp ca policy distanceselling newregshtm   title to goods title to goods that is ownership passes to the buyer only when we have received full payment for the goods admin 22 may 2005 1027pm  ',0),(32,'und','node_search',' yaffs licence sample yaffs licence sample 1 definitions aleph one limited an english company registered number 1017960 of the old courthouse 123 high street bottisham cambridge cb25 9ba uk source code code owned by aleph one ltd and supplied under this licence binary code code which has been compiled from source code licenceholder the firm represented by the person who signs this agreement each licence bears the name and address of a particular licence holder yaffs filesystems any filesystem images made using yaffs source code or yaffs binary code product will be defined precisely at the time of negotiation of the sale of the licence see section 3 for the principles used in defining product 2 the licence allows the licenceholder to use aleph one s software to create the file system fs and incorporate the fs in the defined products entitles the licenceholder to distribute binary code compiled from the source code provided does not entail any obligation to reveal the binary code prohibits the licenceholder from releasing the source code to other parties except to the extent necessary to permit subcontractors to work with the licenceholder on a project using the code the licenceholder is responsible for ensuring compliance with all the terms of this licence by any subcontractor used is only available in a nonexclusive form is applicable worldwide has no time limit or perunit royalty but a fixed price paid upon signature of the licence agreement from 1 august 2012 the base price for one product is gb 10000 sterling applies to use of the fs for one product rather than to a company user person it cannot be transferred to another product provides the source code and any derived filesystems without any warranty but as is save that to the best of aleph one s knowledge the use of the source code does not infringe the intellectual propert rights of any third party 3 supporting information and terms relating to use aleph one ltd supplies free access to all documentation written for yaffs by aleph one at http wwwyaffsnet certain pieces of software with different licences attached to them source code for yaffs direct and bootloader being the subject of this licence agreement for incorporation in a product yaffs development tools images created with the tools may be incorporated into a product the images are not affected by the licence status of the tools when these tool files are supplied in the tarball we send they will appear with a header saying they are used under the gnu general public licence version 2 that term applies only to the tools the other files in the tarball will have headers making clear they are used under a paid licence from aleph one ltd source code modifications and enhancements made by the licenceholder remain the property of licenceholder but may not be redistributed or sold to third parties by licenceholder without the consent of aleph one product definition a yaffs licence agreement requires the definition of the product to which it applies we do this with a brief description of its purpose and the hardware in terms of the type or family of chips used as cpu or mcu and any internal code name or product name or sku that you use for it later changes to the pcb which are evolutionary do not create a fresh product nor do changes in the size or speed of those chips or of the i o technology discussion with aleph one about licensing further products is required where a new pcb or key cpu or mcu is used or you sell chip designs and no hardware or you sell a development board with sdk to customers who will integrate yaffs into their products or changes in the brand name or badge are made or your rights to the product pass to a new owner following payment for the licence aleph one will provide a tarball with file headers showing that the code is being used by the licenceholder under a paid licence from aleph one version 24 september 2015 admin 22 may 2005 1108pm  ',0),(37,'und','node_search',' yaffs original specification yaffs original specification yaffs yet another flash file system  version 3 charles manning and wookey december 2001   revision history v00 201201 first draft v01 110102 minor corrections cosmetics change use of data status byte v02 280102 added observations about inodes file headers and hard links v03 260202 w added some general observations on compatibility partitions and bootloading  scope the purpose of this document is to outline a potential nandfriendly file system for linux background there are already various flashfile systems ffss or block drivers for flash on top of which a regular fs runs there are pros and cons with all of these flash memory has quite a few constraints which will not be addressed here various approaches are available to work around these constraints to provide a file system it is important to recognise that flash includes both nor and nand flash which have different sets of constraints it is easy to be mislead by the generic term flash into thinking that approaches appropriate for nor flash are immediately suitable for nand flash the nand block drivers eg smartmedia currently not available for linux and diskonchip nftl typically use fat16 as the file system this isn t too robust and nor is it that flashfriendly these block drivers provide a logical to physical mapping layer to emulate rewritable blocks that look like disk sectors when used with fat16 these file systems work reasonably well they have a low memory footprint and scale well like all fat based systems they are prone to corruption lost clusters etc the other approach is to design an entire file system which does not work through a block driver layer and is flashfriendly this allows more scope to work around issues currently two linux file systems that support nor flash very well are jffs and its derivative jffs2 both of these are based on the principles of journaling hence the leading j which significantly increases robustness a particularly important feature in embedded systems unfortunately neither of these file systems scale particularly well in both boot time and ram usage scaling is particularly relevant when one considers that a 16mb nor array would be considered large while a 128mb nand is available as a single chip jffs requires a rambased jffsnode structure for each journalling node in the flash each of these nodes is 48 bytes jffs2 makes a significant improvement here by reducing the equivalent structure jffs2rawnoderef to 16 bytes still at say an average nodesize of 512 bytes a 128mb nand might need 250000 of these 4mb both jffs and jffs2 require scanning the flash array at boot time to find the journaling nodes and determine the file structures since nand is large slow serially accessed and needs ecc this does not scale well and will take an unacceptably long boot time for the target systems as a thumbsuck the scanning of a 128mb nand array might take approx 25 seconds the intentions of the design sketched here are be nandflash friendly robustness through journaling strategies significantly reduce the ram overheads and boot times associated with jffsx this fs is intended primarily for internal nand rather than removable nand sm cards on removable sm cards smartmedia compatibility is likely to be important so sm fat will normally be used although of course yaffs makes a lot of sense if reliability is more important than compatibility overview here follows a simplified overview of yaffs yaffs uses a physical flash format similar to smartmedia this is done for various reasons some of the formatting eg placement of bad block markers is determined by the nand manufacturers and can t be changed potential to reuse code if it ain t broke don t fix some of the fields are obviously different to reflect the different usage despite the similarities yaffs is not actually compatible with sm fat sm cards need to be reformatted to switch from using sm fat to yaffs or vice versa file data is stored in fixed size chunks consistent with the size of a page ie 512 bytes each page is marked with a file id and chunk number these tags are stored in the spare data region of the flash the chunk number is determined by dividing the file position by the chunk size when data in a file is overwritten the relevant chunks are replaced by writing new pages to flash containing the new data but the same tags the overwritten data is marked as discarded file headers are stored as a single page marked so as to be differentiated from data pages pages are also marked with a short 2 bit serial number that increments each time the page at this position is incremented the reason for this is that if power loss crash other act of demonic forces happens before the replaced page is marked as discarded it is possible to have two pages with the same tags the serial number is used to arbitrate a block containing only discarded pages termed a dirty block  is an obvious candidate for garbage collection otherwise valid pages can be copied off a block thus rendering the whole block discarded and ready for garbage collection in theory you don t need to hold the file structure in ram you could just scan the whole flash looking for pages when you need them in practice though you d want better file access times than that the mechanism proposed here is to have a list of u16 page addresses associated with each file since there are 218 pages in a 128mb nand a u16 is insufficient to uniquely identify a page but is does identify a group of 4 pages a small enough region to search exhaustively this mechanism is clearly expandable to larger nand devices within reason the ram overhead with this approach is approx 2 bytes per page 512kb of ram for a whole 128mb nand boottime scanning to build the file structure lists should require just one pass reading nand since only the the spare data needs to be read this should be relatively fast approx 3 seconds for 128mb improvements can be achieved by partitioning the nand ie mount the critical partition first then mount the data partition afterwards various runtime improvements can be achieved by changing the chunk size to 1024 bytes or more however this would likely reduce flash efficiency as always life is a compromise  spare area details the following table summarizes the layout of the spare area of each page byte smartmedia usageyaffs usage 511 data data either file data or file header depending on tags 512515 reserved tags 516 data status byte not used in sm code from samsung data status byte if more than 4 bits are zero then this page is discarded 517 block status byte block status byte 518519 block address tags 520522 ecc on second 256 bytes part of data ecc on second 256 bytes of data 523524 block address tags 525527 ecc on first 256 bytes part of data ecc on first 256 bytes part of data the block status is a reserved value that shows whether the block is damaged the data status tracks whether the page is valid if less than 4 bits are zero then the page is valid otherwise it is discarded there are 8 bytes 64 bits for use by yaffs tags this is partitioned as follows number of bitsusage 18 18bit file id ie limit of 218 over 260000 files file id  is not valid and indicates a deleted page file id 0x3ffff i is also not valid 2 2bit serial number 20 20bit page id within file limit of 220 pages per file ie over 500mb file max size page id  means the file header for this file 10 10bit counter of the number of bytes used in the page 12 12bit ecc on tags 2 unused keep as 1 64 total  a bit of explanation on the usage of some of these fields file id is synonymous with inode the serial number is incremented each time a page with the same fileid pageid is rewritten because of data changes or copy during garbage collection when a page is replaced there is a brief period during which there are two pages with the same id the serial number resolves this since there should never be a difference of less than more than one a twobit counter is sufficient to determine which is the current page when the page is rewritten the file id these data status byte and the 12bit ecc are all written to zero the byte counter indicates how many bytes are valid in this page since the page would not exist if it contains zero bytes this field should thus hold 512 for all pages except the last page in the file the use of counters means that the file length integrity is preserved while the file is open without having to constantly update the file length in the file header the file header only needs to be refreshed when the file is closed rather than whenever it is appended to this field is wide enough to allow expansion to 1024byte chunks file headers come in two flavours file info the mode ower id group id length the hard link s that refers to the file a directory also appears as a file ie has an inode and hard link s but has no data the 12bit ecc applies to only the tag data uses a similar algorithm to the 22bit eccs used for file system data they are kept independent ram data details block management details are reasonably obvious and i feel don t need to be addressed here apart from stating that there will be a structure to track block status eg number of pages in use failed blocks and which are candidates for garbage collection etc the files need an indexing structure of sorts to locate and track the pages in the file some sort of tree structure should work rather well the lookup needs to be quite efficient in both cpu time and space page allocation and garbage collection pages are allocated sequentially from the currently selected block when all the pages in the block are filled another clean block is selected for allocation at least two or three clean blocks are reserved for garbage collection purposes if there are insufficient clean blocks available then a dirty block ie one containing only discarded pages is erased to free it up as a clean block if no dirty blocks are available then the dirtiest block is selected for garbage collection garbage collection is performed by copying the valid data pages into new data pages thus rendering all the pages in this block dirty and freeing it up for erasure i also like the idea of selecting a block at random some small percentage of the time thus reducing the chance of wear differences relative to nor nand writes and erases very fast therefore garbage collection might be performed ondemand eg during a write without significant degradation in performance alternatively garbage collection might be delegated to a kernel tasklet relative to jffsx the garbage collection presented here is incredibly simple thanks mainly to the use of fixedsize pages instead of journaling nodes flash writing as presented here yaffs only writes to the page s data area once and to the spare area twice once when new page is written and once when it gets stomped on before an erasure this is within the limits of the most restrictive nand flashes wear levelling no wear levelling is explicitly used here instead we rely on two strategies reserving some blocks to cater for failure you need to do this anyway with nand the main purpose behind wear levelling is to prevent some blocks getting more wear and failing since we expect and handle failure this is no longer as important the infrequent random block selection should prevent lowwear blocks getting stuck  partitioning partitioning is not included in this spec but could be added if required bootloading bootloaders cannot just read files direct from nand due to the high probability of bad blocks because yaffs is quite simple it will be relatively straightforward for bootloaders to read from it eg reading a kernel  conclusion yaffs is very simple it is also nandfriendly is relatively frugal with resources especially ram and boots quickly like jffsx it has journaling which makes it far more robust than fat while it might seem highrisk to develop yaffs it is probably about the same amount of effort as implementing changes to jffs to get it to work effectively within the constraints of nand a resulting jffsx system would still require significant amounts of ram and have long boot times while yaffs is indeed a new file system internally much of the file system glue code including inode management link management etc can likely be stolen from jffsx yaffs development notes build options yaffs can be built as either a kernel module ie a linux file system or as an application of course the goal is to build yaffs as a file system running on top of real nand flash but yaffs can be built to run on a ram emulation layer for inkernel testing without nand flash in the system building as an application allows the yaffsguts algorithms to be tested debugged in a more friendly debugging environment the test harness is in yaffsdevc trying it out yaffs can be built to run with either mtd or ram emulation or both the file system that interfaces to mtd is called yaffs  the file system that uses internal ram is called yaffsram  yaffs simultaneously supports both if they are enabled hack the makefile and change the kerneldir define to your kernel directory if you don t have mtd support in your kernel then you might need to turn off usemtd otherwise the yaffs module might not load type make clean make to build yaffs load yaffs as a module by typing  sbin insmod yaffso  ya gotta be root create a mount point eg mkdir mnt y to mount the ram emulation version of yaffs  mount t yaffsram none mnt y alternatively to mount the mtd version of yaffs  mount t yaffs dev mtd0 mnt y   yaffs data structures all data types are defined in yaffsgutsh yaffs uses the following major objects yaffsobject a yaffsobject can be a file directory symlink or hardlink the yaffsobjects know about their corresponding yaffsobjectheader in nand and the data for that object yaffsobjects also bind together the directory structure as follows parent pointer to the yaffsobject that is a parent of this yaffsobject in the directory structure siblings this field is used to link together a list of all the yaffsobjects in the same directory children if the object is a directory then children holds the head of the list of objects in the directory yaffstnode yaffstnodes form a tree structure that speeds up the search for data chunks in a file as the file grows in size the levels increase the tnodes are a constant size 32 bytes level  ie the lowest level comprise 16 2byte entries giving an index used to search for the chunkid tnodes at other levels comprise 8 4byte pointer entries to other tnodes lower in the tree yaffsdevice this holds the device context and is in some ways analogous to the vfs superblock it stores the data used to access the mtd as well as function pointers to access the nand data the tnodes and objects are allocated in groups to reduce memory allocation freeing overheads freed up tnodes and objects are kept in a free list and reused yaffsobject  struct yaffsobjectstruct u8 fake 1 a fake object has no presence on nand u8 renameallowed 1 are we allowed to rename it u8 unlinkallowed 1 are we allowed to unlink it u8 dirty 1 the object needs to be written to flash u8 valid 1 when the file system is being loaded up this object might be created before the data is available ie file data records appear before the header u8 serial serial number of chunk in nand store here so we don t have to read back the old one to update u16 sum sum of the name to speed searching struct yaffsdevicestruct mydev the device i m on struct listhead hashlink list of objects in this hash bucket struct listhead hardlinks all the equivalent hard linked objects live on this list directory structure stuff struct yaffsobjectstruct parent my parent directory struct listhead siblings siblings in a directory also used for linking up the free list where s my data in nand int chunkid where it lives u32 objectid the object id value u32 stmode protection u32 stuid user id of owner u32 stgid group id of owner u32 statime time of last access u32 stmtime time of last modification u32 stctime time of last change yaffsobjecttype varianttype yaffsobjectvariant variant obvious stuff skipped fake renameallowed unlinkallowed are special flags for handling fake objects which live in the file system but do not live on nand currently there are only two such objects the root object and the lost found directory none of these may be renamed or unlinked serial sum see yaffsobjectheader dirty indicates that the object s contents has changed and a new yaffsobjectheader must be written to flash valid indicates that the object has been loaded up this is only used during scanning yaffsscan since we can know of an object s existance and thus need to create the object header before we encounter the associated yaffsobjectheader hashlink is a list of objects in the same hash bucket the four variants hold extra info files hold the file size and the top level and pointer to the tnode tree for the file directories hold a list of children objects symlinks hold a pointer to the alias string this is probably inefficient but that probably does not matter since we don t expect to see many of these hardlinks hold information to identify the equivalent object  file structure tnodes  file structures are done with a tiered indexing structure the file structure is maintained by a tree structure depending where it is in the tree each tree node  tnode  the blue things holds either if it is at the lowest level then 16 u16s which identify the page if it is at a higher level ie an internal tnode then 8 pointers to lowestlevel tnodes when the file starts out it is assigned only one lowlevel tnode when the file expands past what a single tnode can hold then it is assigned a second tnode and an internal node is added to point to the two tnodes as the file grows more lowlevel tnodes and high level tnodes are added traversing the tnode tree to find a particular page in a file is quite simple each internal tnode is selected from by using 3 bits of the page offset in the file the level  page resolves 4 bits for example finding page 0x235 ie the one starting at file position 0x46800 would proceed as follows 0x235 is 1000110101 partitioned as follows 1000110101 levelbitsselected value 3 or more if they exist 10 zero 2 9 to 7 100 binary 4 1 6 to 4 11 binary 3  3 to  101 binary 5 free tnodes are stored in a list when the list is exhausted more are allocated each tnode takes 32 bytes each file needs at least one level  tnode how many do we need a full 16mb file system needs at least 16mb 51216 2000 level zero tnodes more for internal tnodes more for files smaller than optimal the tree grows as required when the file is resized to a smaller size then it is pruned  nand data data is stored on nand in chunks currently each chunk is the same size as a nand flash page ie 512 bytes 16 byte spare in the future we might decide to allow for different chunk sizes chunks can hold either a yaffsobjectheader this is the way a yaffsobject gets stored on nand a chunk of file data the 16 byte spare area contains 8 bytes of tags 6 bytes of ecc data 1 byte block status used to identify damaged blocks 1 byte data status currently unused the tags are made up as follows typedef struct unsigned chunkid 20 chunk number in file unsigned serialnumber 2 serial number for chunk unsigned bytecount 10 number of bytes of data used in this chunk unsigned objectid 18 the object id that this chunk belongs to unsigned ecc 12 ecc on tags unsigned unusedstuff 2 unused yaffstags a chunkid of zero indicates that this chunk holds a yaffsobjectheader a non zero value indicates that this is a data chunk and the position of the chunk in the file ie the first chunk at offset  has chunkid 1 see yaffsgutsc yaffsscan to see how this is done when a chunk is replaced eg file details changed or a part of a file was overwritten the new chunk is written before the old chunk is deleted this means that we don t lose data if there is a power loss after the new chunk is created but before the old one is discarded but it does mean that we can encounter the situation where we find both the old and the new chunks in flash the serialnumber is incremented each time the chunk is written 2 bits is sufficient to resolve any ambiguity bytecount applies only to data chunks and tells how many of the data bytes are valid objectid says which object this chunk belongs to ecc is used to perform error correction on the tags another ecc field is used to error correct the data  yaffsobjectheader typedef struct yaffsobjecttype type apply to everything int parentobjectid u16 sum checksum of name char name yaffsmaxnamelength 1 thes following apply to directories files symlinks not hard links u32 stmode protection u32 stuid user id of owner u32 stgid group id of owner u32 statime time of last access u32 stmtime time of last modification u32 stctime time of last change file size applies to files only int filesize equivalent object id applies to hard links only int equivalentobjectid alias only applies to symlinks char alias yaffsmaxaliaslength 1 yaffsobjectheader a yaffsobjectheader is stored in nand for every yaffsobject type holds the type of yaffsobject file directory hardlink or symlink parentobject is the objectid of this object s parent name holds the object s name together these form the directory structure of the file system also worth mention is sum this is a checksum on the name which speeds directory searching ie when searching the directory we only compare the name for those entries where sum matches obvious stuff skipped equivalentobjectid is used by hardlinks a hardlink to an object uses this field to specify the object that this links to this way of doing things is a bit different than the normal linux way of doing things ie keeping the links distinct from the inode but is simpler and uses less space except for a few corner cases with hardlinks alias is used by symlinks to hold the symlink alias string this limits the size of the symlink alias in future we should expand yaffs to use data chunks to store aliases too long to fit into the yaffsobjectheader  nand interface all nand access is performed via four functions pointed to by yaffsdevice at the moment a chunk is a page int writechunktonand struct yaffsdevicestruct dev int chunkinnand const u8 data yaffsspare spare int readchunkfromnand struct yaffsdevicestruct dev int chunkinnand u8 data yaffsspare spare int eraseblockinnand struct yaffsdevicestruct dev int blockinnand int initialisenand struct yaffsdevicestruct dev in the readxxx and writexxx functions the data and or spare pointers may be null in which case these data transfers are ignored a quick note about nand nand is not random access but page oriented thus we do all reads writes in pages each nand page holds 512 bytes of data and 16 spare bytes yaffs structures the spare area with tags used to identify what is stored in the data area there are 32 such pages to a block nand writes will only change 1 bits to  eg if a byte holds 10110011 and you write 11011010 to it you will get the logical and of the two values 10010010 the only way to get 1s again is to erase the entire block you may only write to a page a few times before erasing the entire block yaffs lives within these limitations each page only gets written to twice once when written and once when discarded ecc is normally used with nand to correct for single bit errors yaffs applies the ecc itself so the mtd should not do this the current mtd interfaces are not particularly well suited to yaffs and we will address the issue with the mtd group the mtd interface does not support pageoriented read write which yaffs would prefer  mkyaffs mkyaffs is the tool to format a nand mtd to be used for yaffs this is quite simple just erase all the undamaged blocks yaffs treats erased blocks as free empty space  expected performance the following numbers should give an indication of the performance we should expect from yaffs as an example i ll use the following numbers since the hardware is capable of 50ns read write these numbers allow for some other ovberheads clearly though the performance can be degraded in various ways seek10us page read 100ns byte write 100ns byte program 200us page erase 2ms block from this we can derive some higherlevel numbers operationtimecalculation read spare 12us seek 16 read read page 63 us seek 528 read write page 326 us seek 528 write program read page for verification discard page 212 us seek 16 write program overwrite page 538 us write page discard page erase overhead per page 63us erase 32 from this we can infer the following flash access times operationtimecalculation read 1mb file 013s about 75 mb s 2000 read page write 1mb clean system 053s about 18 mb s 2000 write page overwrite 1mb file no gc 108s about 09mb s 2000 overwrite page overwrite 1mb with 50 gc 24s about 4 mb s 2000 overwrite page 2000 page copy overwrite page 4000 erase overhead delete 1mb file 043s about 22 mb s 2000 discard page delete 1mb file with 50 gc 049s about 20mb s 2000 discard page 1000 erase overhead admin 23 may 2005 1231pm  ',0),(38,'und','node_search',' yaffs 2 specification yaffs 2 specification summary the original motivation for yaffs 2 was to add support for the new nand with 2kb pages instead of 512byte pages and strictly sequential page writing order to achieve this a new design is used which also realises the following benefits zero page rewrites means faster operation yaffs1 uses a single rewrite in the spare area to delete a page ability to exploit simultaneous page programming on some chips improves performance relative to yaffs1 speed write 15x to 5x delete 4x garbage collection 2x lower ram footprint approx 25 to 50 of yaffs1 can support toshiba sandisk mlc parts most of yaffs1 and yaffs2 code is common therefore the code will likely be kept common with yaffs1 vs yaffs2 being runtime selected method the main philosophical difference between yaffs and yaffs2 is how discarded status is tracked since we can t do any rewriting we can t use the discarded flags in yaffs2 instead yaffs2 uses two mechanisms to resolve data state yaffs2 chunks have more tag information including a block sequence id from that we can determine the chunk sequence id since the chunks are allocated sequentially in a block thus we always know the patch order for all chunks in the system the above helps us track stale vs fresh data but does not help determine when a file object is deleted deletion is achieved by moving the object to the unlinked directory we also keep track of the number of chunks both stale and current in the system for each object while this number indicates that there are still chunks associated with this object we keep the deletion record when the last trace of the object has been really erased from nand we can forget about the deletion record too since there is no deletion a resize shrinking of a file will still have valid data chunks past the end of file on the nand however we write a new objectheader at the time of the resize therefore this shows the shrunken file size this changes erasure slightly during garbage collection we can t just look at chunk state flags instead we must read the tags of each chunk to determine which object s chunk count we must decrement this step must also be performed when a block is erased as part of deletion this makes erasure garbage collection more expensive by adding reads but remember that ion yaffs2 we don t need to do page deletions which are much more expensive operations thus allup yaffs2 wins tag structure each chunk in yaffs2 has the following information field comment size for 1kb chunks size for 2kb chunks blockstate block state non0xff for bad block 1 byte 1 byte chunkid 32bit chunk id 4 bytes 4 bytes objectid 32bit object id 4 bytes 4 bytes nbytes number of data bytes in this chunk 2 bytes 2 bytes blocksequence sequence number for this block 4 bytes 4 bytes tagsecc ecc on tags area 3 bytes 3 bytes ecc ecc 3 bytes 256 bytes of data 12 bytes 24 bytes total   30 bytes 42 bytes  to get enough spare bytes for this tagging structure requires a chunksize of at least 1kb the blocksequence increments each time a block is allocated ie the first block allocated is block 1 and so on  scanning the only reason we need to keep track of data status on nand is to be able to recreate the file system state during scanning since we no longer have chunk deletion status flags we use a slightly different process for scanning a yaffs2 system in effect yaffs2 recreates its state by replaying the tape ie it scans the chunks in their allocation order block sequence id order rather than in their order on the media this implies that at start up the blocks must be read and their block sequence determined performance times for 2kb read units of 1us operation yaffs1 yaffs2 512b pages yaffs2 2kb pages yaffs22kb pages x16 seek 40 40 10 10 read 220 220 220 110 total 260 260 230 120 mb s 76 76 87 167 relative speed 1 1 11 22 times for 2kb writes units of 1us operation yaffs1 yaffs2 512b pages yaffs2 2kb pages yaffs22kb pages x16 seek 40 40 10 10 program 800 800 200 200 seek 40 40 10 10 read 220 220 220 110 total 1320 1320 660 440 mb s 15 15 3 45 relative speed 1 1 2 3 times for 1mb delete units of 1us operation yaffs1 yaffs2 512b pages yaffs2 2kb pages yaffs22kb pages x16 seek 20480    program 409600    erase 128000 128000 16000 16000 total 558080 128000 16000 16000 mb s 18 78 625 625 relative speed 1 4 34 34 times for 1mb of garbage collection at 50 dirty units of 1us operation yaffs1 yaffs2 512b pages yaffs2 2kb pages yaffs22kb pages x16 delete 1mb 558080 128000 16000 16000 write 05mb 337920 337920 168960 112640 total 896000 465920 184960 128640 mb s 11 21 54 77 relative speed 1 19 49 7 wookey 23 may 2005 1233pm  ',0),(39,'und','node_search',' yaffs yaffs1 development notes yaffs yaffs1 development notes these notes relate to yaffs1 yaffs version 2 or yaffs2 is the current version of yaffs while many of the details below remain the same you can find up to date information split between the how yaffs works yaffs tuning and yaffs direct documents   build options yaffs1 can be built as either a kernel module ie a linux file system or as an application of course the goal is to build yaffs as a file system running on top of real nand flash but yaffs can be built to run on a ram emulation layer for inkernel testing without nand flash in the system building as an application allows the yaffsguts algorithms to be tested debugged in a more friendly debugging environment the test harness is in yaffsdevc trying it out yaffs1 can be built to run with either mtd or ram emulation or both the file system that interfaces to mtd is called yaffs  the file system that uses internal ram is called yaffsram  yaffs1 simultaneously supports both if they are enabled hack the makefile and change the kerneldir define to your kernel directory if you don t have mtd support in your kernel then you might need to turn off usemtd otherwise the yaffs module might not load type make clean make to build yaffs load yaffs as a module by typing  sbin insmod yaffso  ya gotta be root create a mount point eg mkdir mnt y to mount the ram emulation version of yaffs  mount t yaffsram none mnt y alternatively to mount the mtd version of yaffs  mount t yaffs dev mtd0 mnt y   yaffs1 data structures all data types are defined in yaffsgutsh yaffs1 uses the following major objects yaffsobject a yaffsobject can be a file directory symlink or hardlink the yaffsobjects know about their corresponding yaffsobjectheader in nand and the data for that object yaffsobjects also bind together the directory structure as follows parent pointer to the yaffsobject that is a parent of this yaffsobject in the directory structure siblings this field is used to link together a list of all the yaffsobjects in the same directory children if the object is a directory then children holds the head of the list of objects in the directory yaffstnode yaffstnodes form a tree structure that speeds up the search for data chunks in a file as the file grows in size the levels increase the tnodes are a constant size 32 bytes level  ie the lowest level comprise 16 2byte entries giving an index used to search for the chunkid tnodes at other levels comprise 8 4byte pointer entries to other tnodes lower in the tree yaffsdevice this holds the device context and is in some ways analogous to the vfs superblock it stores the data used to access the mtd as well as function pointers to access the nand data the tnodes and objects are allocated in groups to reduce memory allocation freeing overheads freed up tnodes and objects are kept in a free list and reused yaffsobject struct yaffsobjectstruct u8 fake 1 a fake object has no presence on nand u8 renameallowed 1 are we allowed to rename it u8 unlinkallowed 1 are we allowed to unlink it u8 dirty 1 the object needs to be written to flash u8 valid 1 when the file system is being loaded up this object might be created before the data is available ie file data records appear before the header u8 serial serial number of chunk in nand store here so we don t have to read back the old one to update u16 sum sum of the name to speed searching struct yaffsdevicestruct mydev the device i m on struct listhead hashlink list of objects in this hash bucket struct listhead hardlinks all the equivalent hard linked objects live on this list directory structure stuff struct yaffsobjectstruct parent my parent directory struct listhead siblings siblings in a directory also used for linking up the free list where s my data in nand int chunkid where it lives u32 objectid the object id value u32 stmode protection u32 stuid user id of owner u32 stgid group id of owner u32 statime time of last access u32 stmtime time of last modification u32 stctime time of last change yaffsobjecttype varianttype yaffsobjectvariant variant obvious stuff skipped fake renameallowed unlinkallowed are special flags for handling fake objects which live in the file system but do not live on nand currently there are only two such objects the root object and the lost found directory none of these may be renamed or unlinked serial sum see yaffsobjectheader dirty indicates that the object s contents has changed and a new yaffsobjectheader must be written to flash valid indicates that the object has been loaded up this is only used during scanning yaffsscan since we can know of an object s existance and thus need to create the object header before we encounter the associated yaffsobjectheader hashlink is a list of objects in the same hash bucket the four variants hold extra info files hold the file size and the top level and pointer to the tnode tree for the file directories hold a list of children objects symlinks hold a pointer to the alias string this is probably inefficient but that probably does not matter since we don t expect to see many of these hardlinks hold information to identify the equivalent object  file structure tnodes  file structures are done with a tiered indexing structure the file structure is maintained by a tree structure depending where it is in the tree each tree node  tnode  the blue things holds either if it is at the lowest level then 16 u16s which identify the page if it is at a higher level ie an internal tnode then 8 pointers to lowestlevel tnodes when the file starts out it is assigned only one lowlevel tnode when the file expands past what a single tnode can hold then it is assigned a second tnode and an internal node is added to point to the two tnodes as the file grows more lowlevel tnodes and high level tnodes are added traversing the tnode tree to find a particular page in a file is quite simple each internal tnode is selected from by using 3 bits of the page offset in the file the level  page resolves 4 bits for example finding page 0x235 ie the one starting at file position 0x46800 would proceed as follows 0x235 is 1000110101 partitioned as follows 1000110101 level bits selected value 3 or more if they exist 10 zero 2 9 to 7 100 binary 4 1 6 to 4 11 binary 3  3 to  101 binary 5 free tnodes are stored in a list when the list is exhausted more are allocated each tnode takes 32 bytes each file needs at least one level  tnode how many do we need a full 16mb file system needs at least 16mb 51216 2000 level zero tnodes more for internal tnodes more for files smaller than optimal the tree grows as required when the file is resized to a smaller size then it is pruned nand data data is stored on nand in chunks currently each chunk is the same size as a nand flash page ie 512 bytes 16 byte spare in the future we might decide to allow for different chunk sizes chunks can hold either a yaffsobjectheader this is the way a yaffsobject gets stored on nand a chunk of file data the 16 byte spare area contains 8 bytes of tags 6 bytes of ecc data 1 byte block status used to identify damaged blocks 1 byte data status currently unused the tags are made up as follows typedef struct unsigned chunkid 20 chunk number in file unsigned serialnumber 2 serial number for chunk unsigned bytecount 10 number of bytes of data used in this chunk unsigned objectid 18 the object id that this chunk belongs to unsigned ecc 12 ecc on tags unsigned unusedstuff 2 unused yaffstags a chunkid of zero indicates that this chunk holds a yaffsobjectheader a non zero value indicates that this is a data chunk and the position of the chunk in the file ie the first chunk at offset  has chunkid 1 see yaffsgutsc yaffsscan to see how this is done when a chunk is repalced eg file details changed or a part of a file was overwritten the new chunk is written before the old chunk is deleted this means that we don t lose data if there is a power loss after the new chunk is created but before the old one is discarded but it does mean that we can encounter the situation where we find both the old and the new chunks in flash the serialnumber is incremented each time the chunk is written 2 bits is sufficient to resolve any ambiguity bytecount applies only to data chunks and tells how many of the data bytes are valid objectid says which object this chunk belongs to ecc is used to perform error correction on the tags another ecc field is used to error correct the data yaffsobjectheader typedef struct yaffsobjecttype type apply to everything int parentobjectid u16 sum checksum of name char name yaffsmaxnamelength 1 thes following apply to directories files symlinks not hard links u32 stmode protection u32 stuid user id of owner u32 stgid group id of owner u32 statime time of last access u32 stmtime time of last modification u32 stctime time of last change file size applies to files only int filesize equivalent object id applies to hard links only int equivalentobjectid alias only applies to symlinks char alias yaffsmaxaliaslength 1 yaffsobjectheader a yaffsobjectheader is stored in nand for every yaffsobject type holds the type of yaffsobject file directory hardlink or symlink parentobject is the objectid of this object s parent name holds the object s name together these form the directory structure of the file system also worth mention is sum this is a checksum on the name which speeds directory searching ie when searching the directory we only compare the name for those entries where sum matches obvious stuff skipped equivalentobjectid is used by hardlinks a hardlink to an object uses this field to specify the object that this links to this way of doing things is a bit different than the normal linux way of doing things ie keeping the links distinct from the inode but is simpler and uses less space except for a few corner cases with hardlinks alias is used by symlinks to hold the symlink alias string this limits the size of the symlink alias in future we should expand yaffs1 to use data chunks to store aliases too long to fit into the yaffsobjectheader nand interface all nand access is performed via four functions pointed to by yaffsdevice at the moment a chunk is a page int writechunktonand struct yaffsdevicestruct dev int chunkinnand const u8 data yaffsspare spare int readchunkfromnand struct yaffsdevicestruct dev int chunkinnand u8 data yaffsspare spare int eraseblockinnand struct yaffsdevicestruct dev int blockinnand int initialisenand struct yaffsdevicestruct dev in the readxxx and writexxx functions the data and or spare pointers may be null in which case these data transfers are ignored a quick note about nand nand is not random access but page oriented thus we do all reads writes in pages each nand page holds 512 bytes of data and 16 spare bytes yaffs structures the spare area with tags used to identify what is stored in the data area there are 32 such pages to a block nand writes will only change 1 bits to  eg if a byte holds 10110011 and you write 11011010 to it you will get the logical and of the two values 10010010 the only way to get 1s again is to erase the entire block you may only write to a page a few times before erasing the entire block yaffs lives within these limitations each page only gets written to twice once when written and once when discarded ecc is normally used with nand to correct for single bit errors yaffs1 applies the ecc itself so the mtd should not do this the current mtd interfaces are not particularly well suited to yaffs1 and we will address the issue with the mtd group the mtd interface does not support pageoriented read write which yaffs1 would prefer  mkyaffs mkyaffs is the tool to format a nand mtd to be used for yaffs1 this is quite simple just erase all the undamaged blocks yaffs1 treats erased blocks as free empty space expected performance the following numbers should give an indication of the performance we should expect from yaffs1 as an example i ll use the following numbers since the hardware is capable of 50ns read write these numbers allow for some other ovberheads clearly though the performance can be degraded in various ways seek 10us page read 100ns byte write 100ns byte program 200us page erase 2ms block from this we can derive some higherlevel numbers operation time calculation read spare 12us seek 16 read read page 63 us seek 528 read write page 326 us seek 528 write program read page for verification discard page 212 us seek 16 write program overwrite page 538 us write page discard page erase overhead per page 63us erase 32 from this we can infer the following flash access times operation time calculation read 1mb file 013s about 75 mb s 2000 read page write 1mb clean system 053s about 18 mb s 2000 write page overwrite 1mb file no gc 108s about 09mb s 2000 overwrite page overwrite 1mb with 50 gc 24s about 4 mb s 2000 overwrite page 2000 page copy overwrite page 4000 erase overhead delete 1mb file 043s about 22 mb s 2000 discard page delete 1mb file with 50 gc 049s about 20mb s 2000 discard page 1000 erase overhead admin 23 may 2005 1236pm  ',0),(40,'und','node_search',' howto incorporate yaffs in linux howto incorporate yaffs in linux brief howto on incorporating yaffs as a root fs by n c bane  nick cecomputingcouk   document status this document is very much work in progress it currently refers to yaffs1 and needs updating for yaffs2 it has been edited by different people with no attempt to keep a consistent style beauty will come with age what is yaffs  yaffs stands for yet another flash filing system it is a journaling filesystem designed to run on nand flash with special reference to embedded systems why would i want to use it  nand flash smartmedia cards are repackaged raw nand chips is cheap and has a fast erase time as compared with nor flash the nand physical interface is very simple the small size and low current requirements make it very suitable for embedded systems however nand has its problems these are mainly due to bad block management as blocks of memory can be bad when the device is shipped and further blocks can become unusable over time power can die unpredictably in embedded systems leading to data loss and possibly file system corruption this is where yaffs comes in it handles bad blocks and uses formats which are resistant to corruption what do i need to know  it is assumed that the reader has a development system with direct access to nand flash ie not a cf smartmedia adaptor which the user should be familiar with building linux kernels and patching build trees it is strongly suggested that you also read more about nand flash on the linux mtd site assumptions  you have already downloaded the yaffs sources from the cvs at aleph1 you have mtd code that exposes nand as an mtdblock device nand interface  for yaffs to function it must be able to be the only code that writes to the oob area on the nand device the existing nand driver in kernel 2419 assumes that it will do the ecc oob management for the host fs for yaffs this is quite wrong you can disable ecc oob calculations either by hand patching the mtd code to bypass ecc calculations or by merging the latest mtd cvs the patches at http wwwtobychurchillorg have done the latter including yaffs as a kernel fs  1 create linux fs yaffs directory in your kernel test source 2 copy devextrash yaffsfsc yaffsgetsc yaffsgutsh yaffsmtdifc yaffsmtdifh yaffsinterfaceh and yportenvh from the yaffs sources to that directory 3 copy the makefile from either the yaffs sources makefilekernel or the balloon download site below to linux fs yaffs makefile 4 modify linux fs configin to include the 3 lines if configmtdnand y then tristate yaffs filesystem on nand configyaffsfs fi 5 modify linux fs makefile to include the yaffs fs reference subdir configyaffsfs yaffs 6 configure the kernel to include not modules all the mtd nand code incl nandecc and mtdblock device and yaffs fs you should now be able to build a kernel with yaffs as a root fs using the normal tools creating a bootable yaffs partition  you can 1 create the partition by mounting it from a running linux os and copying the data there the mkyaffs utility in the yaffs source simply erases a nand mtdblock device without removing bad block data 2 make and download a filesystem image the mkyaffsimage utility that came with the sources will create a yaffs block list in a file from a root tree this is a list of 512 16 byte blocks that need to be placed in any order on a nand device you will need to write code to copy these data blocks and add in the block numbers in the oob areas examples of a modified handheldsorg bootldr for the balloon board can be found on the tobychurchillorg website booting into yaffs  modify your bootloader to pass a command line to linux to specifying the mtdblock n that refers to the root partition balloon page at http wwwtobychurchillorguk yaffs mailing list to join go to http stoneboataleph1couk cgibin mailman listinfo yaffs and enter your email address linux mtd http wwwlinuxmtdinfradeadorg   id admin 23 may 2005 1241pm  ',0),(41,'und','node_search',' jffs2 and nand study jffs2 and nand study for the purposes of this discussion the term nand will mean both and and nand type flash memories both sharing similar properties from a system perspective a bit of history  history on my perspective not the history of jffs2 some years ago i wrote a flash file system for trimble trimble patented this system this ffs runs on nor flash and uses a concepts very similar to jffs to overcome problems associated with flash translation layers ftls and flash this ffs was rigorously tested for block failure stress tested in various ways and deliberately crashed with an emulator at critical stages to attempt to damage data integrity the ffs held up to all this thus when looking at jffs2 i can immediately understand why certain things are being done and various benefits of this approach over ftls at first i thought that using an ftl would be better than jffs2 for nand because nand has a different set of constraints after a bit of analysis i came around to thinking that using jffs2 would still be better than an ftl mainly because jffs2 dispenses with the need for a logical to physical translation layer  nor and nand the following table highlights some of the important properties of nor and nand flash this table holds true for most devices though there are some oddball devices out there  nor nand cost higher cost lower low density approx 8mb max device size higher density approx 256mb max device size linear random access like ram can be used for xip sector read write almost like a disk can t be used for xip structured as erasable blocks of 8kb to 128kb typical structured as erasable blocks of 32x512byte pages each page has 16bytes of extra management data endurance 100k to 1m erasures endurance 100k to 1m erasures erase time 1second erasable block erase time 2ms designed as rom replacements designed as mass storage replacements bytebybyte programming allowing singlebit modification any single bit can be modified from a 1 to a  by programming that byte however the only way to modify a  to a 1 is to erase the entire erasable block page or partialpage programming a page may be programmed a maximum number of times after that number of times the erasable block must be erased to allow further programming write operations can only modify 1s to 0s changing 0s to 1s requires an erasure random access programming pages must be written sequentially within a block no bad blocks when delivered but the devices wear out thus file systems should be fault tolerant bad blocks are expected when the devices are delivered further degradation is expected with use thus fault tolerance is an absolute necessity it is important to note the various differences between nor and nand flash because these are material in choosing the appropriate file systems for each in particular the erasure times are very different this impacts on the selection of appropriate garbage collection and erasure strategies nor s 1 second erasure time is significant and needs to be considered nand s 2msec erasure time is virtually insignificant the programming access restrictions that apply to nand do not apply to nor errors are far more likely in nand devices therefore error detection and correction is highly desirable nand flash is arranged in pages sectors of 512b and is inherently block structured both families of flash technology have significant usage restrictions which require special consideration when using the devices for file storage all flash memory blocks can only endure a limited number of erasure cycles some wear levelling strategy is required to prevent oftenused sectors wearing out faster sectors are smaller than an erasable block thus some garbage collection strategy is required to reclaim deleted dirty sectors to accomplish this the good data must be copied off the selected block so that the whole block can be erased without losing data if a part of a file needs to be overwritten it is a limitation of flash memory that the new data cannot just overwrite the data at the same physical location instead the data must be written at a new location thus some sort of logical to physical mapping layer ie ftl or alternative data storage approach is required eg jffs2 such logical to physical decoupling is also required to perform garbage collection  flash file systems in general flash file systems can essentially be implemented in two possible ways custombuilt file system ie the whole file system is designed so as to operate with flash memory an example of this is jffs2 or microsoft ffs2 use a standard file system with a custom block driver ie flash translation layer ftl each of these approaches have their pros and cons ftls are particularly suited to situations where the file system is preordained a custom file system is able to be more flash friendly  an appraisal of the jffs2 file system jffs and jffs2 achieve the logical decoupling between logical file positions and physical memory by using journaling for this to work the entire file system must be designed to support journaling as appropriate to flash memory this is not excessively restrictive with nonremovable media and embedded systems since there is no need to conform to a legacy file system layout jffs2 is designed to support nor flash but is currently not suited to nand flash since it does not handle bad blocks if this deficiency was addressed would it be a better choice for nand than an ftl probably not directly some other tweaks would be needed journaling is particularly useful garbage collection bad block handling and the restrictions which prevent flash sectors being overwritten mean that data in flash file systems is forever being moved around for ftls this means storing logical to physical mappings journaling neatly sidesteps this overhead one of the most thorny issues with flash file systems is that there are many patents covering both ftllike block drivers and various approaches to custom file systems these patents are particularly restrictive in ftllike block drivers especially the msystems patents jffs2 does not violate any patents i am aware of but it probably comes quite close to some particularly the trimble one thus it is highly beneficial to have a gpl ed system that can be extended work needed the following effort is required to make jffs2 work with nand new mtds for nand flash a new interface is probably required for nand since many of the functions for nor make no sense on nand bad block handling this could be handled in a norspecific layer although it should really be generically supported since nor can fail too ecc for data security code available from samsung www this can be handled as part of the write and read when a journaling node is written it should be verified if the data cannot be retrieved then a new node is created fixed size journaling nodes since nand is page oriented with limited writes per page this might make compression challenging maybe compression can t be used with nand anyway fixedsize journaling nodes probably reduce fragmentation too since there s an integer number of these per erasable block the following are possible improvements tuning garbage collection erasure strategies to suite nand eg nand erasure time is much faster using fixedsize nodes will probably strip out a chunk of code too attempting to use the spare 16 bytes per page for journalling tags if there s a useful amount of space left after ecc and bad block management thus my preliminary suggestion would be to add a nand subsystem to jffs2 this subsystem would use the same journaling file system core fixing the size of journaling nodes to pages of 512 bytes quite likely simplifies the interfaces node management and garbage collection error handling would fit within the nand subsystem since nor fails too bad block handling is really required for nor too whether the same management is appropriate for both is tbd ecc is only required for nand  references samsung and toshiba nand part data sheets and www samsung in particular has useful applications notes and code jffs2 presentation materials http sourcesredhatcom jffs2  laurie 6 june 2006 134pm  ',0),(42,'und','node_search',' state of nand mtd driver at start of project state of nand mtd driver at start of project current state of nand mtd the current nand mtd supports basic read write functions the code is hardwired to support the nand devices on a spia board the ecc code supports 256 byte sectors there are 3 files nandc nand support algorithms unfortunately there is no hardware abstraction ie the hardware is assumed to be the spia board but this is relatively easy to add spiac this initialises the spia hardware to set up the addresses for the hardware access eccc ecc for 256 byte pages what needs to be done at this level hardware abstraction of nandc this allows this code to be used with different hardware configurations the larger memory sizes use 512 byte pages the memory sizes supported by 256byte pages are obsolete 512byte pages are treated as two subpages of 256 bytes each the samsung code is calculation based ie maybe slow the toshiba code is table based and probably faster check if they are equivalent write a software emulation for a nand device the purpose of the software emulator is allow debugging without the need for hardware nand file systems need to be fault tolerant the hardware can t be forced to fail to test out bad block detection handling etc a software emulator can be forced to fail  overall flash system diagram a diagrammatic representation of support for smartmedia nand and nor as well as both fat16 and jffs2 might look like the above the nand flash subsystem uses common layers for hardware access ecc bad block handling and lowlevel formatting based on smart media lowlevel specs by using the same low level formatting and ecc as much as possible we gain some benefit in testing reuse etc the lowlevel formatting would differ in that fields used to store the lba and reserved fields might be used for something else journaling tags  concerns with using jffs2 on nand there are some reasons why jffs and nand might not work together that well two particular concerns re booting nand devices are typically much larger than nor eg 128mb is currently a large nand chip while 16mb would be considered a large nor chip thus the data structures associated with flash management are likely to be much larger also jffs2 scans the media on boot to build data structures representing the nodes in the system this increases the boot time nand is not random access but must be read serially this means that the scanning routine can t just merrily skip through the flash instead the whole flash must be read and ecc d first this slows scanning and hence booting thus booting a 128mb nandbased jffs2 is likely to look something like this read and ecc every last byte on the device even if we only need a few bytes per page for journaling headers and digest the contents at say 5mb second this will take 25 seconds each node requires a 16byte structure struct jffs2rawnoderef if nodes were 512bytes then that s 4mb of ram these are probably unacceptable for the product being used we therefore need to run something better than this two approaches spring to mind just run fat16 ie just treat all nand as smartmedia benefits one code base downside reliability i m reluctant to store critical files in a fat16 file system because these can be so unreliable i m convinced that a journaling file system is superior maybe what we need is a light weight journaling file system using common code with jffs modified in such a way as sidestep some of the nasty issues raised above  what i m working towards right now i m investigating the idea of trying to do something more appropriate my current avenue of exploration is to use a journaling approach as follows the journaling records are stored in fixedsize 512byte pages the journaling tags are stored in the 16byteperpage management space semiconsistent with smartmedia using the 8 bytes of reserved space and lba space to store journaling tags ie something like 20 bits of page id within inode 20 bits of inode id 9 bits length bytes used in this page 7 bits flags etc 8 bits of hamming code on this area each page id identifies where the page fits into the file when a page is replaced ie file data is overwritten a new page with the same page id is written and the old one is wiped out during garbage collection the pages containing valid data are copied and the wiped out data is discarded the benefits of this approach are nandfriendly since it works within the write limitations of nand less stuff to read to reconstruct file structures only read management data down sides no compression but is that an issue considering the target data is already compressed and nand is far less precious than nor thanks to higher densities and lower price still need to see if a new data structure is going to reduce the overhead of jffs2rawnoderef somewhat admin 23 may 2005 1250pm  ',0),(43,'und','node_search',' yaffs history yaffs history yaffs came about because toby churchill ltd tcl needed a flash filing system for their devices they wanted something reliable and one of their fundamental requirements was fast boot time we looked at adding nand support to the existing flash filesystems jffs and particularly jffs2 but it became clear that the boot time and ram consumption a 128mb nand would use about 4mb ram in node tables were a problem and adding nand support wasn t trivial either but has since been done in the end we decided a different filing system explicitly for nand was the way to go the design was greatly simplified by not including compression in the fs which makes sense as nearly all the large data files tcl used were compressed anyway and the larger size of nand devices makes compression less important a cramfs filesystem can be mounted within yaffs if you need to compress some of your data the original work was paid for by toby churchill ltd  the project instigators and brightstar engineering  here is a collection of notable events and milestones in the history of yaffs 200610 yaffs updated to work properly with linux 2617 mtd on 512b and 2k page nand 20060508 checkpointing added so startup scanning time enormously reduced 20040802 linux kernel 26 support checked in 200402 yaffs presentation given at fosdem on embedded track 20030621 yaffs runs with linux kernel 2570 200305 first two yaffs direct licencees 200304 yaffs direct nongpl license option created for those who can t use the gpl 20030307 viewcvs installed to make cvs browsing much easier and help those behind cvsblocking firewalls get access to the code 200301 yaffs direct ported to psos 20030121  yaffs direct interface checked in a version of yaffs designed for integration into lightweight rtoss and embedded systems 20030121 yaffs bootloader example code checked in so your bootloader can read directly from yaffs 20021104 yaffs2 spec announced for discussion 20021108 wince port code checkedin to cvs 20020923 announced to the world 20020917 header files relicensed under lgpl to make it easier to add yaffs support to bootloaders or other nonfree software 20020913 standalone system using yaffs root partition booted 200208 wince yaffs port working 20020520 mtd interface tested on hardware emulation and some real hardware 20020514 v01 release mtd interface done and incorporated this is essentially untested yaffso provides two file systems one to support internal ram emulation called yaffsram and the other mtd called yaffs docs improved updated mkyaffs filesystem creator written 20020424 now includes device contexts but as there is only one emulation instance this isn t any practical use yet some bugs fixed and disk full handling still some vfs problems apparent in subdirectories statfs attributes still to do symlinks and hardlinks not yet wired to vfs layer 20020415 kernel module that runs as an fs on 2mb internal emulation the core filingsystem seems to work pretty well some problems remain in the vfs layer producing various odd effects only one instance of the fs supported 20020403 core fs runs on emulation layer instead of real nand create read write delte resize reanem files create directories scans media on startup garbage collection admin 23 may 2005 1251pm  ',0),(44,'und','node_search',' yaffs and arm linux support yaffs and arm linux support admin 23 may 2005 1254pm  ',0),(61,'und','node_search','  anti software patents talk 2003  anti software patents talk 2003 admin 23 may 2005 319pm  ',0),(62,'und','node_search',' updated software patents talk updated software patents talk hi i m wookey chief nerd at aleph one a small software and hardware producer in cambridge we do both free and proprietary software these days largely around embedded systems and gnu linux on arm processors those are the ones found in most mobile phones and pdas i ve been asked to come and speak to you about software patents today this is currently a hot topic because there is a directive going through the eu at the moment which could either make software patents illegal or legal depending on its exact wording this will set the programming legal environment for the next 10 or 20 years so it s important that anyone working in the field of computing understands the issues and implications now i don t claim to be an expert in this area but my interest was piqued some 18 months ago by hearing richard stallman of the free software foundation speak on the subject and since then i ve been to a conference in brussels and various discussions in and around cambridge talking to people on both sides of the debate so i ve now got a reasonable grasp of the arguments and i hope i can adequately explain them to you it s a big subject but i ll try and cover the main points here today and leave time for some questions discussion i ve recently been to a 1hr version of this talk and that s a bit much even for dedicated geeks so this one will be more like half an hour this talk is not entirely neutral after examining the arguments i ve come firmly to the conclusion that software patents are a very bad thing for society the viewpoint i ll give today is essentially is that of the ffii a european germanbased organisation campaigning for a free information infrastructure concentrating largely on software patents for the last 2 years they have amassed an amazing amount of info on software patents on their website and are an excellent resource should you wish to read further about this i ll be putting this talk on the web when i get back home in a week or so so if you want to refer to it for urls or references just search for wookey or aleph one and ignore wookey hole caves who beat me to the top google spot the basics patents are a bargain between state and public a monopoly granted in exchange for publication of information this is intended to promote inventive activity and preserve information so it doesn t get lost they are granted for inventions in a technical field which are new suitable for industrial use and unobvious to an expert in the field there is an assumption of balance that the width of protection granted is justified by the significance of the achievement when a patent is granted there is one winner who can exploit the invention exclusively and potentially many losers who must forgo the invention or buy a licence if the patent owner chooses to sell them one where this balance holds then the system is effective the resources put into researching the invention justify the negative effects of the patent monopoly as is often the case in pharmaceutical research but software patents are very close to patents on pure ideas the achievement is minor and the research usually negligible but the protection can be very wide as a patent can affect an enormous number of pieces of software a patent only gives exclusive rights in the country of issue unlike copyright which automatically applies everywhere that has signed up to the berne convention so a us patent only applies in the us a french patent in france the european patent office the epo exists to simplify the process of getting numerous national patents in european countries it deals with the examination process and translations and the issuing of british french polish etc patents in the countries you have chosen to pay for patents in we ve got very used to patents but they are not a free market or a right or a natural state of things and need to be justified in a given sphere of activity most people on the street will say yes patents are a good thing if asked but at least in the sphere of software the assumption that patents are good needs to be questioned and some evidence produced for why copyright copyright already exists for software and is wellsuited it stops wholesale copying of your implementation but it doesn t stop someone making something that does the same job to copy your program legally someone will have to reimplement it that s about the same amount of work as it took you which is fair enough and you have a head start of however long it took by the time they ve caught up you ll be on the next version innovation copyright and trade secrets for proprietary software are all that is needed to protect software in the market patent lawyers will say copyright is only for poetry and the like but in fact it works quite well for music scores music sound pictures films etc copyright is also free and automatic to obtain and automatically applies internationally the biggest problem with patents for programmers and businesses is uncertainty you can easily run your business so you don t trip over copyright just don t plagiarise but it is impossible to run it such that you are safe from unexpected attack by patent lawyers patents are written in a special language which even experts in a field find difficult to understand in order to decide if you infringe a patent you normally have to ask a patent lawyer and they charge several thousand pounds per patent for an opinion examining thousands of patents every year to check if you infringed is impossibly expensive and or timeconsuming for most small to medium sized businesses smes so they don t do it thus in practice every day a programmer writes code she infringes a patent or two and one day someone will turn up telling her she infringed it makes software writing into a minefield suddenly one day a patent mine will blow up under you or your company and the costs could easily destroy it whether or not you really did infringe 2 or 3 such attacks will almost certainly be fatal in practice patent lawsuits generally cost about half a million dollars those involved in real cases said that even when the accusations were obviously frivolous it was still cheaper to just pay up than go to court and try to prove them wrong or demonstrate prior art and do you realise that if you had invented the relevant technique prior to the patent then that might get you off the hook but if you didn t publish it then the patent remains valid and others can still be hassled with it none of this helps companies write software and innovate if they play the game they need to employ some lawyers and spend a lot of engineer time writing patent applications if they don t they will one day find that they got big enough to sue the existing software market isn t broken software and software companies developed just fine without patents so the premise that they are necessary to encourage investment and innovation is clearly wrong for example microsoft never had any patents before it got be huge but now that it s a dominant incumbent it s buying hundreds of them noone had any before about 1982 and the floodgates didn t open in the us until around 1994 and plenty of software got written some of it highly innovative to change the software legal environment in this fundamental way needs some very good reasons and evidence and that evidence simply doesn t exist you can find lots of legal argument promoting the idea but almost no economic arguments or studies patent lawyers always talk about this subject from a legal perspective not from a social or economic one they believe all patents are a good thing per se and don t even consider the idea that they might not be we and mps and meps must consider the overall economic social and innovation effects to see if they really are a good idea the classical idea of patents is that they protect individual inventors with great ideas from large corporations and whilst they may work like this occasionally for software in practice they seem to do exactly the opposite having one patent on something is very little defence against a large corporation that wants to use your idea because any useful piece of software uses many many ideas and algorithms the corporation will just say ah yes we may be infringing your patent but you re infringing six of ours do you really want to go to court about it ibm are masters of this strategy and there are many stories of cohorts of stonyfaced lawyers turning up to give anyone threatening them with patent infringement a hard time so in practice allowing software patents simply leads to a numbers game where all the players need lots of patents and it doesn t matter if most of them are rubbish they just need to cover as much of the field of computer science as possible only large corporations can absorb the costs and get lots of software patents and use them to stifle competition from innovative startups it s largely big corporations lawyers who make a living from them and parasitic companies that use patents for extortion but never invent anything that promote software patents the vast majority of software developers and smes are not in favour of them 300000 signatories including 700 companies signed a ffii petition against them for example the only evidence that does suggest smes benefit from patents in the us includes in its definition of smes companies which do no research or development of their own at all socalled patenttrolls these outfits buy up patents from defunct companies and then go round suing other companies which are making real products is this the sort of development and innovation we wish to encourage patenting works reasonably well where one patent corresponds to one product as in chemistry and pharmaceuticals but every program of any significance has thousands of ideas in it and thus can be affected by thousands of patents avoiding them all becomes increasingly difficult as more and more patents on fundamental buildingblocks and useful ideas are issued the us is a handy test case being some 4 or 5 years ahead of us in swpat terms and the evidence clearly shows that patents cause plenty of problems the longer the patentgrab game goes on the worse it gets the federal trade commission recently held hearings on the state of the patent system and company after company said the situation was out of control in the field of software and was not helping at all that study was published in august 2003 and is a fine example of a very staid government body concluding that they are actively unhelpful nevertheless there is a lot of pressure from the us for the eu to legalise software patents this comes primarily from large companies which stand to gain from them but even companies that don t like software patents realise that they will lose out unless we operate under the same restrictive regime so they tend to support the idea of software patents in the eu too in principle the problems of software patents would be enormously reduced if they were only given for things that were genuinely complex or hard to invent but the system itself encourages very low standards of examination patents are supposed to be not obvious to an expert in the field but how many of you think that these typical european patents are not obvious progress bar electronic shopping trolley dynamically extensible webserver cgi scripts controlling one computer from another rpc telnet clientserver displaying objects in overlapping windows or transferring pupil data between computers over a wireless network these are all just the obvious way you would do something if asked to provide that functionality and they are not particularly unrepresentative examples if you look at the patent database and read through the legalese nearly all software patents are this trivial you can get a patent for almost any computing idea if it is dressed up in the right language the ffii maintains a database of patents translated back into something software engineers can understand to show the sort of ridiculous things that already get patents the problem is that there are so many areas of expertise needed that it is now impossible to have patent examiners proficient in every sphere of software so trivial patents will always get through and the economics of patent offices also drive this process because they want to give value for money to their customers people pay to be granted patents not to be refused them but the office has to do nearly the same amount of work in both cases th epo charges more than any other patent office several thousand pounds but still grants all sorts of trivial patents the us patent office is much worse another irony of the system is that in the days of the industrial revolution a patent included a technical drawing of the invention that could be used to build it the publication side of the monopoly in exchange for knowledge balance i mentioned earlier but software patents only include a description of the idea not an actual implementation that could be used for someone to build on there is no requirement to publish working source code and indeed patent lawyers resist this idea claiming that it is much clearer to have them rewrite your program in patentspeak which if you have ever tried to read a patent clearly isn t true this process just makes it easier for lawyers to keep the whole system under their control as you need them to apply for patents and to interpret patents and programmers find the published patents completely useless as a source of knowledge even though that is supposed to be a major part of their purpose one of the main arguments given in favour of software patents is the americans have them so we must too in order to compete this is a barmy argument the eu currently has an advantage because european companies can write software without tripping over patents all the time they can still get us patents if they want to use them in the us but are safe at home americans are finding it harder and harder or at least increasingly expensive to write software and are liable to being sued at home there have already been a lot of software patents granted in the eu despite their dubious legality and most of them are owned by us and japanese corporations making them legal would simply hand a significant chunk of the eu software business to foreign companies standards patents are making it increasingly difficult to set standards jpeg was specifically created as a patentfree standard even forgoing a few percent of speed to ensure no patents were infringed but now 15 years later a patenttroll has bought a relevant patent and is enforcing it they got 22 million dollars out of a couple of japanese digital camera companies last year and when the president of the jpeg committee said that there was prior art they accused him personally not the jpeg committee or his company of patent libel this claim has not put them off and they are still hassling businesses that write jpegs the mpeg2000 standard is probably already dead in the water due to arguments about patents anything that does legalise them must have strong safeguards to stop things like the jpeg hijacking there can be agreements amongst those involved in the discussions but it s very difficult to do anything about people who don t join in and wait till afterwards to come and sue a use it or lose it provision and and interoperability defence would both help here free software free software has both advantages and particular problems with respect to patents the fact that it is all published is a useful prior art defence it also makes it very easy to see if there has been an infringement so its authors are particularly open to being sued as nearly all free software is distributed at no cost there is no mechanism to pay for licenses so it can t use any patented algorithms or features a clause in the law is essential to allow free software to interoperate and even royaltyfree patent agreements in standards could cause problems as they only allow using the code for the specified purpose not any other possible use someone might come up with later it seems to me that independent invention which happens all the time in software development should be a sufficient defence but that is anathema to the patent system in principle a much shorter period for patents 35 years would help reduce the bad effects but this is legally extremely difficult to do the international agreement trips says that patents must be 20 years for all fields of endeavour this is clearly inappropriate for software imagine having to write all your software using only ideas from when the zxspectrum was the state of the art 20 years is an eternity when most software products have a life of around 18 months this 20 yrsornothing aspect is actually a good argument for nothing one argument of the propatent lobbyists is that we can t cause trouble with the epo or pass laws that would invalidate existing patents this is the line taken by the uk government but this reasoning is simply caving in to the epo who have pushed the current status quo miles beyond what the law states it s not our fault that clarifying the situation to a sensible state will mean a lot of patents have been issued on very shaky ground they are mostly worthless anyway and should be treated as such so where are we now software patents are currently illegal in europe according to the european patent convention agreed in 1973 the legislation says quite clearly that a number of things are not patentable discoveries scientific theories mathematical methods aesthetic creations schemes rules and methods for performing mental acts playing games or doing business presentations of information and computer programs you can see from this list how software is filed alongside things which are essentially ideas discoveries and creative acts like writing a novel or a symphony we don t allow patents on the arrangement of words in a particular form of clause or story we don t allow the creation of a particular motif or structure in music to be patented and we don t allow patentability of a new sort of provision in a legal contract we do allow the complete arrangement of notes or words in these things to be copyrighted software is like these it is the bringing together of many small obvious components into a coherent whole and this process is a creative act not an invention in the sense of patent law so how come we have 30000 software patents in europe already it s because patent lawyers at the european patent office epo have over 20 years of case law twisted the word and spirit of the law out of all recognition essentially saying a computer program as such the wording in the epc is not the same as a computer program and that because software runs on hardware which is inherently technical gets hot uses electricity it can be patented this is why you have to be really paranoid when considering the wording of legislation nearly everyone involved says they don t want software patents and they certainly don t want business method patents but then write legislation that allows unlimited patentability of ideas business methods in computer program terms either through ignorance or mendacity the existing 1973 text is pretty clear if that doesn t work we have to be astonishingly careful in the wording of new law to ensure that there are meaningful limits on what is and isn t patentable the legislative process i need to step back a moment here and explain the legislative process in the eu there is a tripartite system involving the european commission the european parliament your meps and the council of ministers which is composed of representatives of each of the eu member governments law is proposed by the commission amendments are proposed by committees and parliament then voted on by the parliament next it goes to the council of ministers for a vote with this particular piece of legislation the directive on computerimplemented inventions this is where we have currently got to next it goes back to the parliament where further amendments are possible and finally back to the council again for ratification the commission originally proposed a terrible directive which effectively allowed unlimited software patentability however a huge lobbying campaign led by the ffii which apparently produced the biggest petition the parliament has yet been presented with persuaded the parliament to add a large number of amendments which put real limits on patentability and included an interoperability clause but then when the directive went on to the council of ministers they discarded all of the parliament s significant amendments and produced a version which was even worse than the commission s original as it included program claims too i ll explain what that means in a mo this was bizarrely described as a compromise position given that it totally ignored the democraticallyelected parliament s position this version was narrowly agreed two weeks ago by the council so now we go back to the parliament unfortunately second time round amendments are significantly harder to get passed as they need a majority of all meps not just the ones present at the vote and whilst that s not impossible it won t happen unless your mep hears from you that this is an important issue it is also important to work on national governments the uk has been at the forefront of those pushing for unlimited patentability via this directive apparently driven by the uk patent office and changing goverment policy is going to be very difficult but many other european governments are getting rather nervous about this issue and it is definately an argument that can still be won key issues there are three key issues in the legislation program claims interoperability and the meaning of the word technical ie what is patentable program claims means that software patents can cover the publication of programs in machinereadable form not just the use of those programs this means that sending someone a file containing patented software becomes illegal without a license and even discussing the software would become difficult as there is nothing to say that discussing algorithms using code fragments the way programmers normally discuss code is allowed this is the provision that was added in the council of ministers draft showing how the national patent offices who obviously like this sort of maximisation of the reach of patent law are currently controlling the views of our governments a fair use provision would at least offer an olive branch but really the scope of patent protection should be kept to use of the invention not extended to include information about the invention itself software is different from normal manufactured goods because it is just information it is both the invention and the description of it in one thing this is why program claims make sense to patent lawyers and equally explains why programmers believe software simply shouldn t be patentable at all because it is information not an industrial process interoperability there is nothing in the proposed draft short of a fullscale eu competition investigation to prevent dominant patent owners preventing competitors from interoperating by refusing them licenses the most obvious example is the recent patent microsoft has been given on the particular xml format used in its newest word documents it must be possible for others to write software that is compatible without having to buy patent licenses and this is the position backed by the european parliament which allowed automatic unfettered use the danish parliment suggested a compromise of a fasttrack procedure for courts to require compulsory rand licensing ie a paid licence but available to all and at the same cost this would work for proprietary software but is not much use for free software should it be illegal for openoffice to read and write ms word documents or the linux movie software mplayer not to be able to play films you bought your mp and mep needs to hear that you consider interoperability essential technical as i said earlier according to the european patent convention computer programs are excluded from patentability to the extent that the claimed invention relates to the computer program as such the new directive legislates for a framework in which the crucial test for patentability is whether the claimed computerimplemented invention has a technical effect this has given supporters of patentability a figleaf that pure software as such will not be patentable but what is software and what is technical there are essentially three views 1 there is general agreement that newly invented physical processes should be patentable regardless of whether software control is needed for the process to be achievable the classic example is an antilock braking system if a particular nonobvious process of applying the brakes has a particular physical benefit this was the view taken by the parliament and is supported by the german government the characteristic wording is that control of the forces of nature is technical but that internal processing of data is not technical 2 uk case law goes further than this so whilst processing of generic data is not generally patentable the invention becomes technical if the data has technological relevance so things like imageenhancement software is patentable because the image data is technical because the uk has been giving software patents like this for some years now the goverment is steadfastly refusing any stricter definition of technical because it will invalidate existing patents 3 the epo has gone further still and takes the position that all computing is inherently technical and so anything that has practical usefulness makes a technical contribution thus they say that a new algorithm as such is not patentable but any algorithm with any identifiable practical usefulness runs faster uses less memory is patentable this third option is what the council of ministers draft proposes and is what uk ministers are backing despite saying nothing shall be patentable which is not patentable already here s a few more examples of what the epo has already decided is technical and granted patents for emailing the recipient of a gift to ask where they would like their gift delivered amazon gift ordering using the same data without retying to update both a sales ledger and stock control tabbed windows making more efficient use of screen space this laughable list is unfortunately almost endless this computing is technical so software should be patentable argument is like saying that music should be patentable because playing it in a stereo system produces physical effects in the loudspeaker software ideas are independent from the hardware in the same way that music is independent of the reproduction equipment here is another way to look at why the controllable forces of nature definition of technical makes sense a computer is a turing machine programs are logically equivalent to maths and that is why they should remain unpatentable as soon as you allow algorithms to be patented then ideas and everything in human endeavour follows including voting systems and social organisation methods the question boils down to the two sides of the argument a if physical processes are patentable why should it make any difference whether they run on special hardware for that process or on general purpose hardware ie a computer b if rules of organisation and calculation are not patentable why should it make any difference whether i run them in my head with pencil and paper or with today s normal tool a universal computer both these apparentlylogical arguments cannot be right and in fact the 2nd argument is right because the economic argument comes in here abstract ideas regardless of their applicability are produced without experimentation cost applicable to an infinite number of problems and are replicated at zero cost with no overhead to which patent costs could be added this is the right place to draw the line between what is and isn t patentable ideas should not be patentable the ffii proposals distinguish between mind and matter and invention and implementation in the real world making complex systems that work is difficult in software it is easy your for loops will not overheat and melt a nearby function and neither will an array cause electrical interference in your hash function so patents are applicable to the industrial world of controllable forces of nature not to the world of algorithms and rules of organisation and calculation there will always be borderline cases and ffii have set up a benchmarking suite of example patents against which legislation can be tested advances in software are like advances in science everyone is building on the work of those who went before by making small improvements standing on the shoulders of giants free publication and reuse of ideas is an essential component of this development would having to pay a licensing fee for the use of every idea or reference in your phd thesis increase your innovation where would we be if newton or einstein or any others of a host of scientists in the last 200 years had patented their ideas the free software movement has shown in the last 15 years that a cooperative model of software writing is more efficient than a closed proprietary one at least within the commodity zone of generalpurpose software such as operating systems data protocols and office software the internet has become a remarkably pervasive thing over that same time period precisely because it runs on open patentfree standards everyone can use it on an equal footing and write interesting applications for it without payments or legal restrictions if tim bernerslee had patented http back in 1987 the whole world would be a great deal poorer we wouldn t have the web in the ubiquitous form we have it today perhaps we wouldn t have it at all and he probably wouldn t even be better off as he s just won a prize of a million dollars for his contribution to mankind he would have struggled to make that much money from a patented and thus stangledatbirth web just because something is a good idea doesn t mean it must be patented or even patentable so far as i can see software patents are a bad thing and have no overall benefit to society or developers in the long term all the evidence shows that they will constrain development reduce innovation and prevent free software and small businesses from competing on a level playing field they seem to be little more than an effective tool to allow large businesses and lawyers to suppress competition from small ones and individuals and to move fundamental ideas and algorithms from the public domain to private ownership however powerful forces the ones who stand to benefit from this legislation disagree with this and are largely getting their own way in legislationland at the moment so if you don t want to see everything under the sun patented then you need to say so very clearly to your representatives right now admin 23 may 2005 322pm  ',0),(73,'und','node_search',' contact contact admin 22 june 2005 1151pm telephone  44 1223 811679  email  info aleph1couk post the old courthouse 123 high street bottisham cambridge cb25 9ba united kingdom  public transport buses you can reach us by bus from the bus station on drummer street in the centre of cambridge in 20 minutes buses run two or three times an hour much of the day click for timetables and under bus timetable lookup enter 10 or 11 in the service no box look at the map below the number 10 bus enters the village from the east end and passes westwards along the high street get off at the bus shelter on the south side of the high street about 500 metres after leaving the main a1303 road to enter the village the courthouse is a further 100 metres west and on the other north side of the road the number 10 buses leave drummer street at the hour and half hour and take 20 minutes the number 11 bus leaves at 15 and 45 minutes past each hour and travels along the main a1303 road to newmarket and them bury st edmunds passing the east end of bottisham get off at the bus shelter on the main road and walk back past first copy the former white swan pub on the high street continue about 450 metres west along the high street towards the centre of bottisham the courthouse is on the north side of the high street if coming to visit please make an appointment before setting out click here for a page with only these maps for printing out  this shows the location of aleph one within bottisham park in the layby on the south side of the road we are opposite in a large building with three arched windows there are doors on either side of the building and you may need to try both to get a response map below shows where we are in relation to cambridge and the surrounding roads  ',0),(77,'und','node_search',' yaffs talk slides from a presentation to fosdem in 2004 yaffs talk slides from a presentation to fosdem in 2004 admin 6 july 2005 304pm  ',0),(79,'und','node_search',' yaffs talk slide 1 title yaffs talk slide 1 title admin 6 july 2005 617pm   ',0),(110,'und','node_search',' yaffs talk slide 2 intro yaffs talk slide 2 intro admin 7 july 2005 131am  the areas covered by this talk who s involved in the work on yaffs and how it got to the current stage an explanation of the differences between nor and nand flash then we ll look at the filesystem itself covering the filesystem design licencing what you need to do to port it to a new os we ll finish with some performance comparisons and the changes present in yaffs2  ',0),(111,'und','node_search',' yaffs talk slide 3 project genesis yaffs talk slide 3 project genesis admin 7 july 2005 140am   ',0),(112,'und','node_search',' yaffs talk slide 4 history yaffs talk slide 4 history admin 7 july 2005 143am  ',0),(113,'und','node_search',' yaffs talk slide 5 flash primer yaffs talk slide 5 flash primer admin 7 july 2005 147am   ',0),(114,'und','node_search',' yaffs talk slide 6 design approach yaffs talk slide 6 design approach admin 7 july 2005 149am  ',0),(115,'und','node_search',' yaffs talk slide 7 architecture yaffs talk slide 7 architecture admin 7 july 2005 151am  ',0),(116,'und','node_search',' yaffs talk slide 8 terminology yaffs talk slide 8 terminology admin 7 july 2005 153am  ',0),(117,'und','node_search',' yaffs talk slide 9 filesystem design yaffs talk slide 9 filesystem design admin 7 july 2005 155am  ',0),(118,'und','node_search',' yaffs talk slide 10 filesystem limits yaffs talk slide 10 filesystem limits admin 7 july 2005 157am  ',0),(119,'und','node_search',' yaffs talk slide 11 oob data yaffs talk slide 11 oob data admin 7 july 2005 159am  ',0),(120,'und','node_search',' yaffs talk slide 12 filesystem data structures yaffs talk slide 12 filesystem data structures admin 7 july 2005 201am  ',0),(121,'und','node_search',' yaffs talk slide 13 filesystem ram data structures yaffs talk slide 13 filesystem ram data structures admin 7 july 2005 205am  ',0),(122,'und','node_search',' yaffs talk slide 14 partitioning yaffs talk slide 14 partitioning admin 7 july 2005 208am  ',0),(123,'und','node_search',' yaffs talk slide 15 garbage collection and threads yaffs talk slide 15 garbage collection and threads admin 7 july 2005 209am  ',0),(124,'und','node_search',' yaffs talk slide 16 ecc yaffs talk slide 16 ecc admin 7 july 2005 210am  ',0),(125,'und','node_search',' yaffs talk slide 17 os portability yaffs talk slide 17 os portability admin 7 july 2005 211am  ',0),(126,'und','node_search',' yaffs talk slide 18 yaffs in use yaffs talk slide 18 yaffs in use admin 7 july 2005 213am  ',0),(127,'und','node_search',' yaffs talk slide 19 embedded system use yaffs talk slide 19 embedded system use admin 7 july 2005 121pm  ',0),(128,'und','node_search',' yaffs talk slide 20 embedded system use yaffs talk slide 20 embedded system use admin 7 july 2005 122pm  ',0),(129,'und','node_search',' yaffs talk slide 21 embedded system use yaffs talk slide 21 embedded system use admin 7 july 2005 130pm  ',0),(130,'und','node_search',' yaffs talk slide 22 embedded system use yaffs talk slide 22 embedded system use admin 7 july 2005 131pm  ',0),(131,'und','node_search',' yaffs talk slide 23 performance examples yaffs talk slide 23 performance examples admin 7 july 2005 133pm  ',0),(132,'und','node_search',' yaffs talk slide 24 performance caching yaffs talk slide 24 performance caching admin 7 july 2005 134pm  ',0),(133,'und','node_search',' yaffs talk slide 25 jffs2 and yaffs comparison yaffs talk slide 25 jffs2 and yaffs comparison admin 7 july 2005 135pm  ',0),(134,'und','node_search',' yaffs talk slide 26 licensing yaffs talk slide 26 licensing admin 7 july 2005 136pm  ',0),(135,'und','node_search',' yaffs talk slide 27 yaffs2 yaffs talk slide 27 yaffs2 admin 7 july 2005 137pm  ',0),(136,'und','node_search',' yaffs talk slide 28 yaffs2 comparison with yaffs1 yaffs talk slide 28 yaffs2 comparison with yaffs1 admin 7 july 2005 139pm  ',0),(137,'und','node_search',' yaffs talk slide 29 fin yaffs talk slide 29 fin admin 7 july 2005 142pm  ',0),(169,'und','node_search',' emdebsys talk slide 1 title emdebsys talk slide 1 title admin 19 october 2005 437pm  ',0),(196,'und','node_search',' armlinux talk slide 1 title armlinux talk slide 1 title admin 20 october 2005 1227am  ',0),(265,'und','node_search',' creating a filesystem on your compact flash creating a filesystem on your compact flash admin 11 november 2005 633pm  ',0),(271,'und','node_search',' jtag and jflashlinux jtag and jflashlinux admin 11 november 2005 639pm  ',0),(274,'und','node_search',' compiling a kernel compiling a kernel admin 11 november 2005 641pm  ',0),(285,'und','node_search',' the filesystem the filesystem admin 11 november 2005 651pm  ',0),(323,'und','node_search',' maps maps admin 22 november 2005 518pm  ',0),(325,'und','node_search',' about us about us admin 30 november 2005 404pm yaffs is a product from aleph one ltd the company was started in 1971 the name aleph one was chosen to be nonspecific we started selling computer products in 1984 when we were using biofeedback instruments to control video games on acorn bbc microcomputers this led to the development of processor cards for acorn computers which had their own unique operating system which could run the dos and windows operating systems acorn users ran windows applications in a window when acorn left the computer market in 1998 we used our knowledge of other operating systems to move into linux and then into embedded linux we have developed the yaffs file system specifically to provide a robust journalling file system for nand flash chips and it is now widely used in highvolume products around the world visitors we are happy to welcome visitors though our premises are not a shop please contact us to make an appointment and let us know what you would like to talk about or look at  staff core staff managing director mr laurie van someren charles manning chief yaffs architect jenny hopkins tech support our name aleph is the name of the first letter of the hebrew alphabet a german mathematician active in the mid19th century georg cantor 18451918 realised that infinities came in different sizes more precisely he showed that the infinite set of all integers was smaller than the infinite set of all real numbers and gave the labels aleph null to the smaller and aleph one to the larger set j w dauben writing in scientific american  june 1983 112121 said the choice of aleph as a label for transfinite sets was particularly clever as cantor was pleased to admit because the hebrew aleph was also a symbol for the number 1 since the transfinite cardinals were themselves infinite unities the aleph could be taken to represent a new beginning for mathematics the concept of alephs is the subject of a successful book by amir d aczel called the mystery of the aleph paperback about 10 in the uk isbn 743422996 we do not sell it  vat we are not registered for vat and so our prices do not include it  ',0),(342,'und','node_search',' fuel embedded database for use with yaffs fuel embedded database for use with yaffs db fuel and yaffs team up to offer new generation of database and flash memory solutions for developers of mobile handsets and consumer electronics revolutions in flash memory technology have greatly increased the practical uses of flash technology aleph one ltd a british company focusing on embedded device development has released yaffs a superior file system for storing data on flash ittia is partnering with aleph one to provide the best data solution for embedded devices requiring persistent storage the companies have confirmed compatibility between their product lines and will work together to promote the use of their technologies mobile devices and embedded systems that need to store persistent information have a limited number of choices the shock resistance power usage and smaller form factor makes flash memory a superior storage medium in most cases however developers using flash face some unique challenges for example too many writes to the same location on the flash disk can render that location inoperable developers must take these and other characteristics into consideration in order to help developers overcome these challenges yaffs can either be used as a filesystem driver in the operating system or be linked directly with fuel to bypass the operating system even if no operating system is available this arrangement ensures that data is stored in an optimal format to take advantage of flash memory we developed yaffs to provide a high reliability high performance embedded file system on nand flash and are delighted that yaffs has been selected by ittia as a partner for their fuel database said laurie van someren aleph one s general manager we believe the products combine to provide a highly effective embedded data storage solution and look forward to further cooperation and developments fuel has been designed with enough flexibility to support the unique circumstances faced by embedded developers such as persistent storage on a batterypowered unreliably powered device because fuel is fast and smallfootprint it is a perfect match for mobile devices and embedded systems ittia and aleph one are a natural match for other reasons as well both companies have a commitment to provide topnotch support at whatever level the customer needs and can provide development services and support to ensure an optimal solution we begin 2006 by emphasizing on meaningful business relationship and we are delighted to announce our solution offering with aleph one said sasan montaseri president of ittia in bellevue wa aleph one has served the embedded market for many years and our total solution add special value to our customers for more information about fuel visit wwwittiacom fuel fuelhtml  for more information about yaffs visit wwwyaffsnet laurie 31 january 2006 1039am  ',0),(344,'und','node_search',' yaffs overview yaffs overview yaffs is a filesystem designed specifically for the characteristics of nand flash its wellproven primary features are fast typically much faster than alternatives easily ported currently ported to gnu linux wince ecos psos vxworks and various baremetal systems log structured providing wearlevelling and making it very robust supports many flash geometries including 2kbyte and 512byte page nand flash chips supports mlc and slc flash very fast mount almost immediate startup typically uses less ram than comparable file systems flexible licensing suitable for most circumstances there is a great deal of information about yaffs available on this site this page indexes that information and provides an overview of the product yaffs is currently at version 2 yaffs2 supports 2kbyte page flash as well as 512byte page flash yaffs1 only supports the original 512byte page flash and is now in maintenance mode there is a minimal subset of the filesystem called yaffs direct or the yaffs direct interface which is intended to be used in embedded systems and can be licensed for use in proprietary systems yaffs is available to all under the gpl for use or evaluation full details of git access are  available yaffs 1 and 2 have both been deployed in numerous commercial applications some in high volume abd with large flash arrays it has been used in phones most notably android phones gps receivers train controllers speech synthesisers voip chip development kits and other applications we have a number of documents and papers describing how to use yaffs how to customise it for your particular hardware system and the original considerations and filesystem design of the two versions backgrounder the best overview information is currently this 28slide presentation  what it does and how it does it a useful historical timeline on development is here developer documentation yaffs direct interface  user guide  describing how to port yaffs to an embedded environment or rtos using the ydi personality module brief notes on how to use it on gnu linux a memory footprint analysis putting some numbers on low memory footprint  yaffs embedded structure papers the starting state of nand mtd which caused the yaffs filesystem to be designed the specifications are available development notes describing the filesystem design decisions and data structures for yaffs1 yaffs2 filesystem design  covering changes from yaffs1 efficient initialization and crash recovery for logbased file systems over flash memory  describing a mechanism for avoiding full flash scans even when not properly shut down this is a likely future development mailing list there is a yaffs mailing list for the development and discussion of yaffs it s a fairly lowtraffic list you will be emailed and asked to confirm your subscription request you can also browse and search the yaffs mailing list archives  wookey 29 june 2006 230am  ',0),(345,'und','node_search',' yaffs gpl licence yaffs gpl licence laurie 10 july 2006 135pm yaffs is the property of aleph one limited yaffs is available free of charge under the gnu general public licence   version 2 gpl linking yaffs to other software creates a derived work and our interpretation of linking includes dynamic and runtime linking any use of yaffs creates a derived work under the gpl you can test yaffs with your product on your computers do not distribute this test version unless your product is normally licensed under the gpl if you do not copy and distribute it there are no requirement under the gpl regarding distribution of a derived work under the terms of the gpl derived works must be licensed using the gpl unless you have a commercial licence for yaffs when you distribute gpled object code you must make the full source code available too to anyone who uses your product sections 3a and 3b of the gpl and the sections that follow circumstances where you need to licence yaffs other than under the gpl include if you want to use yaffs but want to distribute your code under your licence if you want to run a staticallylinked commercial rtos on top of a yaffs filesystem if you want to sublicence yaffs to your customers under terms other than the gpl if you want to use yaffs with windowsce version 4 wince version 3 can use gpl code but wince v4 and later need an additional filesystem interface layer which is not part of yaffs this is available at extra cost please contact us in these cases our commercial licence is appropriate if you aren t sure whether your needs will be covered by the gpl version  get in touch with us  support while yaffs is released under gpl we can provide standard support options consulting in its application to your particular product or development of specific features to suit your needs or hardware  helping us to improve yaffs although the code is downloadable at no charge buying this product allows you to express your appreciation of yaffs alternatively you can make a donation to aleph one ltd via paypal you can do this at paypal by sending any sum to sales aleph1couk  we shall appreciate it  ',0),(347,'und','node_search',' yaffs the nandspecific flash file system introductory article yaffs the nandspecific flash file system introductory article wookey 26 july 2006 211pm written by charles manning originally published at linuxdevicesorg sept 20th 2002 phb summary yaffs stands for yet another flash file system as far as i am aware yaffs is the only file system under any operating system that has been designed specifically for use with nand flash yaffs is thus designed to work within the constraints of and exploit the features of nand flash to maximise performance yaffs uses journaling error correction and verification techniques tuned to the way nand typically fails to enhance robustness the result is a file system that exploits lowcost nand chips and is both fast and robust yaffs is highly portable and runs under linux uclinux and windows ce yaffs is an open source project why nand flash  embedded and mobile systems are increasingly using nand flash for storage because it has various advantages over other storage technologies as always though life is a compromise and those advantages come with some limitations that need to be addressed to provide a robust flash file system hard disks are not a viable storage option for many embedded and handheld systems because they are too big too fragile and use too much power for some years now people have been using commonold nor flash for file system storage jffs and jffs2 do an excellent job of this for linux for storage applications nor flash is not that great because it is not very dense ie not much storage per chip is costly and is slow to write nand flash on the other hand is low cost dense and writes fast but has other limitations the most common consumer usage of nand flash is on smartmedia cards which are just nand chips bonded to a carrier card consumer use of smartmedia is driving down nand prices while driving up densities the standard smartmedia file system is fat based and is thus liable to corruptions due to power failures crashes and other acts of demonic forces this raises robustness concerns particularly in embedded systems where a corrupted file system can kill the device what s really needed is a journaling file system that is able to work around the limitations of nand and exploit it for best performance history the leadup to yaffs started with an investigation into modifying the jffs2 flash file system to work with nand flash for some aleph one customers it seemed reasonable that the best way to get a file system for nand flash would be just tweaking an existing flash file system on deeper investigation it became apparent that designing a new file system specifically for nand might have some benefits nor typical varies a lot nand density up to 32mb chips currently 256mb and growing cost per mb 1 2 25c access random page oriented with spare area on each page sequential access within a page programmability can modify a single bit very limited reprogramming read speed 50100ns 10us page seek 50ns per byte program time 5us per byte 200us per page erasure time 1s per 64kb block 2ms per 16kb block reliability relatively immune to corruption no bad blocks needs error correction bad blocks marked when shipped designing an effective flash file system is a difficult task and you need to jump through many hoops of fire to get a useful system although both are called flash nor and nand flash have very different properties thus a flash file system that works with nor incorporates various mechanisms that are not required for nand and nand needs extra mechanisms not required for nor for example garbage collection performance is largely determined by the erasure time nor erases very slowly and thus an effective nor garbage collection strategy is relatively complex and limits the design options in comparison nand erases very quickly thus these limitations don t apply another major difference is that nand is shipped with marked bad blocks on the device while nor chips are shipped defect free thus one expects to encounter some failures in nand and should design accordingly this lead me to believe that it would be worth designing a file system specifically for nand flash exploiting the features of nand to simplify the design and catering to nand specific limitations directly rather than trying to bend nand to work with an existing file system architecture or vice versa the first conceptual design for yaffs was drawn up in late december 2001 once the customers bought in to the idea things progressed rapidly the first line of code was cut in january 2002 by may 2002 we had the first publicly available cvs code we now have at least six different companies using or experimenting with yaffs in embedded or handheld systems yaffs is already very stable and is converging rapidly we expect to see yaffsbased products shipped before the end of the year design approach rather than develop and debug code inside the linux kernel i took the approach of developing the file system guts algorithms the most complex part in a user space program to achieve this the code is split into four sections yaffsguts the file system algorithms this code is fully portable c yaffsfsc interface layer to the linux vfs can be replaced with a test harness for user space developing of yaffsgutsc nand interface wrapper layer between yaffsguts and the nand memory access functions eg calls linux mtd layer or ram emulation layer portability functions wrapper functions for services such as memory allocation etc this modular design has provided a lot of flexibility for testing and development a user space program and ddd is a far more rapid development environment than continually changing the linux kernel also a rambased nand emulation layer provides an excellent way to debug the file system inkernel without special hardware a further spinoff has been that yaffs is portable to other operating systems for example a port of yaffs for windows ce was readily achieved by writing a new wrapper layer to hook up to the wince file system manager and new nand access layer yaffsgutsc remains 100 portable yaffs is thus likely to be easily portable to other oss too results removing surplus constraints has lead to a simpler design that has improved performance and robustness as well and reduced development time yaffs reads and writes pretty fast there is no significant hit due to garbage collection ie in most situations garbage collection overheads would not impact usage it is difficult to give meaningful benchmarks given nonstandard hardware however herewith some results achieved on a strongarmbased board with 128mb of nand flash write speed is approx 800kb per second and read speed is approx 15mb per second in a weekend stress test i wrote tripleverified then deleted 25gigabytes of file data without a single bit of file data being corrupted 25gb exceeds the design lifetime of most embedded or handheld devices future although yaffs already performs well there is still a lot of room for improvement development is continuing to enhance performance and robustness as well as add support software such as utilities bootloader support and analysis tools i expect to see ports to other oss too increasing the user base of yaffs is an important way to get more eyes over the code and test it under a wider set of scenarios the yaffs development community is growing well with good involvement from people all over the world yaffs is realising all the benefits open source projects hope for and will we expect continue to grow resources the yaffs project home page is http wwwaleph1couk yaffs  this provides further yaffs documentation and instructions for git access and the yaffs mailing list footnotes   the yaffs name came from the first concept document proposing yet another flash file system some how that name just stuck nand support has since been added to jffs2 by others the yaffs jffs2 and mtd communities cooperate to provide a rich flexible set of solutions to draw from as is the nature of open source projects jffs2 code was used as a reference for some parts of the yaffs development particularly for figuring out the vfs interface google for further info on jffs2 and mtd some features were added to the guts to enhance wince usage for example the string comparison function was made configurable to be either strcmp or scricmp because windows file names are case insensitive bio charles manning aka the embedded janitor lives near christchurch new zealand and has been developing and mopping up embedded systems for twenty years his hobbies include fly tying and spinning wool charles can be reached at charles aleph1couk   ',0),(348,'und','node_search',' yaffs1 memory footprint yaffs1 memory footprint wookey 26 july 2006 357pm yaffs claims a low memory footprint but what exactly does that mean how low is low calculating an exact footprint is no easy task there are many dependencies here is an approximation for yaffs1 on linux assuming the standard block size of 512bytes per page and 16kb per block code size this is dependent on various factors including cpu choice optiomisation options etc as a rough guide the yaffso linux module for x86 is around 55kbytes this could be made smaller by stripping the debug text and ecc code if you don t need that runtime data structures some of these are fixed size and others are generated in runtime and change as your file structures change as a rough guide though i will give the following each yaffs partition needs a device structure of less than 1kb approx 24kb stack with the current implementation if shortopcaches are enabled then 524 bytes per cache entry 5 to 10 is a good number about 120 bytes per file with short name caching enabled about 4 bytes per block of nand ie about 128 bytes per mb of nand about 4kbytes of ram per mb of nand for building the file tnode trees that are used to locate the data chunks thus for a system using a 64mbyte nand and say 500 files you can budget on approx 1 55kbytes 2a 5kb 2b 3kb 5 cache entries 2c 60kb 2d 16kb 2e 256kb total 410kbytes the last item the tnodes is the biggest expense in yaffs this can be reduced significantly by using a larger page size there are some opportunities to tune some of these numbers so please feel free to discusss further if required  ',0),(351,'und','node_search',' yaffs debugging yaffs debugging wookey 15 september 2006 1032pm how to control debugging in yaffs yaffs provides a debugging mechanism which can be controlled at runtime if you have access to proc normally via a shell if you need to trace things before you get to a shell then you can set default trace options at compile time available trace flags name c define bitmask value error yaffs traceerror 0x00000001 os yaffs traceos 0x00000002 allocate yaffs traceallocate 0x00000004 scan yaffs tracescan 0x00000008 badblocks yaffs tracebadblocks 0x00000010 erase yaffs traceerase 0x00000020 gc yaffs tracegc 0x00000040 write yaffs tracewrite 0x00000080 tracing yaffs tracetracing 0x00000100 deletion yaffs tracedeletion 0x00000200 buffers yaffs tracebuffers 0x00000400 nandaccess yaffs tracenandaccess 0x00000800 gcdetail yaffs tracegcdetail 0x00001000 scandebug yaffs tracescandebug 0x00002000 mtd yaffs tracemtd 0x00004000 always yaffs tracealways 0x40000000 bug yaffs tracebug 0x80000000 flag meanings the flags cover possible debugging messages from various aspects of the filesystem initial scanning mtd interface writing nand access garbage collection os interaction etc turning on everything results an awful lot of trace info so it is usually best to just enable a few relevant flags setting flags at runtime the flags can be set or cleared by echoing the name of the flag into proc yaffs with a or echo oswrite proc yaffs it can be set to to all or none using and then flags can be added or removed echo none os write proc yaffs and you can use numerical values if you are so inclined using standard c format echo 0xf00001 proc yaffs so echo all proc yaffs will turn all tracing on note that you only see the output showing you the current trace state if the always yaffs tracealways flag is set so to see what you are doing do this echo always proc yaffs setting flags at compile time flags can be set in the code at compiletime by setting yaffstracemask in yaffsfsc add new flags to always and badblocks which are set by default  ',0),(353,'und','node_search',' yaffs licence faqs yaffs licence faqs do we need a licence for yaffs  yaffs is and will remain free of charge from our web site  you can grab the latest version and work and test and play with it without charge it comes with a gnu general public public licence version 2  http wwwgnuorg licenses gpl20html  as usual with gpl work if you sell or distribute work embodying yaffs you also have an obligation to disclose your associated source code to anyone who asks what if we link other code to yaffs  the gpl obligation is not affected by the kind of linking between yaffs and any associated code nor is it affected by your disclosure of modifications you make to the code and release back into the main line for example if you use yaffs under gpl with linux you should treat it just the same as linux code if you want to publish a patched kernel please do we do not want to disclose source code because aleph one limited created and owns yaffs we can sell you a licence to use yaffs which does not have the gnu gplv2 obligations such a licence is always perpetual worldwide nonexclusive and free of any continuing royalty obligations it is paid for by a single fee at the time of signing a licence agreement between you and aleph one the fee depends on the number of distinct products in which yaffs will be used and there is a base price of gbp 10000 if more than one product is included in the same licence there is usually a reduction in the second fee what do we do next  tell us some more about the product you will use yaffs in we like the agreement to contain a brief description of the hardware involved and the part number or product name and any internal code name if you want us to sign a nondisclosure agreement before you give us these details send it to us we are used to signing them we can send you a standard form if you do not have one then we will send a draft agreement and price to you and negotiate until we are both satisfied next we each sign and exchange copies of the agreement and you pay us what happens when we sign a licence  when we have both signed a licence agreement and you have paid us we provide you with a tarball of files whose headers show that this code is under a proprietary licence which you have bought from us you use these files to create the fs code you embed in your products is there more information about licensing  yes there is more detail about the definition of a product is given i n our sample commercial licence  notes which give  further background and detail about our licensing  laurie 17 may 2007 554pm  ',0),(357,'und','node_search',' yaffs a flash file system for embedded use yaffs a flash file system for embedded use yaffs yet another flash file system is an opensource file system specifically designed to be fast robust and suitable for embedded use with nand and nor flash it is widely used with linux rtoss or no os at all in consumer devices it is available under gnu public license gpl or on commercial terms from aleph one admin 30 june 2007 1001am  ',0),(358,'und','node_search',' the internal history of yaffs the internal history of yaffs admin 30 june 2007 628pm  ',0),(359,'und','node_search',' comparison between yaffs yaffs2 and jffs2 comparison between yaffs yaffs2 and jffs2 on friday 2 march 2007 1059 charles f johnson wrote i m trying to understand the relative merits of jffs2 vs yaffs2 the response on the yaffs mailing list is quite positive as far as leading me to believe that there are actual products shipping charles manning replied at a technical level it is very difficult to make x vs y comparisons because there are many factors involved which manifest differently on different systems therefore your mileage will vary but as a general rule of thumb the following might help 1 yaffs uses less runtime ram to hold its state so yaffs scales better than jffs2 there are quite a few systems using large nand arrays the largest partitions i know of are around the 6gbyte mark 2 yaffs garbage collection is simpler and faster typically making for better performance under hard writing 3 yaffs uses a whole page per file for headers and does not provide compression this means that jffs2 is probably a better fit to small partitions the flip side is that a lot of data eg mp3 does not compress very well and enabling compression really hurts performance 4 while yaffs has been used on nor it does not fit very well because yaffs does not use erase suspend thus if you re using smaller nand partitions and using jffs2 on nor then a jffs2only solution is very appealing all the above can generally boil down to if you re using less than about 64mb the pain vs gain might play in favour of jffs2 as you increase partition size yaffs makes more and more sense admin 1 july 2007 1137pm  ',0),(360,'und','node_search',' paper investigating a log management crash recovery mechanism paper investigating a log management crash recovery mechanism this paper proposes a method for efficient initialization and crash recovery for flashmemory file systems a log management scheme for the flashmemory file systems is presented the proposed log management method is implemented in a logrecord manager and a logger it was written by chinhsein wu teiwei kuo and lipen change of the department of computer science of national taiwan university taipei taiwan and presented at an international sac conference in 2006 copyright 2006 acm 1595931082060004 admin 2 july 2007 1218pm  ',0),(363,'und','node_search',' the old courthouse the old courthouse admin 10 october 2007 521pm  ',0),(365,'und','node_search',' paying us paying us laurie 18 december 2007 428pm  ',0),(366,'und','node_search',' yaffs embedded structure yaffs embedded structure admin 20 december 2007 1130am  ',0),(367,'und','node_search',' yaffs talk pdf of slides from celf 2007 yaffs talk pdf of slides from celf 2007 yaffspdf 17347 kb admin 31 january 2008 221am attached is a pdf with slides from the yaffs talk at celf s embedded linux conference europe 2007 if you are able to view ogg theora video files the talk is also online  ogg theora is a free video format free players are available for all platforms see the list here  if in doubt vlc is probably available for your operating system if you prefer to go straight to the pdf if clides click http wwwyaffsnet sites yaffsnet files yaffspdf ',0),(368,'und','node_search',' ideas list ideas list laurie 5 march 2008 351pm  ',0),(369,'und','node_search',' yaffs porting guide yaffs porting guide version 20 last changed rrw kynesimcouk 20090320  purpose the purpose of this document is to describe how to bring up yaffs2 on a board previously unsupported using the yaffs direct interface with an example using ecos on a balloon board before we start you probably want to have the data sheet for the nand chips you are using in front you so that you can refer to it as we go along background and nand flash properties nand flash is generally arranged in pages and blocks  a page contains a section of data bytes and then a section of outofband  oob  data bytes blocks contain a number of pages  the oob section of each page is used keep track of various things like file system state error correction data and bad block marking nand flash is programmed written to and read on a largely page basis though with some level of random access and is erased on a block basis that is to erase a page you must erase the rest of the containing block along with it when programming nand flash only 1 s can be programmed to  s so to change a byte containing 0x00 to 0xff it must be erased along with the rest of the block however subsequent programs may still be made without an erase if no 0s are to be changed to 1s this might be useful in a scenario where subsequent data might regularly have this property when manufactured nand flash contains bad blocks these are blocks that are not reliable and any data in them will commonly corrupt easily these must be kept track of and the oob data section is used to mark a bad block nand in general is prone to bit errors and for that reason the oob data is also used to write error correction codes ecc so that some errors can be corrected yaffs nand model it is probably a good thing to detail at this point how yaffs2 expects the nand to behave so that you are aware of what you have to provide in the nand driver to get yaff running yaffs uses some different terminology in that it refers to a page as a chunk  yaffs2 uses a fairly abstract model for nand flash this allows a lot of flexibility in the way yaffs can be used yaffs is designed for nand flash and makes the following assumptions and definitions nand flash is arranged in blocks each block is the same size and comprises an integer number of chunks each block is treated as a single erasable item a page chunk equates to the allocation units of flash all accesses reads and writes are page chunk aligned when programming a nand flash only the zero bits in the pattern being programmed are relevant and one bits are don t care for example if a byte already contains the binary pattern 1010 then programming 1001 will result in the pattern which is the logical and of these two patterns ie 1000 this is different to nor flash yaffs identifies blocks by their block number and chunks by their chunk id yaffs treats a blank 0xff filled block as being free or erased thus the equivalent of formatting for a yaffs partition is to erase all the blocks that are not bad therefore yaffs minimally needs access to functions that enable it to erase blocks and to read and write on a page basis it is also helpful to be able to read only oob data as reading writing a full page to only view update oob data will cost many serial read cycles over the bus this is an overhead that can be avoided using the random access read and write features of some nand chips  writing a driver for nand flash chips writing a driver for the samsung 628 k9f2g08u0m pcb0 on the balloon board v301  for the balloon board the nand chips hang off the cpld which is in turn hooked up to the system bus this is quite board specific and in this case reading the vhdl code reveals how to change the values on the pins of the nand chips you may look at the code by downloading the balloon source code appendix a and looking at balloon3vhd and balloonnandvhd in balloon vhdl fpga it will be likely that this is significantly different on your platform and you should consult the relevant data sheets and documentation to determine how to access the nand hardware on your board i will present an example of the balloon board in order to give an overview of the kind of thing that is required on the balloon the cpld routes data on the bus with certain address to the logic on the cpld that actually controls the flash chips they are as follows nand data bus 0x10e00000 nand control 2 0x10e00010 nand control 0x10e00014 sending data to the nand data bus address will put that data onto the i o pins of the nand chips all of the nand chips are hooked up to the same pins on the cpld so writing to the nand data bus address will put the value written on the i o pins for all of the available flash chips to isolate the chip you want to work with using the chip enable pin on each flash chip this is done by writing to the nand control 0x10e00014 address when writing to nand control the cpld takes the data value on the bus and routes each bit to a different wire this bit field is structured as follows  pin attached to bit in nand control value cle control latch enable  ale address latch enable 1 nce0 not chip enable for chip  2 nce1 for chip 1 3 nce2 for chip 2 4 nce3 for chip 3 5 nse not chip enable for chip  6 nwp not write protect 7 so for example bit 1 on the data lines is put onto the ale pin on the physical chip bits prefixed with n are active low for example chip  is selected when nce0 is low and nce13 are high so writing to nand control we can change the values of the pins on the flash again cle ale nse and nwp change the value of the corresponding pin on all the flash chips available nce 3 will select the chip you are using finally nand flash typically comes in couple of flavours 8 bit wide x8 and 16 bit wide x16 this means that x8 chips have 8 i o pins and x16 have 16 the logic on the cpld on the balloon can handle both if you tell it which you are currently dealing with writing to nand control 2 a value of 1 puts the cpld logic for the nand chips into x8 mode and  into x16 mode i will assume for the rest of this document that there are only x8 chips connected to the balloon but it should be fairly trivial to extend it to support both using the flash chips the flash chips we re using have a number of commands each triggered by a sequence of one or two command codes you will want to refer to the data sheets for precise details of these functions but i will briefly describe some of them in this document the command set that we have for the particular chip we re using is table 1 on page 7 of the data sheet to input a command there is generally one or two command input cycles for two cycle commands there is generally an initial command followed by some data needed to complete the command then another command cycle to notify that the relevant data has been input and to start execution for example for read operations the command 0x00 is latched in followed by some address input cycles followed by the command 0x30 to start the operation with this in mind i will now describe how to input commands the command latch cycle note that for this section i have assumed that the bus is sufficiently slow that the setup and hold times are not an issue if you have a fast bus then you may have to wait for a small amount of time refer to the data sheet after changing values on the pins by writing to the correct address so that setup and hold times are not violated command latch cycle for the command latch cycle you need to first select a chip by setting the relevant nce low and then you need to set the cle bit high that means writing to the nand control address ale must also be low and should be set at the same time as cle it is then a case of putting the command value onto the i o pins by writing to the nand data bus address the value of the command you want this will then latch in the command afterwards you will need to clear the cle bit again you will also notice from looking at the data sheet that something needs to be done with the nwe not w rite e nable pin specifically it should be low while latching in the command but that i have yet to describe a mechanism for changing its value this is because it is dealt with by the logic in the cpld and whenever data is sent to the data address the cpld will toggle nwe appropriately this is also true of nre not r ead e nable when reading this process is implemented in the nandchipselect and the sendcommand functions flashc  address latch cycle and addressing the process for the address latch cycle is similar to that for command latching with the sense of ale and cle reversed and can be looked at in the data sheet and is implemented in sendaddress in flashc the addressing is done by row and column there are 5 address cycles on the flash chips we re looking at the first cycle contains bits 7 of the column address the second bits 811 with the remaining bits of the byte to be sent low the row address is over 3 more cycles in a similar fashion you may wish to chose to address the individual bytes of the chip with the oob data not directly addressable this has enabled me to lump several chips into the same address space and select the correct chip based on the address addresses then need to be converted to row and column you should also check that they are page block aligned in the relevant places if that s what your functions expect it needn t be done this way any you could use page numbers instead of bytes just as easily  the row is essentially the page index and the column is the index into to that page so if you wanted to read from the start of page 213 you would send  for the column and 213 for the row conversely if you wanted just the oob bytes from the same page you would send a column value of 2048 given a page size of 2048 64 bytes    finding chip information you will then need to find out which chips are active eg on the balloon there are 4 possible chips not all of which will exist and what type of chips they are for this there is the read id operation this operation is implemented in the readids function in flashc the result of the operation gives the manufacturer and device code of the chip and information about the chip page size block size oob size etc to find which chips are available loop through the possible chips and start a read id command on each of them if the expected data is returned then there is a chip at that location the operation is started by sending the command 0x90 and then one address cycle of 0x00 there are then 5 read cycles which give you data about the device a description of how to unpack this information from the returned bytes is located on page 32 of the data sheet for the chip described here this then gives you how many chips you have and what layout the data in them has bad block checking contained within a nand chip are blocks that the manufacturer will not guarantee the reliability of this is to increase yield in manufacturing and so bad blocks must be kept track of the samsung chips come with the first byte or word for x16 of the first and second page of each bad block not programmed as 0xff this bad block marking should be maintained and should be added to in the same way when a bad block is is discovered yaffs will expect you to provide a function it can call to mark a particular block as bad when yaffs decides it is necessary yaffs keeps track of bad blocks itself so that the driver doesn t need to worry about masking out bad blocks erasing a block an example of this operation is given in nanderaseblock in flashc if you are addressing the nand by bytes then you must first check that the address is aligned to the start of a block and then convert the address into a block number if there is more than one chip this will involve working out which chip the address refers to and then selecting the correct chip this can be seen in the selectchip function in flashc you must then send the first command cycle for the erase operation before sending 3 cycles of address and then finally the last command cycle for the erase operation the 3 address cycles are different than for the read write operations only address bits a18 to a29 is valid for x8 while a12 to a17 is ignored in terms of the ordinary 5 cycles address input you only need to deal with the last 3 cycles and of those only the highest 2 bits of the 3rd cycle are used and the full 4th and 5th cycle are used once the operation has been started the program can check the progress of the operation by sending a command of 70h each subsequent read will contain the read status the driver should wait until the read is complete by the read status operation the read status operation also contains information about whether the erase failed and this information should be returned from the function doing the erase reading a page reading a page is performed by first selecting the correct chip and then converting the address to a row and column number you can then sending the first command cycle for the read operation followed by 5 address cycles as described in the previous sections the second command cycle then starts the read operation the driver must then wait for the data to be retrieved into the data registers on the nand before they can be read out over the bus for the example chip this is 25us consult the data sheet as this may differ the data can then be read out sequentially byte by byte until all the data needed is obtained writing a page page program operations are performed by first selecting the correct chip converting the address to row and column numbers the page program operation is initiated by the relevant fist command latch cycle command 0x80 followed by an address latch cycle as for read serial data loading and then the second command latch cycle command 0x10 the serial data loading is done by serially writing data to the i o pins up to 2112 bytes x8 can be loaded into the data registers once the second command cycle is sent the program is initiated and there is then a programming period where the loaded data is programmed into the appropriate cell the driver should wait for this to complete by issuing a read status command 0x70 and monitoring the r nb ready not busy bit the r nb flag is on i o pin 6 and can be checked by repeatedly reading from the nand data bus address once the operation is complete the write status bit i o  may be checked to confirm that the operation was successful yaffs how to use yaffs checking out from git the first thing to do is to obtain the source code for yaffs this can be done from cvs details of the process can be found at http wwwyaffsnet downloadyaffsusinggit  the following command will checkout the latest git version using public readonly access if you are using bash git clone git wwwaleph1couk yaffs2  making some tweaks to the source code as of the latest version from cvs in january 2009 you will need to make a small number of changes before you can compile the source code without errors and warnings there is a patch file included with this document you will need to provide a definition of lofft in yaffs2 direct ydirectenvh this is for holding the file size in bytes you should make it big enough to hold the largest file size you wish to support unsigned long is probably a good place to start you will need to edit yaffsfsc to change a if to a ifdef then if you have the relevant warnings and werror switched on you will need to correct a couple of printf format strings to get the type right changing a few d to ld change yaffs ydirectenvh typedef unsigned long lofft change yaffs2 direct yaffsfsc line 1117 if configyaffswince ifdef configyaffswince relevant files to the direct interface there are quite a few files that get checked out not all of which you will need to get going with the yaffs direct interface the ones you will actually need are listed bellow you do not need to compile the rest in direct yaffsfsc yaffsgutsc direct yaffscfgc yaffsnandc yaffstagsvalidityc yaffscheckptrwc yaffsqsortc yaffstagscompatc yaffseccc yaffspackedtags2c some relevant preprocessor flags there are many different configuration options for yaffs here are a few that you should be aware of for using the yaffs direct interface configyaffsdirect tell yaffs to use the direct interface configyaffsyaffs2 tell yaffs we want to use yaffs2 configyaffsprovidedefs provides some definitions for file types and includes linux typesh linux fsh linux stath see yaffs2 devextrash configyaffsfsprovidevalues this may be used so that you can customise error values and constants like ordonly to match the underlying system values if itis not defined then it includes errnoh sys stath and fcntlh see yaffs2 direct yaffsfsh specify these options when compiling yaffs ie dconfigyaffsdirect etc configuring you will then need to provide yaffs with configuration information this includes details about the nand flash you are using and also tells yaffs which functions to call when when it wants to read write erase parts of the flash these functions will form the bridge between yaffs and the underlying hardware driver this customisation is done in yaffscfgh within yaffscfgh you will need to provide a number of operatingsystemlike functions and a function to initialise yaffs for example providing functions for malloc and free here is a breakdown of those functions that need to be implemented operating system functions void yaffsfsseterror int err report system errors for example using errno if it exists void yaffsmalloc sizet size void yaffsfree void ptr as for the standard malloc and free functions if they already exist on your system then you can just shim them void yaffsfslocalinitialisation void void yaffsfslock void void yaffsfsunlock void use yaffsfslocalinitalisation to initialise real time operating system state if the system is multithreaded then it should initialise a semaphore mutex for use by lock and unlock lock unlock should use the semaphore set up in localinitialisation to lock yaffs from multithreaded access u32 yaffsfscurrenttime void this can be any time increment of use to the system if this is not required then it is fine to just use a function that returns zero yaffs startup function int yaffsstartup void return value yaffsok or yaffsfail this functions should be used to provide yaffs with many details about the properties of the underlying nand device within this function you will need to set up a yaffsdevice yaffsgutsh and a yaffsfsdeviceconfiguration direct yaffscfgh how to set up a yaffs device will follow in the next section once you have set up the required yaffsdevice structures you should call yaffsinitialise yaffsgutsh with a pointer to a null terminated array of yaffsdeviceconfiguration structures a yaffsdeviceconfiguration structure contains a pointer to a yaffsdevice and the mount point string prefix that that device corresponds to yaffs devices a yaffs device is a logical device that represents part of or a whole physical device you might think of it as a partition on the nand for example it might cover the whole of the nand device or perhaps only claim half with another yaffsdevice claiming the other half it may also be used so that you can use a device other than a flash device eg ram for testing purposes a yaffsdevice keeps track of the start and end block so you may have more than one yaffsdevice corresponding to the same physical device by altering the start and end block of the yaffs device the fields on the yaffsdevice struct that you need to set up yourself are listed below all other fields are setup automatically by yaffs int ndatabytesperchunk as the name suggests this is the number of bytes per chunk remembering that in yaffs terminology a page is referred to as a chunk this is then the number of bytes per page this is the number of data bytes that is the number of bytes excluding the oob byte data eg if a page is 2048byte 64bytes of oob then set ndatabytesperchunk to 2048 int nchunksperblock straightforwardly the number of chunks pages on the nand in each block on the physical nand device must be at least 2 int sparebytesperchunk this is the size of the spare area ie the number of oob bytes per chunk page int startblock the block number not the address in bytes on the chip of the first block of this logical yaffsdevice beware yaffs needs the first block to be free so you should not set this to  if it is then yaffs will add on one to it itself and also add on one to the end block which could be an issue if you wanted your device to start at block  and finish at the last block which might mean yaffs trying to write to a nonexistent block int endblock the block number on the chip of the last block for this logical yaffsdevice if startblock  then yaffs will use endblock 1 must be at least startblock nreservedblocks 2 int nreservedblocks this is then number of erasable blocks that yaffs must keep in reserve for garbage collection and to cover for block failures this must be a minimum of 2 but 5 or so is better if you are using a medium that is not expected to fail eg ram for a ram disk or a host file system emulation then 2 is ok int nshortopcaches this configures the number of entries in the yaffs cache for this device a value of zero defeats the cache a value of 10 to 20 is recommended for most systems cannon be any bigger than yaffsmaxshortopcaches int usenandecc this is a flag that tells yaffs whether it should be doing ecc calculations or if it should be left to the driver void genericdevice this is a pointer which should point to any data that the underlying nand driver will need to know to write and read from the physical device int isyaffs2 are we using yaffs2 we only deal with yaffs2 in this document int inbandtags is there an oob section if not then this should be true only relevant to yaffs2 u32 totalbytesperchunk possibly a misleading name it should be equal to ndatabytesperchunk not ndatabytesperchunk sparebytesperchunk as the name might suggest if inbandtags is true then yaffs sets ndatabytesperchunk such that there is enough space for the data yaffs would normally store in the spare area write readchunkwithtagsfromnand marknandblockbad querynandblock these are all pointers to functions that you shall provide to provide yaffs with a method of writing reading etc from the nand nand access functions if you are using yaffs2 you need to provide pointers to functions that yaffs can call to write and read from the nand example implementations of these function can be seen in yaffsmtdifc these are the functions written to do the same job for the linux mtd layer and provides the write and read functions the following functions return yaffsok on success and yaffsfail on failure int writechunkwithtagstonand struct yaffsdevicestruct dev int chunkinnand const u8 data const yaffsextendedtags tags dev yaffsdevice to write to chunkinnand which page to write the chunk to data pointer to the data to write tags unpacked oob data return yaffsok yaffsfail this function is to write pages chunks to the nand in this function you will probably want to first retrive any useful data that you put in dev genericdevice in the yaffsstartup function and use it to call the function you wrote previously to write data to the nand for yaffs2 data and tags should never be null chunkinnand is the page number of the page to write to not an address so it will need converting if that s what your underling functions to write to the nand expect you will then need to pack the tags into a yaffspackedtags2 structure this takes out the all relevant details from the yaffsextendedtags tags structure and calculates ecc data on it before placing them in the packedtags2 structure this structure is the oob data you will want to write out to the nands spare area how you write these out to the oob data depends on your architecture nand chips and therefore how bad block marking is done if for example the first byte is used for bad block marking then simply writing the tags out after the first byte is acceptable the ecc data in packed tags only covers error correction and detection for the tags in the oob data if you want ecc on the data then you must do that yourself to perform ecc checks to the data bytes you may use the yaffsecccalculate function which calculates ecc data for 256 byte sections of data this function produces 3 bytes of ecc data per 256 bytes therefore for 2048 bytes of data in each page you would need 2048256 3 8 3 24 extra bytes of ecc data this can be written out after the bad block byte and packed tags data int readchunkwithtagsfromnand struct yaffsdevicestruct dev int chunkinnand u8 data yaffsextendedtags tags dev the yaffsdevice to read from chunkinnand which page to read from data pointer to a buffer to read data to tags pointer to a buffer to unpacked oob data into return yaffsok yaffsfail this function should do the opposite to the previous function firstly read in the data and oob bytes secondly place the data bytes in the area pointed to by data then unpack the oob bytes into into the pointer to tags using yaffsunpacktags2 once the tags have been unpacked you should then recalculate the ecc data on the data bytes you just read back just as you did for the write operation then use the recalculated ecc and the ecc data read out of the oob bytes with yaffsecccorrect to correct the data depending on the return value from yaffsecccorrect you should set tags eccresult to reflect whether anything was corrected or the correction failed yaffsunpacktags2 also sets tags eccresult so you should only update it if the result of the data correction is worse than is already there ie if after the tags are unpacked and eccresult is yaffseccresultfixed and ecc correction on the data read back resulted in no errors then you should leave unpackedtags2 and yaffseccresultfixed and not set it to yaffseccresultnoerror int marknandblockbad struct yaffsdevicestruct dev int blockno dev yaffsdevice to write to blockno which block to mark return yaffsok yaffsfail this should mark the block bad this probably means reading the oob data and changing the relevant byte that marks the bad block and writing the oob data back int querynandblock struct yaffsdevicestruct dev int blockno yaffsblockstate state u32 sequencenumber dev the yaffsdevice to write to blockno which block to mark state upon returning this should be set to the relevant state of this particular block sequence number the sequence number of this block  if the block is unused return yaffsok yaffsfail this should check whether or not the block is valid if the bad block marker is set in the oob then state should be set to yaffsblockstatedead sequencenumber set to  and return yaffsfail if the block is not bad then the tags should be unpacked after the tags are unpacked and it is found that chunk is used see tagschunkused sequencenumber should be set to tagssequencenumber and state to yaffsblockstateneedsscanning otherwise if the block is not used then sequencenumber should be  and state should be set to yaffsblockstateempty application interface the yaffs provides a number of functions for applications to interface with it these are mostly the same as the standard clib open close etc prefixed with yaffs eg yaffsopen these functions are defined in direct yaffsfsh to initialise yaffs so that reading and writing can be done you must call yaffs mount for each yaffs device you would like to use eg yaffsmount boot this could be done at system boot if there is an operating system present so that the application need to worry about this you will also need to call yaffsunmount when you have finished so that yaffs may write any state it needs to to disk if there is already an application interface for reading and writing files you may shim the relevant function calls with the related operating system calls eg simply doing define open path oflag mode yaffsopen path oflag mode or having something more complex to provide redirection functions if there is more than one file system present for example int open const char path determine which file system is being used if itisayaffspath path return yaffsopen else do something else  appendices appendix a accessing the balloon source code the latest source code for the balloon board can be checked out from svn there is different code for different balloon versions details of getting the source and setting up tool chains is decribed in the following page http wwwballoonboardorg softwarehtml  if you just want to take a look at the latest mainline code then the following will give you what you want svn checkout svn balloonboardorg balloon trunk jenny 27 april 2009 315pm  ',0),(370,'und','node_search',' yaffsportingguidehtml2de490f8png yaffsportingguidehtml2de490f8png jenny 5 june 2009 331pm  ',0),(371,'und','node_search',' yaffsportingguidehtmlm11b1f893png yaffsportingguidehtmlm11b1f893png jenny 5 june 2009 331pm  ',0),(372,'und','node_search',' yaffsportingguidehtmlm4650262fpng yaffsportingguidehtmlm4650262fpng jenny 5 june 2009 331pm  ',0),(374,'und','node_search',' yaffs tnode tree yaffs tnode tree admin 18 january 2010 251am  ',0),(376,'und','node_search',' yaffs directory structure example yaffs directory structure example admin 18 january 2010 255am  ',0),(377,'und','node_search',' yaffs block states yaffs block states admin 18 january 2010 258am  ',0),(380,'und','node_search',' support support admin 27 february 2012 1056pm we offer support for yaffs through the yaffs mailing list  it s best to start by searching the list archive to see if someone has already asked the same question if you feel uncomfortable asking your question on an open mailing list you can try mailing us but we or you may say you should be paying for this and if that is agreed then we can accept payments via paypal or other means serious longterm work is best done as a negotiated contract for instance we have built special features for clients with very particular needs if you think you may want this sort of help then contact us  telling us a bit about your problem  ',0),(382,'und','node_search',' get yaffs get yaffs admin 28 february 2012 347pm licences yaffs belongs to aleph one limited it is available under two licences the gpl version 2  gnu public licence version 2 you can try it for free under this licence and you can use yaffs in gpl licensed software a proprietary  commercial licence from aleph one limited for use with proprietary or closedsource software these licences are nonexclusive perpetual worldwide royaltyfree and paid for with a single fee for one product yaffs functionality is the same under both licences and both licences are royaltyfree but the terms of the gpl place significant obligations on  all who use yaffs under gpl  please be certain to understand these legal obligations before distributing any software together with yaffs download options we use git to manage our software development to browse or download code  access our git repository over the web  this is also the best option if you are behind a firewall that does not allow direct git access to get a tarball of the top of the tree just click snapshot for the release that you want or to quickly obtain a snapshot of the top of the tree you can use this url  clone yaffs using git clone git wwwaleph1couk yaffs2 if you are a registered developer with a server account you can get read write access using git clone ssh wwwaleph1couk home aleph1 git yaffs2 if you have any questions or would like to buy a commercial licence please contact us either at 44 1223 811679 or email  sales aleph1couk  or see our contacts page  http wwwaleph1couk contact ',0),(384,'und','node_search',' royalty free  royalty free admin 28 february 2012 703pm fathumbsup 100 royalty free of course there s no royalty when you use yaffs under the gpl it s the gpl our commercial licences are paid for once at the time of buying the licence and so they are also royalty free no accounting and no need to worry about increasing costs as you make or sell more units  ',0),(385,'und','node_search',' a robust flash file system  a robust flash file system admin 28 february 2012 710pm fashield as part of our regular testing we run powerfail tests whether it s during a read or a write yaffs is designed to preserve your existing data during a device power failure and because yaffs is open source you can download the tests and run them yourself in the most severe conditions you expect the product to encounter see http wwwyaffsnet documents yaffsrobustnessandtesting  ',0),(388,'und','node_search',' yaffs is open source  yaffs is open source admin 28 february 2012 1023pm faheart yaffs is downloadable with a gnu general public licence v2 as at http wwwgnuorg licenses gpl20html you get the source code with all the benefits that brings and of course if you buy a commercial licence you get the source code too but without the encumberance of your responsibilities under the gnu gpl because it s open source you can always see what the code is doing and trace through and having the code means you ll never be in a situation where you are critically dependent on us either from a technical or a business perspective  ',0),(389,'und','node_search',' tried and tested in millions of devices  tried and tested in millions of devices admin 28 february 2012 1029pm famobilephone yaffs is the leading flash file system running in millions of devices it s been used on linux computers in cameras mobile phones hard drives and on many custom boards people and companies trust it to keep their data safe read more about how we test yaffs in our robustness and testing white paper   ',0),(390,'und','node_search',' get yaffs now get yaffs now admin 29 february 2012 1200am  ',0),(391,'und','node_search',' get yaffs now get yaffs now admin 29 february 2012 133pm  ',0),(397,'und','node_search',' design electronics design electronics admin 9 may 2012 759pm  ',0),(398,'und','node_search',' eaton eaton admin 10 may 2012 1223am  ',0),(399,'und','node_search',' lancom sytems lancom sytems admin 10 may 2012 1225am  ',0),(400,'und','node_search',' bernina bernina admin 10 may 2012 1227am  ',0),(401,'und','node_search',' gallagher gallagher admin 10 may 2012 1228am  ',0),(407,'und','node_search',' booting is fast  booting is fast admin 1 june 2012 251am faspaceshuttle being quick to boot was one of the fundamental requirements in yaffs design boottime scanning to build the file structure lists should require just one pass reading nand memory  ',0),(408,'und','node_search',' an active community  an active community admin 1 june 2012 252am fausers you can learn from the experience of people and companies who are working with yaffs thousands of developers have used yaffs successfully and commerciallylicensed yaffs has many customers that use it repeatedly have a look at the mailing list it s a great place to start if you have some questions http stoneboataleph1couk cgibin mailman listinfo yaffs the searchable archive of postings is at http listsaleph1couk lurker list yaffshtml  or search online to see the variety of work done with yaffs as its basis from research papers through to skunkworks projects for testing particular concepts  ',0),(409,'und','node_search',' how yaffs works how yaffs works charles manning 2 june 2012 1228am howyaffsworkspdf 39308 kb this document aims to give a reasonable explanation of most of the core mechanisms that make yaffs work this document should serve as a first port of call for understanding yaffs 1 purpose the purpose of this document is to give a reasonable explanation of most of the core mechanisms that make yaffs work as of the time of writing this the yaffs2 code base includes approximately 19000 lines of code making a very detailed discussion impractical this document should serve as a first port of call for understanding yaffs further detailed questions and discussions are welcomed on the yaffs discussion list this document is updated periodically yaffs mechanism design changes from time to time and this document will not always reflect the most up to date code 2 what is yaffs  yaffs stands for yet another flash file system  a term coined by charles manning in 2001 when suggesting that the already cluttered flash file system space could do with yet another offering this time a flash file system designed from the ground up to work with nand flash the first release of yaffs was developed during the end of 2001 and the beginning of 2002 by mid2002 yaffs was being trialled in various products in may 2002 yaffs was announced and a few more projects started playing with it in june porting to other oss started in september 2002 yaffs was announced on linuxdevicescom which started a far wider uptake of yaffs yaffs1 the original version of yaffs supported 512byte page nand devices with a smartmedialike memory layout yaffs2 is a followup to yaffs1 extending yaffs1 to support larger and different devices with different constraints yaffsis highly portable and has been used in many different products and applications as varied as sewing machines point of sale phones and aerospace yaffs has been used with multiple different operating systems native support is available for linux windowsce and ecos while yaffs direct interface provides a layer that can be used in other applications such as rtoss yaffs has been used with multiple different cpus and compilers yaffs has also been used as a nor file system and even as a ram file system 3 design and coding strategies yaffs is designed to work in multiple environments which drives the need for portability portability also improves the debugging and testing since it is easier to develop and debug code in an application environment than within an os kernel this generally allows yaffs to progress faster with less programming resources and provides more varied testing primary strategies that improve portability include no osspecific features used in main code body no compilerspecific features used in the main code body abstract types and functions used to allow unicode or ascii operation simplicity is another key goal complexity is limited to those situations that provide significant improvements to performance or utility simplicity improves robustness and the ease of integration and development primary strategies that improve simplicity are single threaded model yaffs is locked on a perpartition basis at a high level this is simpler than tracking lowerlevel locking yaffs direct interface uses a single lock for all partitions log structure makes for a simpler garbage collector and allocation methodology abstractions that build layered code which is easier to understand port and debug 4 terminology yaffs vs yaffs1 vs yaffs2 before we embark on our quest to understand what yaffs is a terminology explanation is in order there are two versions of yaffs code the original yaffs codebase and the current yaffs2 codebase the yaffs2 codebase supports functionality provided by the yaffs codebase as well as being extended with new functionality to provide extra modes of operation most importantly those required to work with larger and more modern nand parts the yaffs2 codebase supports the yaffs1 mode of operation through a backward compatibility mode unless explicitly mentioned this text refers to the yaffs2 codebase this text uses three terms yaffs yaffs1 and yaffs2 depending on various modes of operation yaffs1 is a simpler mode of operation that uses deletion markers to track state yaffs2 is a more complex mode of operating that was developed to support larger modern flash types in particular mlc nand that cannot used deletion markers yaffs means operations common to both yaffs1 originally only worked with 512byte page devices but has been extended to support larger flash pages such as intel m18 flash with 1k pages yaffs2 was originally designed for 1k or larger page sizes but can be used with smaller pages by using inband tags since the yaffs1 mode of operation is simpler to understand than the yaffs2 mode of operation yaffs1 will be described first and readers interested in yaffs2 operation should first fully acquaint themselves with the yaffs1 mode of operation it is suggested that this document be read sequentially rather than browsing it 5 objects in yaffsspeak an object is anything that is stored in the file system these are regular data files directories hardlinks symbolic links special objects pipes devices etc all objects are identified by a unique integer object id  objid    in the standard posix model as used by linux there are inodes and directory entries dentries an inode may be a regular file directory or special file directory entries provide the naming mechanism that is used to locate inodes under posix each inode may have zero one or many dentries one dentry per inode is commonly understood multiple dentries per inode allow the same inode to be accessed via multiple names this is achieved through hard links zero dentries per inode is less often understood this happens when an inode is unlinked while there is still a handle open to the inode the unlinking deletes the dentry but the inode still exists as soon as the handle is closed the inode is deleted too 6 the yaffs nand model the memory in nand flash is arranged in pages a page is the unit of allocation and programming in yaffs the unit of allocation is the chunk  typically a chunk will be the same as a nand page but there is flexibility to use chunks which map to multiple pages eg a system may have two nand chips in parallel requiring 2x2048 4096 byte chunks this distinction gives a lot of flexibility in how the system can be configured in this text the term page and chunk are synonymous unless stated otherwise many typically 32 to 128 but as many as a few hundred chunks form a block  a block is the unit of erasure nand flash may be shipped with bad blocks and further blocks may go bad during the operation of the device thus yaffs is aware of bad blocks and needs to be able to detect and mark bad blocks nand flash also typically requires the use of some sort of error detection and correction code ecc yaffs can either use existing ecc logic or provide its own 7 how yaffs1 stores files yaffs1 has a modified log structure while yaffs2 see below has a true log structure a true log structured file system only ever writes sequentially yaffs1 uses deletion markers which breaks the sequential write rule yaffs2 does not use deletion markers and is thus a true log structured file system instead of writing data in locations specific to the files the file system data is written in the form of a sequential log the entries in the log are all one chunk in size and can hold one of two types of chunk  data chunk  a chunk holding regular data file contents object header  a descriptor for an object directory regular data file hard link soft link special descriptor this holds details such as the identifier for the parent directory object name etc each chunk has tags associated with it the tags comprise the following important fields others being ignored for now  object id  objid    identifies which object the chunk belongs to chunk id  chunkid    identifies where in the file this chunk belongs a chunkid of zero signifies that this chunk contains an objectheader chunkid 1 signifies the first chunk in the file ie at file offset  chunkid 2 is the next chunk and so on deletion marker  isdeleted      yaffs1 only shows that this chunk is no longer in use byte count    nbytes   number of bytes of data if this is a data chunk serial number  ser ia lnumber   yaffs1 only serial number used to differentiate chunks with the same objid and chunkid now let s bring that all together in an explanation this is a simplified explanation and skips over issues such as soft deletion mentioned later in the document for explanation purposes we shall consider usage of fictitious nand type that has 4 chunks per block starting with an empty erased flash first we ll create a file block chunk objid chunkid deletion comment 1  500  live object header for this file length  next we write a few chunks of data to the file block chunk objid chunkid deletion comment 1  500  live object header for t his file length  1 1 500 1 live first chunk of data 1 2 500 2 live second chunk of data 1 3 500 3 live third chunk of data next we close the file this writers a new object header for the file notice how the previous object header is deleted block chunk objid chunkid deletion comment 1  500  deleted obsoleted object header length  1 1 500 1 live first chunk of data 1 2 500 2 live second chunk of data 1 3 500 3 live third chunk of data 2  500  live new object header length n let s now open the file for read write overwrite part of the first chunk in the file and close the file the replaced data and object header chunks become deleted block chunk objid chunkid deletion comment 1  500  deleted obsolete object header 1 1 500 1 deleted obsolete first chunk of data 1 2 500 2 live second chunk of data 1 3 500 3 live third chunk of data 2  500  deleted obsolete object header 2 1 500 1 live new first chunk of file 2 2 500  live new object header now let s resize the file to zero by opening the file with otrunc and closing the file this writes a new object header with length  and the contents are pruned making the data chunks deleted block chunk objid chunkid deletion comment 1  500  deleted obsolete object header 1 1 500 1 deleted obsolete first chunk of data 1 2 500 2 deleted second chunk of data 1 3 500 3 deleted third chunk of data 2  500  deleted obsolete object header 2 1 500 1 deleted deleted first chunk of file 2 2 500  delted obsoleted object header 2 3 500  live new object header length  note how all the pages in block 1 are now marked as deleted this means that block 1 no longer contains useful information so we can now erase block 1 and reuse the space we will now rename the file to do this we write a new object header for the file block chunk objid chunkid deleted comment 1  erased 1 1 erased 1 2 erased 1 3 erased 2  500  deleted obsolete object header 2 1 500 1 deleted deleted first chunk of file 2 2 500 2 deleted obsoleted object header 2 3 500  deleted obsolete object header 3  500  live new object header showing new name block 2 now contains only deleted chunks and can be erased and reused note how the tags tell us which chunks belong to which object the position of the chunks within a file which chunks are current note that there are no file allocation tables or similar structures stored in the flash this reduces the amount of writing and erasing improving write performance while also improving robustness corruption of file allocation tables and similar structures is a common failure mechanism for embedded file systems the lack of such structures makes yaffs more robust or to put it another way you can t corrupt what you don t store 8 garbage collection as we have shown so far when a block is made up only of deleted chunks that block can be erased and reused however consider what will happen if we have many blocks which each have a few current chunks in them clearly we cannot erase any of the current blocks or we will destroy data what we need to do is copy the useful data chunks off a block deleting the originals and allowing the block to be erased and reused this process is referred to as garbage collection  the yaffs garbage collection process works as follows find a block worth collecting according the the heuristics below if none found then exit iterate through the chunks in the block if the chunk is in use then create a new copy and delete the original fix up the ram data structures to reflect the change once all chunks in this block have been deleted the block can be erased ready for reuse note that although step 2 deletes the original chunk when it gets copied there is not much point in actually programming the deletion marker isdeleted flag in flash since we re about to erase the block anyway thus yaffs does not program the deletion marker in these cases if power is lost part way through the operation we can still tell the difference between the original and the copy by looking at the serial number not that it really matters anyway since the two have the same contents so either can be used the heuristics to determine whether a block is worth collecting are as follows if there are many erased blocks available then yaffs does not need to work hard but will instead only attempt to perform garbage collection of blocks with very few chunks in use this is termed passive garbage collection if however there are very few erased blocks yaffs will work much harder to recover more space and will garbage collect blocks with more chunks in use this is termed aggressive garbage collection ok the passive aggressive names are a bit silly but they were contrived around midnight give me a break if garbage collection is aggressive we need erased space urgency and the whole block is collected in a single garbage collection cycle if the collection is passive then only a few chunks are collected at a time thus spreading the effort over many garbage collection cycles this is done to reduce garbage collection load and improve responsiveness the rationale behind the above heuristics is to delay garbage collection when possible to reduce the amount of collection that needs to be performed thus increasing average system performance yet there is a conflicting goal of trying to spread the garbage collection so that it does not all happen at the same causing fluctuations in file system throughput these conflicting goals make garbage tuning quite challenging all flash file systems need some sort of garbage collector to reclaim space the garbage collector is often a determining factor in the performance of the flash file system many file systems have to do a significant amount of effort in a single collection sweep yaffs only deals with one block at a time which constrains the amount of effort in a garbage collection cycle thus reducing the stall time under normal conditions that garbage collection is performed a few chunks at a time further reducing stall time  9 yaffs1 serial numbers in yaffs1 each chunk is marked with a 2bit serial number that is incremented every time a chunk with the same tags value is replaced eg when a chunk is overwritten or when copied by garbage collection now let s suppose first that we did not have a serial number let s consider a rename where an object header chunk must be replaced with a new one with the new name yaffs could do the following delete the old chunk write the new chunk if the system fails after the delete the system could end up with no chunks matching the relevant tags values this could cause files to be lost end up in the lost found directory thus we have to write the new chunk before deleting the old chunk but now consider what might happen if we did this w rite new chunk delete old chunk if the system failed after the write we now have two chunks that match the tags how can we tell which one is current the current chunk is determined by inspecting the serial number since the serial number is only incremented by one before the old chunk is deleted a 2bit serial number is sufficient valid pairs are old new  1 1 10 10 11 11  thus by inspecting the serial number attached to the old and new tags the current chunk can be determined and the old chunk can be deleted 10 yaffs2 nand model yaffs2 is an extension of yaffs designed to fulfill a new set of objectives to work with newer nand types including zero overwrites yaffs1 only ever overwrites a single byte in the spare area of the chunks to set the deletion marker more modern nand devices are less tolerant of overwrites and yaffs2 performs no overwrites at all sequential chunk writing within a block more modern nand reliability specifications tend to assume sequential writing since yaffs2 does not write deletion markers the writing of chunks within a block is strictly sequential some flash technologies such as mlc only work properly if pages are written sequentially this is a fundamental requirement of how many mlc types perform the bit overlaying since yaffs2 performs less writes there is potential for yaffs2 to have improved write performance yaffs2 cannot use a deletion marker because that would violate the zero overwrites mandate and alternate mechanisms are provided to determine which chunks are current and which are deleted these mechanisms are  sequence number  seqnumber   as each block is allocated the file system s sequence number is incremented and each chunk in the block is marked with that sequence number the sequence number thus provides a way of organising the log in chronological order shrink header marker  shrinkheader   the shrink header marker is used to mark object headers that are written to shrink the size of a data file this is explained more in the accompanying text note the yaffs2 sequence number is not the same as the yaffs1 serial number  note we still refer to chunk deletion in yaffs2 the chunks are marked as deleted in the ram data structures used by garbage collection etc but there is no deletion marker written to flash 101 sequence number since we re scanning backwards the most recently written and thus current chunk matching an objid chunkid pair will be encountered first and all subsequent matching chunks must be obsolete and treated as deleted the file length in object headers are used to trim back resized files if an object header is encountered then subsequent data chunks that lie beyond that file length are clearly obsolete and treated as deleted note that both current and obsolete object header sizes must be used to obtain an accurate reconstruction 102 shrink header explaining the purpose of the shrink header marker is a bit convoluted the purpose of a shrink header marker is to show that this object header indicates that a file has shrunken in size and to prevent those object headers from being deleted by garbage collection to understand this it is easiest to consider what would happen if the shrink header markers did not exist for simplification we ll assume no garbage collection happens during this part of the exercise it is safe to make that assumption since it does not alter the reasoning consider a file that has been through the following   define mb 1024 1024  h open foo ocreat ordwr siread siwrite create file write h data 5 mb write 5 mb of data truncate h 1 mb truncate to 1mb lseek h 2 mb seekset set the file access position to 2mb write h data 1 mb write 1mb of data close h the file will now be 3mb in length but there will be a hole between 1mb and 2mb according to posix and to aid security etc that hole should always read back as zeros yaffs2 would represent that in nand with the following sequence of chunks object header for file creation file length  5mb worth of data chunks  to 5mb object header for truncation file length 1mb 1mb worth of data chunks 2mb to 3mb object header for close file length 3mb at this stage only the the following data chunks are current the first 1mb of data created in step 2 above the 1mb of data created in step 4 above the object header created in step 5 above but yaffs must remember the truncation that happened in step 3 otherwise yaffs will forget that there is a hole which would cause the old data to be visible again thus if yaffs creates a hole it first writes a shrink header to indicate the start of the hole and a regular object header to mark the end of the hole the shrink header modifies the behavior of the garbage collector to ensure that these shrink headers are not erased until it is safe to do so this unfortunately has a negative impact on garbage collection in systems which make extensive use of files with holes shrink headers are also used to indicate that a file has been deleted and that the record of the file deletion is not lost 103 yaffs2 extended tags yaffs2 extends the tags in object headers with extra fields to improve mount scanning performance the operation of extended tags is described later in this document 11 bad block handling nand error handling nand flash is designed to be very low cost and very high density in order to get high yields and thus keep costs down nand flash is typically shipped with a few bad blocks and some further blocks are expected to go bad during the use of the device thus any flash file system without an effective bad block handling policy is unsuitable for nand flash yaffs1 uses the smartmedia style of bad block marking this checks the sixth byte byte 5 of the spare area in a good block this should be 0xff a factorymarked bad block should be 0x00 if yaffs1 determines that a block has gone bad it is marked bad with 0x59 y using a distinctive marker allows yaffsmarked bad blocks to be differentiated from factorymarked bad blocks yaffs2 mode is designed to support a wider range of devices and sparearea layouts thus yaffs2 does not decide which bytes to mark but instead calls driver functions to determine whether the block is bad or to mark it bad so when does yaffs mark a block bad yaffs will mark a block bad if a read or write operation fails or if three ecc errors are detected a block that is marked bad is retired from use thus improving the robustness of the file system this policy is suitable for slc flash mlc policies are under development further nand flash cells can sometimes be disturbed corrupted by nand activity and charge loss these errors are corrected by error correction codes ecc which may be implemented in hardware software drivers or within yaffs itself again any flash file system lacking effective ecc handling is unsuitable for nand flash yaffs1 mode can use either the built in ecc or use ecc provided by the driver or hardware since yaffs2 mode is designed for a wider range of devices it does not provide ecc internally but requires that the driver provide the ecc the ecc code supplied with yaffs yaffseccc is the fastest c code implementation of a smart media compatible ecc algorithm that we are aware of this code will correct any single bit error within a 256byte data block and detect 2 errors per 256byte data block this is sufficient error correction to provide very high reliability on most slctype nand flash for a more complete description of failure handling please refer to the yaffs error mitigation document 12 ram structures while it is theoretically possible to use a log structured file system with very few ram structures this would provide reduce performance thus significant ram data structures are required to store enough information to provide sufficiently high performance before we jump in it is a good idea to first figure out what purpose the ram structures serve the main structures are defined in yaffsgutsh and their main purposes are device partition this is named yaffsdev  this is required to hold information relating to a yaffs partition or mount point using these rather than globals allows yaffs to simultaneously support multiple partitions and partitions of different types in fact almost other data structures mentioned here are part of or accessed via the structure nand block information this is named yaffsblockinfo and holds the current state of the nand blocks each yaffsdev has an array of these nand chunk information this is a bitfield attached to the yaffsdev that holds the current inuse state of each chunk in the system there is one bit per chunk in the partition object this is named yaffsobj and holds the state of an object see section 3 there is one of these for each object in the file system where an object is one of a regular file directory hard link symbolic link or special link there are different variants of yaffsobjects to reflect the different data required for these different object types each object is uniquely identified by an objid file structure for each file object yaffs holds a tree which provides the mechanism to find the data chunks in a file the tree consists of nodes called yaffstnode  tree nodes directory structure the directory structure allows objects to be found by name the directory structure is built from a doublylinked list that is rooted in the directory and binds together the sibling objects within a directory object number hash table the object number hash table provides a mechanism to find an object from its objid the objid is hashed to select a hash bucket each hash bucket has a doublylinked list of objects that belong in this hash bucket as well as a count of the objects in the bucket cache yaffs provides a read write cache that significantly improves performance for short operations the size of the cache can be set at runtime the usage of these structures is described in more detail below yaffs makes significant use of doublylinked lists these data structures are very useful because they provide rapid insertion removal and traversal they do however come at the expense of requiring two pointers rather than just one that would be required by a singlylinked list 121 yaffs objects struct yaffsobj  each object file directory in the system is represented by a yaffsobj structure the yaffsobj s main function is to store most of the object metadata and typespecific information this means that almost all the information about an object can be accessed immediately without reading flash the metadata includes amongst others objid the number used to identify the object parent a pointer to the parent directory not all objects have a parent the root director and special directories for unlinked and deleted files do not have parents so this is null shortname if the name is short enough to fit in a small fixedsized array default 16 characters then it is stored here otherwise it must be fetched from flash each time it is requested type type of object permissions time ownership and other attributes depending on the object type yaffsobj also stores a tnode tree file extents etc for data files a directory chain for directories an equivalent object for hard links a string for symbolic links 122 lookup by objid the purpose of this mechanism is to rapidly access an object by its device and objid this is required during garbage collection scanning and similar operations each yaffsdev uses a hash table for this purpose the hash table has 256 buckets tunable each holding a doublylinked list of the yaffsobjs in that bucket the hash table s hash function is just masking the least significant bits of the objid this is a very cheap function that provides reasonable spread yaffs makes an attempt to assign objids in a way that keeps the number of objects in each hash bucket quite low thus preventing any one hash entry getting too long this mechanism is also charged with assigning new unique objid values 123 directory structure the purpose of the directory structure is to rapidly access an object by name this is required to perform file operations such as opening renaming etc the yaffs directory structure is formed by a tree of objects of type yaffsobjecttypedirectory these objects have a doubly linked node of children each yaffsobj also has a doubly linked list node called sibling which chain together the siblings in a directory each yaffs partition has a root directory each yaffs partition also has some special purpose fake directories which are not stored in nand but are instead created on mounting lost found this directory is used as a place to store any lost file parts that cannot be placed in the normal directory tree unlinked and deleted these are pseudodirectories that are not in the directory tree placing objects in these directories gives them a status of being unlinked or deleted each object has a name that is used to look up the object within the directory thus each name within a directory must be unique this rule does not apply to objects in the unlinked and deleted pseudodirectories since we never use names to look up unlinked deleted files and there may be many files of the same name that have been deleted name resolution is sped up by two mechanisms shortnames are stored directly in the yaffsobj so that they don t have to be loaded from flash each object has a name sum this is a simple hashing of the name which speeds up the matching process because it is cheaper to compare the hash than compare the whole name string the above directory structure represents the following directory tree root directory a directory containing c d e b empty directory lost found empty directory a c directory a d data file a e data file if a yaffs partition has been somehow corrupted then it is possible for an object to be created during scanning but with no object header which contains the object name being found the object would then not have a name in these cases yaffs creates a pseudonym from the object number of the form objnnnn so that the object can be placed in the directory structure 124 hard links in posix file systems the objects inodes in linux terminology vnode in bsdspeak and the object names dentry in linux terminology are independent in that an object can have zero one or more names having files with zero links is caused by constructs such as h open foo ocreat ordwr siread siwrite create file foo unlink foo unlink it to remove directory entry we still have a handle to the file so can still access it via the handle read h buffer 100 write h buffer 100 close h as soon as the handle is closed the file is deleted yaffs does not store separate object and name records because that would waste space and incur extra reading writing instead yaffs is optimised for the most typical case of one name per object that is yaffs stores one name per yaffsobj and uses cheats to achieve other behavior objects that have zero names ie unlinked objects are handled by renaming the object into a fake directory that is used to designate unlinked objects multiple names object are handled by designating one of the objects the main object and having multiple hard link pseudoobjects that refer to it the inode number vnid in bsdspeak is a perfile system unique number that identifies the object the yaffs objid of the main object is presented to the user that is if the inode number is queried from a hardlink object then the objid of the equivalent object is returned the linkage between hard link pseudoobjects and their equivalent object is through two fields each object has a hardlinks doubly linked list node that links the list of hard links to that object each hard link has a equivobj pointer to the equivalent object the usage of this structure is straight forward except for one interesting case when hard links are being deleted consider the following sequence of events 1 touch a create file a 2 ln a b create a hard link b with equivalent object a 3 rm a remove a the object must still exist under the name b in step 3 yaffs cannot just delete the equivalent object since that would leave a hanging hard link with no equivalent object we also cannot just change the type of one of the hardlink objects because that would cause the object s objid to change this would be unacceptable since it would break any mechanism that use the objid of which there are many within and outside of yaffs thus if an object is deleted and it has hard links to it then we do the following select one of the object s hard links rename the object to the name in the hard link delete the hard link pseudoobject 125 symbolic links and special objects these object types just store values that are needed to provide a full posix file system a symbolic link object saves a symbolic link string that is used to provide the posix symbolic string mechanism a special object is used to store entries for device numbers pipes and other similar special objects 126 file objects the yaffsobjects have a type and a variant portion which is a union of different data required to hold the state of different object types the file objects have type yaffsobjecttypefile and an associated file variant this stores the following main values filesize file size toplevel depth of the tnode tree top pointer to top of tnode tree the meaning of the file size is quite obvious this is the current length of the file note that a file might have holes in it caused by seeking forward past the extents of the file the top and toplevel work together to control the tnode trees 1261 tnode tree each file has a tnode tree to provide the mapping from file position to actual nand chunk address top is a pointer to the top of the tnode tree the tnode tree is made up of tnodes tree nodes arranged in levels each of which holds either at levels greater than  a tnode has 8 pointers to other tnodes in the next level down at level  a tnode has 16 nand chunk ids which identify the chunk s location in ram these numbers are powers of 2 which makes for simple lookups by just applying bitmasks the code that traverses this tree is in yaffsfindtnode0 as the file size grows more tnodes are added and as the levels fill more levels are added if the file is truncated or resized downwards then the tree is pruned if a chunk in a file is replaced eg data is overwritten or copied by garbage collection then the tnode tree must be updated to reflect the change tnodes typically make up the bulk of the yaffs ram usage 13 how various mechanisms work having looked at the yaffs data structures we now consider how some of the mechanisms in yaffs operates this is most easily done by walking through some operations that yaffs performs 131 block and chunk management 1311 block states yaffs tracks the state of each block and chunk in the partition this information is first built up during scanning or recovered from a checkpoint a block may be in one of the following states see definition of enum yaffsblockstate unknown the block state is not yet known needsscanning during prescanning it has been determined that this block has something on it and needs scanning scanning this block is currently being scanned empty this block has nothing in it is erased and may be used for allocation the block can get to this state by being erased allocating this is the block currently being used for allocation by the chunk allocator full all the chunks in this block have been allocated and at least one chunk contains useful information that has not yet been deleted dirty all the chunks in this block have been allocated and all have been deleted the block might have been in the full or collecting state before this this block can now be erased and returned to empty state checkpoint this block has checkpoint data in it when the checkpoint is invalidated this block will be erased and returned to the empty state collecting this block is being garbage collected as soon as all live data has been inspected this block becomes dirty dead this block has been retired or was marked bad this is a terminal state the regular runtime states are empty allocating full collecting and dirty the checkpoint state is used for checkpoint blocks the dead state is the terminal state for blocks that were retired because they were either marked bad or an error was detected 1312 block and chunk allocation an available chunk must be allocated before it can be written the chunk allocation mechanism is provided by yaffsallocchunk and is very simple each yaffsdev has a current block that it is allocating from this is termed the allocation block  allocblock   chunks are allocated sequentially from the allocation block as the chunks are allocated block and chunk management information is updated including the block s pagesinuse count and the chunk use bitmap when the block is fully allocated another empty block is selected to become the allocation block the blocks are selected by searching upwards from the previous allocation block in older versions of yaffs the yaffs scanning would identify the allocation block being used when the file system was last shut down and would continue allocation from that point this had the benefit of continuing to use the same block and slightly reduce garbage creation however doing this could potentially cause problems due to attempting to write a block that had been in the middle of a write when power was lost thus yaffs now always starts allocation on a new block after a mount this slightly increases the amount of garbage typically by an insignificant amount but improves robustness 1313 a word about wear leveling since flash memory blocks can only endure a limited number of writes and erases termed the flash endurance a flash file system needs to ensure that the same few blocks are not overwritten continuously causing those blocks to wear out while the other blocks are hardly used at all instead it is important that the file system spreads out the wear this is extremely important in a file system such as fat which uses a limited set of logical blocks to store the file allocation table entries which get modified frequently if fat is used with a static logical to physical block mapping then the file allocation table blocks will wear out far before other blocks causing premature device failure thus for fat it is very important that the logical to physical mapping gets stirred up a bit to cause the file allocation tables to be written to different physical blocks thus leveling out the wear wear leveling is far less of a concern in a log structured file system such as yaffs since we always write to the end of the log and thus don t keep on overwriting the same blocks there are basically two ways to achieve wear leveling use a specifically written set of functions that actively perform wear leveling allow a degree of wear leveling to happen as a side effect of other activity yaffs takes the second approach firstly being log structured yaffs inherently spreads out the wear by performing all writes in sequence that means that we don t single out a few blocks for a specific purpose and write them more than others secondly blocks are allocated serially from the erased blocks in the partition thus the process of erasing after deletion of garbage collection and then allocating blocks does tend to spread the block use and provides a level of wear leveling thus even though there is no code to specifically perform wear leveling it does happen as a side effect of other activity this strategy performs well and has survived many accelerated lifetime tests in both simulations and on real nandbased products 1314 management of yaffstnode and yaffsobj structures yaffstnodes and yaffsobjs are dynamically created and released as they are needed the allocation and management could be done by just using the standard memory allocator malloc kmalloc etc but this could cause performance problems particularly in embedded systems which tend to have rather simplistic memory allocators the allocation and deletion of many small structures can cause memory fragmentation causing outofmemory and slowdown problems to prevent these problems yaffs manages these objects internally yaffs creates many structures 100 or so at a time and then allocates them singly from a free list when structures are released they are placed on the free list for reuse 132 internal cache this describes the standard yaffs internal cache implementation alternative caches have been devised for other purposes and at some future point yaffs might be extended to support pluggable cache policies the main purpose of the internal cache is to reduce nand access for badly behaved applications which perform many small reads and writes believe it or not but there are applications out there that read or write files a few bytes at a time while write h buf 1 this sort of behavior would be terrible for performance and flash memory life if each read or write operation resulted in a flash access yaffs provides an internal cache to mitigate against this sort of behaviour the yaffs internal cache is called a short op cache short operation cache and only comes in to play for operations which are not chunk aligned the caching mechanism is very simple and was primarily written for less sophisticated oss that lack their own file caching layer the cache is still beneficial in oss like linux which provide a caching layer because it caches both the read and write path thus while short reads will be serviced by the linux page cache the short op cache does address nonchunk aligned writes page aligned reads writes bypass the cache unless that chunk is already in the cache except when inband tags are used inband tags always require the cache because the cache is used to build up the buffer where the tags are attached to the data chunk being written the cache is stored in an array of cache entries the number of cache entries is set in the yaffsdev parameters ncaches and the cache is configured during initialisation ncaches of zero disables the cache the cache management algorithms are simplistic and probably don t scale well to very large numbers this means that it is probably best to stick with around 5 to 20 cache entries each cache entry holds objid chunk id nbytes the tag info of the chunk being cached the actual data bytes cache slot status last used counter dirty finding an unused cache entry is a simple operation we just iterate through the cache entries searching for one that is not assigned if all cache entries are busy then a cache pushout is performed to free up a cahce entry whenever a cache entry is accessed read or written the lastuse counter is is set to an incrementing number this counter value is used to drive the leastrecentlyused lru algorithm cache entries which have been modified and not yet written back to flash are marked with a dirty flag this is tells us whether we need to write out the data during a flush or pushout a pushout happens whenever the cache is full and we need to push an entry out of the cache to make space to load a new entry yaffs uses the lru algorithm to select the lru cache entry write it out if needed and then assign that for use whenever a file is flushed file flush or close the file s dirty entries are written out at certain times eg before an unmount or at sync the entire cache is flushed this caching policy is gives a useful performance improvement with very simple algorithms ie good bangforbucks apart from its normal caching function the short op cache also does much of the heavy lifting for inband tags support since all the inband tags accesses are not chunk aligned and must typically be realigned the cache makes this easy 133 scanning scanning is the process whereby file system state is rebuilt from scratch this happens on mounting a yaffs partition if no checkpoint data is available or if the mounting was told to ignore the checkpoint data scanning involves reading the tags from all the active chunks in the system so can take quite a while but probably less time than you d expect the scanning process is different for yaffs1 vs yaffs2 because of the differences mentioned before 1331 yaffs1 scanning yaffs1 scanning is rather straight forward because yaffs1 uses deletion markers all we really need to do is read the tags off all the chunks in the partition and determine if the chunk is active order is not important and blocks could be read in any order if the deletion marker has not been set then it is active and we need to add the chunk to the file system state as follows if the chunk is a data chunk chunkid  then the chunk must be added to the relevant file s tnode tree if the object does not exist then we create it in lost found although it has no name and other file details yet if the chunk is an object header chunkid  then the object must be created or it might already exist in lost found and we need to fix up its details and slot it into the correct part of the directory tree if at any time during scanning we find that we are reading a second chunk with the same objid chunkid as a previously encountered chunk then the 2bit serial number is used to resolve the dispute once the scanning is complete we still need to fix up a few things hard links must be connected up properly it is more efficient to defer this until after the scanning has completed also objects which were marked as unlinked must be deleted since there are no longer handles open to these objects 1332 yaffs2 scanning yaffs2 has no deletion markers which makes the scanning significantly more complex the first thing that needs to be done is to prescan the blocks to determine the sequence number for the blocks the list of blocks and sequence numbers is then sorted to make a chronologically ordered list yaffs then scans backwards through these blocks ie in reverse chronological order thus the first encountered objid chunkid pair is the current one and subsequent chunks with those tags are out of date we read the tags for each chunk in each block if it is a data chunk ie chunkid  then if a chunk with the same objid chunkid has already been found then this is not the current chunk delete this one else if the object is marked as deleted or corrupted then delete it else if the object does not yet exist then this chunk was written since the last object header write for this object so this chunk must be the last written chunk in the file and must have happened just before an unclean shutdown with the file still open we can create the file and use the chunkid and nbytes to set the file extents else if the object does exist and the chunk lies beyond the object s file scan size extents then it is a truncated chunk and can be deleted else it is placed into the file s tnode tree if it is an object header ie chunkid  then if the object is in the deleted directory then mark the object as deleted and set the object s shrink size to zero else if an object header has not yet been found for this object then this is the most current object header and holds the most current name etc if no data chunks have yet been found for this chunk then the size in the object header is also the file extents the file size is used to set the file scan size since at the time it was written the file did not extend past that point and we can safely ignore further data chunks for that file that extend past that point else just use the file size as the scan size if it is smaller than the current file scan size else this an obsolete object header it is deleted a bit more explanation is probably needed to describe the file scan size the whole purpose of this is to determine data chunks that should be ignored due to the file being truncated 134 checkpoint mount scanning takes quite a lot of time and slows mounting though perhaps by less than you d think checkpointing is a mechanism to speed the mounting by taking a snapshot of the yaffs runtime state at unmount or sync and then reconstituting the runtime state on remounting the speed up is dramatic the actual checkpoint mechanism is quite simple a stream of data is written to a set of blocks which are marked as holding checkpoint data and the important runtime state is written to the stream not all state needs to be saved only the state needed to reconstitute the structure of the runtime data for example file metadata need not be saved since it is very easy to load that through lazyloading the checkpoint stores data in the following order start marker including checkpoint format id yaffsdev information block information chunk flags objects including file structure end marker checksum the checkpoint validity is ensured by the following mechanisms the data is stored using whatever ecc mechanisms are in place the start marker includes a checkpoint version so that an obsolete checkpoint will not be read if the checkpoint code changes data is written to the stream as structured records each with a type and size the end marker must be read when expected two checksums are maintained across the whole checkpoint data set if any checks fail the checkpoint is ignored and the state is rescanned the astute reader might notice that block state changes as we re writing checkpoint blocks so how do we manage to reconstitute the block states correctly this is achieved by the following as we write the checkpoint the checkpoint block allocation selects empty blocks we don t change the state as we re writing the checkpoint so their state is written to the checkpoint as empty or checkpoint it does not really matter which after reading the checkpoint we know which blocks have been used to store checkpoint data we update those blocks to reflect the checkpoint state a checkpoint is invalidated by any modifications writes erases thus any modification path also checks to see if there is a checkpoint and erases it the regular yaffs block allocator and garbage collection logic also needs to be aware of the approximate size of the checkpoint so that these can ensure enough spare space is reserved to store a checkpoint there is a calculation that updates the value whenever the number of objects etc changes 135 extended tags and packed tags extended tags is an abstraction of a way to store more information in the tags allowing for faster scan times packed tags is a physical implementation of the storage of extended tags when we re scanning we really only need to build up the structure of the file system in other words rebuild the directory relationships tnode trees and such much of the detail such as file names permissions etc can be lazy loaded if and when needed this required storing extra information such as the parent directory and object type in the tags of object headers but how do we do this without enlarging the tags size object headers always have a chunkid of zero and nbytes has no meaning because it is not a data chunk by using a single bit to identify object headers we suddenly open up a whole lot of space that we can stuff full of useful data by being clever as to what data we use we can pack in the important data in most circumstances sometimes for example very large files the packing will not work because there are insufficient bits to hold the field so we just write regular tags instead that s ok since there can only be few such files in the system so the performance reduction only impacts very few files and the system level impact is unnoticeable a simple cheap strategy that gives speed up 99 of the time is a very handy one other details are lazyloaded on demand this will happen when the object is looked up eg by a file open or searching for the file in the directory  136 block summaries scanning requires that the tags for each chunk are read so that they can be inspected reading the tags from each chunk can be time consuming thus block summaries were added in 2011 block summaries write all the tags data for chunks in the block into the last few typically only one chunk in a block this allows all the tags for chunks in that block to be read in one hit depending on the system throughput cpu ram and flash speeds this can speed up mount time dramatically note that the block summary does not replace the tags attached to each chunk both are written thus if the whole block is not written and the block summary is thus not written the chunk tags can still be read and used if a block summary is not available for a block then the old mechanism is still used to scan the tags on each chunk 137 inband tags thus far we have considered chunks where there are sufficient unallocated bytes in the spare or out of band area to store the tags but what happens if we don t have enough space in the spare area to store the tags inband tags to the rescue with inband tags we store the tags in the flash data area alongside the data this gives us far more flexibility in the types of storage that yaffs can support there are three major penalties with inband tags due to the loss of chunk alignment all transactions must pass through the short op cache this costs an extra memcpy reading tags during scanning etc can involve reading the whole page making this slower the impact is minimised by using checkpointing or block summaries thus it is better performance wise to only use inband tags when regular tags will not work 138 soft deletion soft deletion is a mechanism that was added to speed up file deletion in yaffs1 mode looking back to the description of how files are stored in yaffs1 you can see that deleting a file involves writing the deletion marker of every data chunk in the file this can take quite some time for large files the soft deletion mechanism was added to avoid writing all those deletion markers instead of writing the deletion markers soft deletion instead tracks the number of chunks in each block that belong to deleted files and leaves the clean up to the garbage collector when the garbage collector looks at a block it can see what current chunks ie chunks not yet deleted belong to deleted files and does not copy those thus effectively deleting the chunk once all the chunks associated with a deleted file have cleaned up by the garbage collector the file header object can also be deleted yaffs2 mode does not write deletion markers and thus does not use soft deletion  ',0),(411,'und','node_search',' howyaffsworksdirectories0gif howyaffsworksdirectories0gif admin 6 june 2012 321am  ',0),(412,'und','node_search',' howyaffsworkstnodetree0gif howyaffsworkstnodetree0gif admin 6 june 2012 322am  ',0),(413,'und','node_search',' howyaffsworksblockstates0gif howyaffsworksblockstates0gif admin 6 june 2012 323am  ',0),(414,'und','node_search',' suitable for open and closed source projects  suitable for open and closed source projects admin 6 june 2012 824pm facogs if you want to use yaffs on an open source project then go ahead and download the gnu general public licence v2 now you can get it straight away from the link on the right of the page yaffs is also available under a commercial licence for projects that don t want to disclose their source code this licence does not have the obligations of gpl but is perpetual worldwide nonexclusive and carries no continuing royalty you can use the open source code to investigate and evaluate yaffs then before shipping your product to anyone outside of your organisation you buy a licence from aleph one which does not have the gnu gpl obligation to release your source code contact sales aleph1couk for more information or have a look at our licensing information   ',0),(415,'und','node_search',' for closed source projects try before you buy  for closed source projects try before you buy admin 7 june 2012 1155am facreditcard when shopping for a software component it s always useful to be able to try it out before buying for your proprietary projects the gpl version of yaffs lets you do just that download it examine the code and test it out check out our documentation and videos it s perfectly acceptable and safe to use the gnu gpl code inside your company providing you don t ship a binary to anyone beyond it that s when code disclosure and licensing provisions of the gnu gpl kick in so before you do that you ll want to talk to us about acquiring a paid licence  ',0),(416,'und','node_search',' yaffs is a safe choice  yaffs is a safe choice admin 7 june 2012 118pm fabullseye having started in 2002 yaffs embodies more than ten years of experience with flash memory and its specialised needs coupled with continued growth in the number of people and companies using yaffs since its inception numerous features and refinements have been added the code continues to evolve growing in value to users whilst retaining backward compatibility the community of users continues to grow as more and more people and companies opt to use yaffs providing a pool of knowledge which is accessible to new users the availability of the gnu general public licence version means that there s always an exit route for open source projects and since it s opensource existing commercial projects will at the very least always have the source code and the licence to continue to use it and likely much more plus commercial projects benefit from the open source experience in yaffs both with respect to developers and knowledge yaffs is a safe choice for any project needing a flash file system it has well over ten years of history proven sustainability a continuously improving codebase a growing user base and exit routes since it will continue to be available regardless of yaffsnet  ',0),(417,'und','node_search',' yaffs is fully supported  yaffs is fully supported admin 7 june 2012 802pm famapsigns yaffs support is available through the yaffs community primarily via the mail list with help coming from our key developers as well as other people who use yaffs for those times when you don t feel comfortable asking a question in a public forum perhaps because the project is sensitive we will normally answer a few questions offlist before we offer you the opportunity of consultancy and direct access to our developers and of course we are always willing to discuss other forms of support for customers who buy licences  ',0),(418,'und','node_search',' data is safe with yaffs  data is safe with yaffs admin 7 june 2012 834pm falock yaffs provides bad block handling and ecc algorithms to handle deficiencies in nand flash it is a logstructured file system which makes it very robust to corruptions caused by power failures we spend about 60 of development time on testing yaffs and our test harness is available for download so you can check the testing and perform some yourself we ve performed hundreds of thousands of tests to make sure that yaffs is as safe as we can make it even in the even of a power failure during a firmware update you can find full details of the yaffs testing regime in our paper http wwwyaffsnet documents yaffsrobustnessandtesting  including all the details on the powerfail stress tests the yaffs direct api tests for commercial rtoss linux testing and fuzz testing where we deliberately corrupt yaffs file systems to check that yaffs can still mount  ',0),(420,'und','node_search',' yaffs robustness and testing yaffs robustness and testing charles manning 8 june 2012 235am yaffsrobustnessandtestingpdf many embedded systems need to store critical data making reliable file systems an important part of modern embedded system design that robustness is not achieved through chance robustness is only achieved through design and extensive testing to verify that the file system functions correctly and is resistant to power failure this document describes some of the important design criteria and design features used to achieve a robust design 1 background cheaper cpus and flash have driven up embedded system functionality these increased functions often require file system storage the original flash file storage mechanisms were the use of a flash translation layer ftl a driver model which makes flash memory appear as a disk drive in conjunction with a diskoriented file system such as fat this storage methodology has various performance and robustness limitations leading to the development of file systems designed specifically for flash memory these are known as flash file systems flash memory has various limitations when compared with a disk for example flash memory pages cannot be individually rewritten but instead the whole block must be erased and rewritten with the modified page typical ftl achieve this with various logical to physical mapping schemes thus emulating disklike behaviour on flash memory adds an extra layer of software which slows down write performance worse still it adds extra state which is prone to corruption due to power failure a typical ftlbased solution will use a file system such as fat fat always stores tables in the same disk blocks and must thus change the same blocks often since flash memory blocks can endure a limited number of write erasure cycles the ftl must move the physical location of the block around to prevent the high traffic blocks from wearing out this requires wear levelling a further burden some systems try to mitigate against the performance penalties by caching a lot of data to reduce writes while this can go some way towards reducing the apparent write time it does make the solution prone to data loss in the event of a power failure as well as limitations flash memory also has certain advantages when compared to rotating media there is no spin up time making it more responsive there is no read head so there is no read penalty if data is fragmented flash file systems can be designed to exploit these advantages true flash file systems 1  on the other hand are a single code body designed to take the features and limitations of flash into consideration flash file systems can thus be far more flash friendly well designed flash file systems will avoid using flash unfriendly techniques such as allocation tables and inplace rewriting yaffs is a flash file system originally designed specifically for nand flash though also used with great success on nor flash too yaffs development started in 2001 when 32mbytes of flash was considered large since then yaffs has been expanded to work properly with different flash types and far larger memory arrays many gbytes yaffs was originally deployed in linux but was written in an os neutral way mainly to facilitate modular development and testing this turned out to be useful when we had requests to port yaffs to other operating systems since then yaffs has been used in many different products in a wide variety of applications from consumer products such as cell phones and sewing machines to aerospace industrial and medical applications including process control building management communications infrastructure and many others yaffs is not tied to any endian ordering and has been used on a wide variety of architectures including arm mips powerpc x86 some dsps yaffs has been deployed using a wide variety of compilers from many different vendors nor is yaffs tied to any particular operating system yaffs has been used with linux ecos windows embedded compact previously windows ce vxworks and others 2 flash file system considerations there are many criteria that are important when selecting a flash file system these are some that out customers have found to be most important robustness it really is not worth having a file system that loses or corrupts data and prevents the system from working properly some flash file systems are only robust when synced flushed after files have been written that requires extra code slows the system and leaves the file system in a nondeterministic state until the sync has been completed some file systems need to perform disk repair operations eg check disk in the event of a power failure this can add considerable time to the start up preventing the system from being operational performance in many embedded system designs slow read write performance can delay tasks and cause system degradation or even failure it is thus important that read write performance be acceptable note that many flash file systems need to perform extra actions such as garbage collection in some cases these actions can cause the file system to stall for a long time it is thus important that these factors be taken into consideration performance can sometimes be improved by adding a write caching layer these caching layers make the file system calls write etc proceed quickly without actually writing the data to flash this is a twoedged sword as data in the cache will be lost on a power failure and syncing the file system will take a long time thus most flash file systems offer either speed or robustness not both proven it is very easy for a file system vendor to provide a list of claims saying 100 power safe or similar but what evidence do they have to back this up all file systems including flash file systems are complex bodies of software with extremely complex state they need very significant testing to prove that they work correctly portable software is a huge investment and it is increasingly important to be able to port the software between oss and cpu architectures most flash file systems are limited to a single operating system which makes it difficult to migrate software between different platforms in yaffs case portability extends to being able to seamlessly migrate the core yaffs code into a test framework which enhances testing 3 how yaffs achieves robustness and performance yaffs was designed from the ground up specifically to work well with nand flash the author had already developed another flash file system so was already familiar with the design challenges of flash as yaffs is not just adapting a diskoriented file system to work with flash it is not surprising that yaffs is very different in design to most other file systems the key difference is that yaffs is a logstructured file system 2  in essence a log structured file system writes file system changes as a sequential log the log structure is particularly suitable for various reasons including all writes are at the end of the log when a file is modified there is no need to erase and rewrite a part of the flash changes are just appended to the log thus there is no need to erase and copy old data just to change some existing pages in a file this tends to make writes much faster there is no need to do a lot of caching to achieve performance data can be written to the log immediately meaning that sync time is very low data robustness is improved dramatically there are no allocation tables or similar this reduces the amount of data being written to the flash and that there are no tables to corrupt since all writes are to the end of the log there are no high traffic blocks this means yaffs only needs a simpler wear leveling strategy in the event of a power failure the file system state is easily recreated from the log this means there is no need to perform disk repair operations to correct for an unclean shutdown so why don t we see many log structured file systems for disk file systems the answer to this is that log file systems tend to spread the writes around on the media that is typically very problematic for mechanical storage which must physically move the read write head from one location to another making the access time very slow of course that does not apply for flash memory by designing specifically for flash yaffs can ignore this issue and write fast many flash file systems need make a compromise between robustness against performance thanks to the log structure yaffs does not need to yaffs can provide high performance without giving up on robustness those familiar with log structured file system design will know that some log structured file systems have problems with garbage collection 3  garbage collection is used to clean up the log and make more free space available some log structured file system designs did not pay enough attention to garbage collection and can stall for a considerable time while garbage collection happens yaffs was designed differently the potential impact of garbage collection was considered throughout the yaffs design process as a result yaffs has a very simple garbage collection model that allows a lot of flexibility in garbage collection scheduling this prevents the garbage collection from making the file system unresponsive most file systems are developed within the context and framework of a single operating system this typically makes the code difficult to explore debug and port yaffs on the other hand was developed from the start inside a portable development testing framework yaffs is then ported to various operating systems through the addition of glue code there are many benefits to this approach a development framework runs in user space which provides a richer development environment than inside an os kernel it is much easier to attach debuggers and perform logging and create reproducible testing the code is structured to be portable that makes it relatively easy to port to a new os or rtos with a high level of confidence there is a choice of porting interfaces allowing more flexibility to determine which porting method will be simpler for example the linux wrapper accesses the yaffs core directly while the windows ce wrapper access the yaffs direct interface 4  each different environment provides different test tools for example linux provides a raft of file system test tools that do different kinds of testing to the power fail test harness since the vast majority of the code is in the portable yaffs core that code gets the advantage of all test methods combined the many millions of android phone users that use yaffsbased devices are helping test the core code that is also used on a wide variety of different operating systems and a wide range of different device types its open source status means any interested person can take a version from git and test it to make sure that it meets their needs 4 testing it is all very well to design software to be robust but it needs thorough testing to build confidence in the software and in the code authors and supplier file systems have incredibly complex state so it is not at all surprising that operating system designers find file systems some of the most challenging code to test there is no single test methodology that can test all cases and exhaustive state testing is impossible the best we can do is to have a suite of test methodologies that combine to provide thorough testing approximately 60 of yaffs development effort is directed towards testing and improving the test environment we are constantly researching new methodologies the following are descriptions of the most important test strategies used in yaffs 41 power fail stress testing by far the most important consideration in yaffs testing is that it is robust to corruptions caused by power failure we want yaffs to provide the basis for reliable products in typical embedded system environments the first power fail testing was done by companies integrating yaffs into their products some of these built test jigs which would automatically interrupt power while running a real hardware device this approach is better than nothing but has some limitations it is relatively costly to set up flash has a limited lifetime meaning that test devices wear out with time and must be replaced it is relatively slow since each cycle takes many seconds to boot run the application for a while and then reboot many and perhaps most of the power interruptions will happen at times when the file system is inactive and thus be wasted cycles in 2008 we developed a simulated powerfailtest environment this simulates power failures using simulated flash memory while running various consistency checks the benefits of a softwarebased test harness are numerous the test harness controls the point at which the simulated power failures happen that means every test cycle counts no special hardware is required test loops run faster a quadcore computer can simulate ten to twenty power failures per second that means about a million power failure simulations per day the effectiveness of the new software based testing is dramatic a few times we have tested some usersuggested changes that had passed a week or more of realworld power fail testing only to have problems caught by the software simulation in a matter of minutes we regularly run the power fail simulation test over a weekend testing millions of power fail cycles 42 testing the yaffs direct interface api yaffs direct interface ydi is a posixlike wrapper around the yaffs core this provides a set of function calls yaffsopen yaffswrite and the like each function can return numerous error codes and has to handle numerous different parameters although there were already significant tests for the ydi an extensive test harness was developed in 2010 to comprehensively test each of the error paths and generate all of the required errors this provides a high level of confidence that the test interfaces do what they should and that posixlike functionality provides relatively clean porting of existing code 43 linux testing the main purpose of the linux testing is to test the linux wrapper code it does however still exercise the yaffs core code differently to other testing and thus adds to the test fabric the linux testing does not do power fail testing but instead tests other aspects such as clean shutdowns cache integrity and write performance this gives a useful way to assess the effects of modifications linux testing is done on both real hardware and on simulated hardware using the linux mtd nand simulator as with the power fail stress testing described above the simulated testing is done using a scrippted environment which is typically run for a few days at a time 44 fuzz testing fuzz testing deliberately corrupts the flash image and ensures that yaffs still mounts this is done to ensure that yaffs does not crash on corrupted data clearly fuzz testing can corrupt the contents of individual files that s its job but the file system integrity should not be compromised 45 software checking although code checking is not actual testing per se it does help to verify code changes the yaffs code has been checked with coverity 5  a market leader in code checking we are investigating the use of klee and other tools 46 open source usage open source usage of yaffs opens it up to testing by the many different projects many of these participate in some way with the yaffs mailing list helping to uncover issues and generally provide feedback each different project uses yaffs in a different way meaning that a wider range of operation sequences are tested 47 universities over its lifetime yaffs has been used as a teaching framework for various university course in many different counties around the world for example oregon state and utah state universities have used yaffs as a test bench for their postgraduate software testing courses they essentially test the test tools by injecting errors into the yaffs code and seeing if these are discovered by the test tools they are testing of course this has the side effect of running these tests over the original yaffs code too those interested in test methods are encouraged to read some of the university papers in the references of this document we expect to adopt and extend some of the oregon state ideas and use these to extend our inhouse test suite 5 conclusions software development is an iterative process of design and testing robust software solutions are only possible with extensive testing embedded systems increasingly need to store data in file systems as a critical part of their operation it is thus important to have a file system that is predictable and robust to power failure and similar interruptions yaffs has been designed from scratch to be robust to power failure and that robustness has been verified with a multipronged test strategy that is continuously being improved 6references charles manning how yaffs works  http usersactrixconz manningc yaffsdocs howyaffsworkspdf a groce et al swarm testing from oregon state university school of ee and computer science and utah state university school of computing 2011 http  wwwctutahedu regehr papers swarm12pdf wu ch efficient initialization and crash recovery for log  based file systems over flash memory from national taiwan university dept of computer science 2006 http wwwcisnctuedutw lpchang papers sacwusac06pdf 1 note that flash translation layers ftls are erroneously refered to as flash file systems for example despite the name msystems trueffs is not a flash file system but a flash translation layer ftl  2 this document only provides a brief overview of the yaffs architecture and design the how yaffs works document provides an indepth explanation of the yaffs design and architecture 3 refer to the how yaffs works document to understand the need for garbage collection and how yaffs does garbage collection 4 for more information on yaffs direct interface please read the various documents on the subject 5 http wwwcoveritycom  ',0),(426,'und','node_search',' high and low level interfaces  high and low level interfaces admin 16 june 2012 830pm fastethoscope we provide a high level interface with the gpl version of yaffs so it s easy to use with linux and other os s that support posix this support includes directories symbolic and hard links through standard file system interface calls but when you want to integrate yaffs directly into your os or your code you ll most likely want to make use of the yaffs direct interface or other lowlevel interfaces application interface this is the interface that the application code uses to access the yaffs file system rtos integration interface these are the functions that much be provided for yaffs to access the rtos system resources nand configuration and access interface these are the functions that must be provided for yaffs to access the nand flash have a look at the guides in the documents section to find out more about integrating yaffs   ',0),(427,'und','node_search',' crossplatform and portable  crossplatform and portable admin 16 june 2012 840pm fatruck yaffs is easy to port it is written in c with particular attention paid to making it portable it s cpu independent high low bit independent endian neutral and doesn t rely on any particular operating system look at the schematic in the yaffs overview  to see the relationship of the different elements it s already been used under linux ecos vxworks win ce and more yaffs has been used successfully with many different 32bit and 64bit cpus including mips 68000 many from arm coldfire powerpc and x86 variants yaffs works with 16bit cpus too but this is less tested and might need some tuning depending on compiler options we ve found it easy to move to different processor architectures because it was designed to do this as long as your processor is greater than 8bit yaffs should run without needing much work read  http wwwyaffsnet yaffsportingguide for more detail  ',0),(428,'und','node_search',' a file system designed for flash memory  a file system designed for flash memory admin 16 june 2012 1111pm famicrochip yaffs was designed from the ground up for flash memory it is best with nand flash but can be used with nor too it has mechanisms for wearlevelling and special attention has been paid to the safety of the system even under powerfailure it is works well with mlc nand as well as slc it is compatible with a wide range of flash including toshiba sandisk mlc parts see also the document considerations in using a flash file system for a discussion of the importance of reliability  ',0),(430,'und','node_search',' get yaffs nowpng get yaffs nowpng admin 25 june 2012 636pm  ',0),(431,'und','node_search',' get yaffs nowpng get yaffs nowpng admin 25 june 2012 637pm  ',0),(432,'und','node_search',' yaffsrobustnessstructurepng yaffsrobustnessstructurepng admin 27 june 2012 652pm  ',0),(433,'und','node_search',' predictable and performance oriented predictable and performance oriented admin 6 july 2012 948am faplug yaffs has highly optimised and predictable garbage collection strategies this makes it high performance and very deterministic when compared with similar file systems  ',0),(434,'und','node_search',' memory efficiency memory efficiency admin 6 july 2012 1023am fasortamountasc yaffs has a lower memory footprint than most other logstructured flash file systems because it is logstructured ram is required to build up runtime data structures for acceptable performance as a rule of thumb yaffs uses approximately 2 bytes per chunk of nand flash where a chunk is typically one page of nand for nand with 512byte pages a budget of approximately 4kbytes of ram per 1mbyte of nand is usually sensible and for 2kbyte page devices a budget of approximately 1kbyte per 1mbyte of nand usually suffices you can find out details of yaffs memory use in the document  http wwwyaffsnet documents howyaffsworks ',0),(435,'und','node_search',' highly configurable matches your flash memory highly configurable matches your flash memory admin 6 july 2012 1031am fachecksquare yaffs is adaptable to suit the flash geometries caching options error correction strategies and other features that you need details of the configuration options can be found in the linux menuconfig compile options tool and in  http wwwyaffsnet yaffstuningandconfiguration ',0),(436,'und','node_search',' simple to integrate simple to integrate admin 6 july 2012 1035am fapuzzlepiece yaffs direct interface is simple to integrate in a system only a few interface functions are required yaffs also includes a posix interface it has been used with android vxworks windows linux bare metal and more on arm 32 and 64 x86 32 and 64 atmel and more you can find details in the yaffs direct guide  ',0),(448,'und','node_search',' faq faq admin 8 july 2012 1130pm what operating system os can you use with yaffs  yaffs is agnostic about the os it is used with it has been used with many different oss including linux ecos windows ce threadx psos and vxworks it is posixcompliant so commands in an application calling posix functions will usually work windows ce uses the microsoft file handling model and is not posixlike the difference is handled in the windows ce wrapper contact us for more information work on closer integration of yaffs into the linux kernel started in 2010 and the goal is to have yaffs merged into the mainline linux kernel the yaffs direct interface ydi is the heart of yaffs and usually stands between the application on one side and the flash chips and any os on the other side  what cpu can you use with yaffs  yaffs has been used with many 32bit and 64bit cpus including mips 68000 coldfire powerpc x86 variants and many armcored cpus it should work with 16bit cpus but has not been tested does yaffs care whichendian the cpu is  no yaffs works with bigendian and littleendian cpus how big can the whole file system be and how big can individual files be  yaffs2 which is now standard can handle a file system fs of many gigabytes total storage some people are using it with 6gb satisfactorily  individual  files are currently limited to 2gb the basic yaffs architecture can handle larger single files and some changes would be required to support individual files greater than 2g bytes there is an upper limit of around 32gb with the present 2k bytes granularity of chunks or page size and the limit of about 16 million chunks per file a coarser granularity of larger chunks can probably be obtained with knockon effects in other parameters like ram usage how many files can there be  there is no hard limit available flash and ram will limit this what about directories etc  yaffs supports many different objects including directories regular files hard links symbolic links and device nodes yaffs supports long file names attributes extended attributes and unicode how much ram does it need  this depends particularly on the number of tnodes which in turn depends on the file size and is therefore a dynamic variable however yaffs compares favourably with other similar systems specialised for flash and includes robust error handling how are errors handled  error correction code ecc is used to correct for singlebit errors ecc may use builtin code or that provided from other sources flash controllers ecc libraries etc yaffs is frequently tested on a fuzzer test harness this randomly corrupts bits of the file system image to check that the file system still mounts and loads correctly what about multilevel cell mlc chips  because a bit is represented by a smaller amount of charge in the mlc chip compared to a slc chip mlc chips are more prone to corruption than slc mlc also has various write restrictions which are obeyed by yaffs2 yaffs2 has some features such as block refreshing to help alleviate the problems associated with mlc mlc generally requires multibit ecc hardware ecc is preferred since it is faster and requires less computation than software multibit correction  how robust is yaffs  yaffs is designed specifically to take account of manufacturing faults in and of accumulated wear in individual cells and also to handle power failures during use yaffs allocates flash blocks in a way that gives statistical or implicit wear levelling when a block is freed up it is released into a  free pool  and the next allocation comes from this  free pool  this randomness tends to spread the blocks in use giving some wear levelling rather than one part of the file always being worked intensively accelerated lifetime testing has been carried out to seek evidence for excessive wear for example on one professional pdastyle device used by surveyors in the field we determined that extreme lifetime usage would be 20mb per day 200 days per year 10 year lifetime total 40gbytes lifetime write we then ran well over 200gbytes of writing through a specially designed file system exerciser a multithreaded application that writes reads verifies then deletes repeatedly there was no sign of a single bit of corruption at the end of the test another test applied randomly timed power failures repeatedly while running test code millions of cycles have been executed without any errors being observed yaffs is used under gpl in the android mobile phones sold by google and others extensive use in the field like this helps to ensure its robustness how big is its code  that depends on how much of it you need it is modular in organisation the innermost or core part is about 11k lines of code the the yaffs direct interface giving file handle access and a posixlike interface is around 2k lines glossary and useful links bigendian and littleendian bigendian is when the most significant data chunk is listed first littleendian is when the least significant data chunk is listed first http enwikipediaorg wiki endianness tnodes tnodes are yaffs data structures used to build trees that map from a file to the file data chunks stored in flash a large file will have multiple data chunks scattered throughout the flash and will need a larger tnode tree see the howyaffs works document for more information ecc error correction codes see the  yaffs error mitigation  document mlc multilevel cell allows more than one bit state to be stored in a memory cell mlc flash often allows four state ie 2 bits to be stored in one cell  http enwikipediaorg wiki multilevelcell   ',0),(451,'und','node_search',' yaffs tuning yaffs tuning admin 22 july 2012 823pm yaffstuningpdf 9147 kb  1 yaffs direct configuration yaffs behaviour is dictated by compile time and runtime flags 11 initialisation parameters each yaffs device is configured by a yaffsdeviceparameterstruct structure which is part of the yaffsdevicestruct structure this contains the following fields name an optional name for the device totalbytesperchunk the number of bytes in the data area of the flash page if inbandtags is not set then this whole area will be used to store data and the tags will be stored in the spare area if inbandtags is set then part of this area will be used to store tags and the rest will be used to store data sparebytesperchunk the number of available bytes in the spare area of the flash page this excludes space used by ecc bad block markers etc startblock the first block in the partition to be used  for first block endblock the last block in the partition to be used nreservedblocks number of good blocks blocks reserved for garbage collection etc needs to be at least 2 but 5 would be a more typical number inbandtags yaffs2 only flag indicating whether tags should be stored in the data area if inbandtags is set then the short op cache must be enabled ie nshortopcaches must be nonzero usenandecc yaffs1 only flag indicating whether the driver performs ecc if this is zero then yaffs will perform ecc notagsecc yaffs2 only flag indicating whether the tags have ecc attached to them isyaffs2 flag indicating if this is using the yaffs2 mechanism if this is not set then yaffs1 mode of operation is provided nshortopcaches number of chunks to store in the short operation cache zero disables caching typical value is 10 to 20 or so caching is required for inband tags emptylostandfound flag to delete all files in lost and found on mount skipcheckpointread yaffs2 only flag to skip reading checkpoint on mount if set then a rescan is forced skipcheckpointwrite yaffs2 only flag to skip writing checkpoint on sync or unmount refreshperiod yaffs2 only how often yaffs should do a block refresh values less than 10 disable block refreshing typical values would be1000 initialisenand pointer to function to initialise flash driver deinitialisenand pointer to function to deinitialise flash driver eraseblockinnand pointer to function to erase a flash block writechunktonand yaffs1 only pointer to function to write a chunk readchunkfromnand yaffs1 only pointer to function to read a chunk writechunkwithtagstonand yaffs2 only pointer to function to write a chunk plus tags readchunkwithtagsfromnand yaffs2 only pointer to function to read a chunk plus tags marknandblockbad yaffs2 only function to mark a block bad querynandblock yaffs2 only function to query a block state gccontrol callback function that returns the garbage collector control flags this is optional removeobjectcallback callback function called when an object is removed this is set by the wrapper marksuperblockdirty callback function that is called when a clean file system is first modified this is set by the wrapper disablesoftdelete yaffs1 only debug only disables soft deletion if nonzero useheaderfilesize debug only leave as zero disablelazyloading debug only leave as zero widetnodedisabled debug only leave as zero deferdirectoryupdate used to defer directory updates  12 compiletime settings these setting are used to apply compiletime configurations configyaffsalwayscheckchunkerased normally yaffs checks that chunks are erased only on the first chunk write to each block this flag allows you to force all chunks to be checked this is slower but is worth using when doing early debugging configyaffscaseinsensitive when selected case insensitive name comparisons are used note that this will not magically change yaffs to be case insensitive in a case sensitive os this needs to be set according to the os policy typically this is only used in windows ce configyaffsdirect used when compiling yaffs direct configyaffsdisablelazyload lazy loading is used to defer loading up object details until the objects are accessed this makes mount time faster this flag can disable lazy loading debug only configyaffseccwrongorder this flag should only be used with old linux mtd code which had a bug in the ecc byte ordering configyaffsnoyaffs1 used to say that only yaffs2 operation should be compiled in not currently supported configyaffsshortnamesinram set to configure yaffs to store short object names in ram this is faster but uses up more memory configyaffsunicode set to configure yaffs to use unicode file names eg with wince configyaffsuseownsort by default yaffs uses qsort for sorting blocks at mount scanning time this is faster using this flag forces yaffs to use a slow internal sort instead debug only configyaffsutil used when compiling yaffs for utilities configyaffswince set when compiling yaffs for wince configyaffsyaffs2 set when using yaffs2 mode at present this must always be set configyaffsfsprovidevalues used when compiling yaffs direct only 2 tracing mechanism yaffs has a lot of built in tracing to help debug and integrate the tracing is controlled by yaffstracemask bitmask which allows various sets of tracing to be disabled or enabled at runtime the trace bits are specified in the yaffstraceh file the tracing mechanism has also been hijacked to provide a control mask for extra verification code when the yaffstraceverifyxxx trace bits are selected the tracing mechanism is readily integrated into the system via printflike statements tracing is all done through macros which allow the strings to be converted into unicode or similar if need be 3 linux 31 linux compiletime flags the linux compile time flags are documented in the kconfig file and will not be duplicated here 32 linux proc yaffs trace adjustment under linux the tracing mechanism is hooked up to both the proc yaffs and the sys interface the proc yaffs interface is very user friendly cat os proc yaffs enables yaffstraceos cat all gc proc yaffs disables everything then enable yaffstracegc cat 0xf000 proc yaffs set trace mask to specified bitmask 33 linux sys interface the linux sys interface is used by many linux os components to access the state of control variables some yaffs variables are available via sys module yaffs2 parameters values can be read and modified using standard shell commands or from application programs ls sys module yaffs2 parameters yaffsautocheckpoint yaffstracemask yaffswrattempts cat sys module yaffs2 parameters yaffsautocheckpoint 1 echo 2 sys module yaffs2 parameters yaffsautocheckpoint cat sys module yaffs2 parameters yaffsautocheckpoint 2 yaffs currently supports the following variables yaffsautocheckpoint controls when checkpoints should be written yaffstracemask an alternative and less user friendly interface to modify tracing yaffswrattempts the number of attempts that yaffs will make to write a chunk yaffsgccontrol controls the garbage collector 34 linux proc yaffs state dumping some of the state of yaffs mounts can be determined by reading the proc yaffs entry cat proc yaffs charles charleslaptop opt y cvs yaffs2 cat proc yaffs yaffs built mar 16 2010 115225 id yaffsfsc v 1101 20100315 222715 charles exp id yaffsgutsc v 1119 20100312 24834 charles exp device  nand simulator partition  startblock  endblock 511 totalbytesperchunk 2048 usenandecc 1 notagsecc  isyaffs2 1 inbandtags  emptylostandfound 1 disablelazyload  refreshperiod 10000 nshortopcaches 10 nreservedblocks 5 ndatabytesperchunk 2048 chunkgroupbits  chunkgroupsize 1 nerasedblocks 152 blocksincheckpoint  ntnodescreated 2300 nfreetnodes 1852 nobjectscreated 2300 nfreeobjects 1842 nfreechunks 27843 npagewrites 65993 npagereads 19631 nblockerasures 1133 ngccopies 37 garbagecollections 161 passivegcs 137 nretriedwrites  nretireblocks  eccfixed  eccunfixed  tagseccfixed  tagseccunfixed  cachehits 44110 ndeletedfiles  nunlinkedfiles 42917 refreshcount 1 nbackgrouddeletions   4 conclusions yaffs includes many options for changing speed or memory use with specific flags for the yaffs direct interface as well as linux under linux many of the control variables can be altered using standard linux systems  ',0),(452,'und','node_search',' yaffs introduction and overview video yaffs introduction and overview video admin 31 december 2007 1200am this video  from 2007 describes yaffs1 and yaffs2 the  slides  from the video are available  ',0),(453,'und','node_search',' yaffs direct interface yaffs direct interface admin 23 july 2012 1237am yaffsdirectpdf this document describes the yaffs direct interface ydi which allows yaffs to be simply integrated with embedded systems with or without an rtos 1 background the purpose of this document is to describe the interfacing of the yaffs direct interface ydi as well as to provide sufficient information to allow a preliminary evaluation of yaffs this document tries to focus on the issues important to the system integrator without getting too detailed about how yaffs works other documents provide an indepth discussion of how yaffs works 2 licensing yaffs was originally released for linux under the gnu public license gpl various embedded developers soon identified that yaffs would be ideal for their applications but were not able to use gpl based code in their systems aleph one has alternative licensing arrangements to support such applications 3 what are yaffs and yaffs direct interface  yaffs stands for yet another flash file system  yaffs was the first file system designed from the ground up for nand storage in 2002 aleph one set out to identify file system options for using nand flash as a file system various file systems available at the time were evaluated and all were found lacking in one way or another the need for a suitable nand storage file system was identified and yaffs was designed to fill that need although yaffs was originally designed for nand flash it has been used successfully with nor flash systems and even as a ram file system this allows high reliability file systems to be constructed using nor flash with a future migration path to nand flash for higher density and performance yaffs was originally designed for use with the linux operating system but was designed in a very modular way the operatingsystemspecific code was kept separate from the main yaffs file system code this allows yaffs to be ported quite cleanly to other operating systems through operating system personality modules one such personality module is the yaffs direct interface ydi which allows yaffs to be simply integrated with embedded systems with or without an rtos yaffs has been used for many products using various operating systems including windows ce and various rtoss including threadx vxworks psos to name just a few note that there is a native port of yaffs to ecos that does not use ydi this is supported and distributed by ecoccentric http wwwecoscentriccom yaffs2 a more recent release of yaffs supports a wider range of nand flash components including 2k page devices and devices with multilevel cells mlc and produces equivalent or better performance it include yaffs1 compatibility code so yaffs1 images still work and migration is quite simple yaffs1 or yaffs2 mode of operation are simply selected by a runtime parameter as well as providing a nand file system ydi also provides a ram emulation layer to allow yaffs to operate as a ram file system too while the ram emulation is perhaps not as efficient as a dedicated ram file system this does allow one well proven file system to use both ram and flash 4 why use yaffs  yaffs is the first and perhaps only file system designed specifically for nand flash this means that yaffs has been designed to work around the various limitations and quirks of nand flash as well as exploit the various features of nand to achieve an effective file system some features to consider yaffs has been well proven and has been used to ship in large volumes in several products using many different operating systems compilers and processors yaffs is written in portable c and is endian neutral yaffs provides bad block handling and ecc algorithms to handle deficiencies in nand flash yaffs is a logstructured file system which makes it very robust to corruptions caused by power failures etc yaffs has highly optimised and predictable garbage collection strategies this makes it high performance and very deterministic when compared with similar file systems yaffs has a lower memory footprint than most other logstructured flash file systems yaffs provides a wide range of posixstyle file system support including directories symbolic and hard links etc through standard file system interface calls yaffs is h ighly configurable to work with various flash geometries various ecc options caching options etc yaffs direct interface is simple to integrate in a system only a few interface functions are required yaffs can be used with a wide range of memory technologies 5 source code and yaffs resources please note the licensing terms that apply to using the yaffs code http wwwyaffsnet serves as the hub for all yaffs information this document refers to the yaffs source code extensively and is available via the download link on this site there are various other documents and a yaffs mailing list for yaffs discussions consulting services are also available 6 system requirements determining minimum system requirements is often quite difficult the following are presented as a guideline only contact aleph one for more detailed analysis if required yaffs is endianneutral and works fine with littleendian and bigendian processors yaffs code has been used successfully with many different 32bit and 64bit cpus including mips 68000 arm coldfire powerpc and x86 variants yaffs has even been used with various dsp architectures yaffs should work with 16bit cpus too but this is generally untested and might need some tuning depending on compiler options because yaffs is log structured ram is required to build up runtime data structures for acceptable performance as a rule of thumb budget approximately 2 bytes per chunk of nand flash where a chunk is typically one page of nand for nand with 512byte pages budget approximately 4kbytes of ram per 1mbyte of nand for 2kbyte page devices budget approximately 1kbyte per 1mbyte of nand 7 how to integrate yaffs with an rtos embedded system yaffs direct interface ydi wraps yaffs in a way that is simple to integrate you need to provide a few functions for yaffs to use to talk to your hardware and rtos yaffs provides a set of posixcompliant functions for applications to use to talk to it in addition to the yaffs core file system the ydi has three parts which are each explained in more detail in further sections  posix application interface  this is the posixlike interface that the application code uses to access the yaffs file system  open close read write  etc  rtos integration interface  these are the functions that must be provided for yaffs to access the rtos system resources  initialise lock unlock get time  memory allocation  set error  etc  note that although we use the term rtos the same can be done with other oss or even with no rtos at all in a baremetal system flash device interface  this interface support is where the flash device and appropriate device drivers are installed to provide an access path from yaffs to the flash device s multiple different devices and device types can be supported simultaneously 71 source files the following source files contain the core file system yaffsallocatorc allocates yaffs object and tnode structures yaffsbitmapc block and chunk bitmap handling code yaffscheckpointrwc streamer for writing checkpoint data yaffseccc 1bit hamming ecc code yaffsgutsc the major yaffs algorithms yaffsnamevalc name value code for handling extended attributes xattr yaffsnandc flash interfacing abstraction yaffspackedtags1c yaffspackedtags2c tags packing code yaffssummaryc code for handling block summaries yaffstagscompatc tags compatibility code to support yaffs1 mode yaffstagsmarshallc tags marshalling code yaffsverifyc test verification code yaffsyaffs1c yaffs1mode specific code yaffsyaffs2c yaffs2mode specific code the yaffs direct interface is in yaffsfsc with the interface functions and structures defined in yaffsfdh yaffsattribsc attribute handling yaffserrorc error reporting code yaffsfsc yaffs direct interface wrapper code yaffshweightc counts the number of hot bits in a byte word etc yaffsqsortc qsort used during yaffs2 scanning example flash drivers simulators and configurations used for testing are are in direct testframework directory these include nanddrvc a nand driver layer that performs the commands to access nand flash in a rudimentary manner this code should work on many styles of cpu with little modification yaffsnanddrvc a wrapper around the nand driver which plugs it into yaffs nandsimc a nand simulator layer that works with a nandstorexxx backing store this simulates a nand chip nandstorefilec a storage backend for a nand simulator that stores the data to file nandsimfilec a wrapper around nandsimc and nandstorefilec which makes a nand simulator that saves its data in a file yaffsnandsimfilec a wrapper which creates a nand simulator instance hooks up the yaffs nand driver and then adds it to yaffs for use yaffsnordrvc yaffsm18drvc a driver for intel m18style nor flash yaffsosgluec an os glue layer example used in the test harness example and testing build files dtestc a test harness also has sample code that can be used for better understanding of how some function calls work yaffscfg2kc a test configuration yaffsfileemc yaffsfileem2kc nand flash simulation using a file as backing store further testing files are in direct tests and direct python 72 integrating the posix application interface the application interface is defined in yaffsfsh these provide a posix file system interface for the most part this interface consists of the standard clib function names prefixed with yaffs for example yaffsopen yaffsclose etc there is a lot of flexibility in how these functions are used and the system integrator needs to determine the best strategy for the system these functions can be used directly with the code written using these names for example int main initialisation f yaffsopen yaffsread f yaffsclose f the yaffs functions can also be wrapped in some way to allow existing code to use yaffs without modification for example define open path oflag mode yaffsopen path oflag mode int main initialisation f open read f close f a more complex approach that can be used if more than one filesystem is used is to provide redirection functions for example int open const char path determine which file system is being used i f itisayaffspath path return yaffsopen else do something else some rtos s provide a flexible way to integrate file systems in which case ydi can typically use these interfaces to access yaffs file systems 8 rtos integration interface before yaffs can be used it needs to be integrated with the system and configured so that the correct actions are performed to do this you need to modify the configuration file an example configuration file is presented in yaffscfgc and yaffscfg2kc this is a relatively straight forward process and defines the rtos access functions the rtos access functions are void yaffsfsseterror int err called by yaffs to set the system error void yaffsfslock void called by yaffs to lock yaffs from multithreaded access void yaffsfsunlock void called by yaffs to unlock yaffs u32 yaffsfscurrenttime void get current time from rtos void yaffsfsmalloc sizet size   called to allocate memory void yaffsfsfree void ptr   called to free memory void yaffsfs os initialisation void called to initialise rtos context void yaffsbugfn const char filename int lineno   function to report a bug int yaffsfscheckmemregion const void addr sizet size int writ erequest  function to check if accesses to a memory region is valid this function must return zero if the test passes and negative if it fails if yaffs is being used in a multithreaded environment then typically yaffslocalinitialisation will initialise a suitable rtos semaphore and yaffslock and yaffsunlock will call the appropriate functions to lock and release the semaphore yaffscurrenttime can be any time increment of use to the system if this is not required then it is fine to just use a function that is hardwired to return zero before the application code uses yaffs the yaffs fs osinitialisation function must be called yaffsfscheckmemregion  is used to check addresses passed to the various yaffsxxx functions yaffsopen yaffsread etc if the function returns 1 then the yaffsxxx function will return efault rather than attempt to dereference the address and crash an implementation might do something like  int yaffsfscheckmemregion const void addr sizet size int write request  u32 uaddr b  u32 addr  u32 uaddrt uaddrb size 1  if uaddr b  stackbottom uaddr b  stacktop  uaddrt stackbottom uaddrt stacktop return   r w access is ok  if uaddr b   heap bottom uaddr b   heap top  uaddrt heapbottom uaddrt heaptop return   r w access is ok  if  writerequest  uaddr b   rom bottom uaddr b   rom top  uaddrt rombottom uaddrt romtop return   read access is ok  return 1 bad access    9 yaffs nand model before defining the flash integration interface it is important to understand the model and corresponding nomenclature used throughout yaffs and its documentation yaffs uses a fairly abstract model for nand flash this allows a lot of flexibility in the way it can be used yaffs is designed for nand flash and makes the following assumptions and definitions the flash is arranged in blocks  each block is the same size and comprises an integer number of chunks each block is treated as a single erasable item a block contains a number of chunks a chunk equates to the allocation units of flash for yaffs1 each chunk equates to a 512byte or larger nand page that is a 512byte or larger data portion and a 16byte spare area for yaffs2 a chunk will typically be larger eg on 2k page devices a chunk will typically be a single 2k page 2kbytes of data and 64 bytes of spare yaffs2 is capable of working with smaller chunk sizes by using inband tags all accesses reads and writes are page chunk aligned some reads might only read the spare area where the tags are kept when programming a nand flash only the zero bits in the pattern being programmed are relevant and one bits are don t care for example if a byte already contains the binary pattern b1010 then programming b1001 will result in the pattern which is the logical and of these two patterns ie b1000 this is different to nor flash which would typically abort the attempt to convert a  into a 1 yaffs ide ntifies blocks by their block number and chunks by the chunk id a chunk id is calculated as chunkid blockid chunksperblock chunkoffsetinblock yaffs treats a blank 0xff filled block as being free or erased thus the equivalent of formatting for a yaffs partition is to erase all the blocks that are not bad yaffs2 has a generalised tags interface to provide better flexibility to cater for a wider range of devices with larger pages and stricter programming limitations yaffs2 thus handles more abstract constructs than yaffs1 and in older versions of yaffs more effort was required to interface to the nand in newer versions of yaffs the tags management has been abstracted out of the driver this makes the driver interface far simpler 91 formatting yaffs treats erased blocks as empty that makes it really easy to format a device just erase it note that this should be done while the partition is not mounted unmounting will not normally work when the file system is busy eg files are open some extra nonstandard unmount options are provided to enable an unmount to be forced note that using these will break any current handles and you will no longer be able to use open files there is a yaffsformat  function that will take care of the details 92 nand model considerations for yaffs1 the historical yaffs1 tags structure was laid out in accordance with the smartmedia specification for use with 512byte pages there is now much more flexibility in the way things can be configured yaffs1 is capable of being used with a variety of memory layouts so long as the flash supports the ability to overwrite the tags area to set the deletion marker to zero if the yaffsdev s usenandecc field is not set then yaffs will perform the ecc calculations if this is set then yaffs will expect the nand driver to do any required ecc checks on devices that are not using ecc for example nor set usenandecc 1 and then don t do any ecc anyway the yaffs1 flash model expects an area of 16 spare bytes some of which are used for tags the mapping between the spare bytes and the usage of the bytes is specified in yaffspackedtags1c the yaffs1 model has been used in many norbased systems one particularly instructive example is in yaffsnordrvc which implements a driver for yaffs1 mode on cfistyle nor flash this does not use ecc but uses checksumming instead the yaffsdev structure has a yaffsdriver structure which holds the function pointers to the driver for yaffs1 mode of operations the following are required drvwritechunkfn write a data chunk drvreadchunkfn read a data chunk drverasefn erase a block drvinitialisefn initialisation drvdeinitialisefn deinitialise these functions are described later 93 nand model for yaffs2 the yaffs2 interface is far more flexible than yaffs1 but that means a bit more effort must be done in the driver in particular there is is no standard spare area ecc layout the driver must handle all the layout of the spare area and ecc handling there is not a standard implementation for bad block markers thus the driver must provide functions for checking and marking bad blocks the yaffsdriver structure for yaffs2 mode requires the following functions drvwritechunkfn write a data chunk drvreadchunkfn read a data chunk drverasefn erase a block drvmarkbadfn mark a block bad drvcheckbadfn check bad block status of a block drvinitialisefn initialisation drvdeinitialisefn deinitialise 94 overview of flash driver function the best way to understand how to write these functions is to look at the example drivers int drvwritechunkfn struct yaffsdev dev int nandchunk const u8 data int datalen const u8 oob int ooblen this function writes the specified chunk data and oob spare data to flash this function should return yaffsok on success or yaffsfail on failure if this is a yaffs2 device or yaffs1 with usenandecc set then this function must take care of any ecc that is required int drvreadchunkfn struct yaffsdev dev int nandchunk u8 data int datalen u8 oob int ooblen enum yaffseccresult eccresult this function reads the specified chunk data and oob spare data from flash this function should return yaffsok on success or yaffsfail on failure if this is a yaffs2 device or yaffs1 with usenandecc set then this function must take care of any ecc that is required and set the eccresult int drverasefn struct yaffsdev dev int blockno this function erases the specified block this function should return yaffsok on success or yaffsfail on failure int drvmarkbadfn struct yaffsdev dev int blockno int drvcheckbadfn struct yaffsdev dev int blockno these functions are only required for yaffs2 mode they mark a block bad or check if it is bad int drvinitialisefn struct yaffsdev dev int drvdeinitialisefn struct yaffsdev dev these functions provide hooks for initialising or deinitialising the flash driver 10 configuration and flash driver installation for an example of how to do the configuration refer to yaffscfg2kc and one of the drivers such as yaffsnanddrvc the old mechanism was static and required a table of devices that was installed at start up this mechanism had shortcomings in particular it broke modularity and did not allow devices to be added dynamically things are different now as any time a yaffsdev structure can be configured and then registered with yaffs by using the yaffsadddevice function a yaffsdev structure has two parts which must be configured before yaffsadddevice is called the paramers dev param and the driver dev drv the driver configuration plugging in the driver functions has already been described above so we will now look at the yaffs parameters the yaffsparam structure must be set before the yaffsdev is added with yaffsadddevice and should not be modified after that the params are defined in the yaffs tuning document 11 using the posix file system interface this section is directed to readers that might not be very familiar with accessing a file system via posix and posixlike interfaces 111 difference to windows posixlike interfaces msdos and windows provide a posixlke interface if you are familiar with this then that will help you there are are however some slight differences most importantly windows has no concept of links and has a 11 mapping between file names and filesposix supports files with zero one or many names refer to the sections on linking and unlinking files for instance posix allows you to unlink a file ie delete the name for a file while it is still in use you can continue to read write the file but it will be deleted as soon as the last file handle to the file is closed windows on the other hand does not allow you to unlink a file while it is in use windows names drives with a letter posix has no drive letters the whole posix file system is in a single directory tree directories and folders are the same thing 112 fundamental concepts file a file is an object that is stored in the file system yaffs supports the following file types a regular file is a sequence of bytes stored in the file system a directory holds links to other files a symbolic link holds a name to another file a special file holds device ids or similar information directory this is a structure that holds links and allows a file to be found by name note that a single file may have many links ie names and many be found in many places in the directory structure link this is a name that allows the file to be found there are two types of link real links sometimes called hard links and symbolic or soft links handle a file handle provides a context from which a file can be accessed and manipulated a handle has a current file position pointer which points to where the file is being read or written multiple handles can simultaneously access a single file file mode the mode is the set of flags that define the type of file as well as the current permissions associated with the file path this is a string that defines the directories and file name for example data direct1 file1 file metadata this is the information about the file excluding the file contents the metadata includes the name mode size and other details mount partition file system these terms all refer to a single mounted flash area each mount is hooked into a common directory structure the term file system can sometimes be confusing because it is used both for a single mounted partition as well as the the file system code in other words we might say that both boot is a file system and might also say that yaffs is a file system inode number the inode number is a unique number that identifies the object within the mount note that inodes are not unique between two or more mounts there is no way to reach a file by inode only via its links 113 error code most functions result in error codes if the function does not execute successfully in these cases yaffs calls a function called yaffsseterror with the error value this function can be configured to deliver the error into the system s error mechanism in the case of functions that return integers a returned value smaller than  indicates an error occurred functions returning pointers will return null if an error occurred 114 links the hard kind not symbolic links  at first we re just considering real links and not symbolic links sometimes real links are also called hard links to differentiate them from symbolic links which are sometimes called soft links the difference between links and files is subtle and can be confusing briefly a file is the stored object in the file system the link is how it is hooked into the directory structure the first link to a file is created by using the file creation calls yaffsopen yaffsmknod yaffssymlink and yaffsmkdir a link can be destroyed by using the yaffsunlink function directories are destroyed using the yaffsrmdir function oh and the directory must be empty once a file is both unused there are no handles open to it and there are no links to it it is then deleted a link can be renamed by using the yaffsrename function a file may have many links these may be created using the yaffslink function all the links access the same file and there is no one link that is considered the real link and others being the duplicate link all links to a file have the same priority if you look at the inode number for a and for b then they will be the same because they are refering to exactly the same file thus if we start with a file called a and then call yaffslink a b we now have two links to the same file we can t tell them apart if we now unlink a the file still exists under the link b if we now unlink b the file will no longer be linked if there is a handle open to the file then we can still access the file through the handle and continue to read or modify the file if there is no link to the file it is deleted if an unlinked file was kept alive because of a handle being open the file will not show up in the directory structure because it has no link and will be deleted as soon as the handle is closed or if the file system is unmounted there are some limitations in how links are used the existing file you are linking to must exist the file you are linking to must be in the same mount partition as the link you are creating you cannot create a link to a directory because this would allow the creation of recursive loops the new link name must not exist 115 symbolic links now that you understand how hard links work we ll introduce symbolic or soft links a symbolic link holds an alias for a different object when you use that symbolic link in a path the alias is used instead to that extent symbolic link and hard links are the same you can remove symbolic links with the yaffsunlink function just like hard links there are however some important differences a symbolic link only does its linking function when the path is being evaluated and thus the file you are creating an alias to does not have to exist the file you are creating an alias to does not have to be in the same mount you can create symbolic links to directories a symbolic link will not keep a file alive by itself only a hard link can do that thus if we start with a file called a and then call yaffssymlink a b we now have one link to the file called a and a symbolic link aliasising from b to a if we use yaffsopen a or yaffsopen b they will open the same file the path resolution mechanism substitutes in the alias and so will look up a the same applies to almost all functions that takes a path such as yaffstruncate yaffsstat etc the only exceptions are yaffslstat and yaffsreadlink which will treat the path as pointing to the symbolic link and not the file you can tell a and b apart by using yaffslstat yaffslstat a will show the information for file a yaffslstat b will show the information for the symbolic link itself note the difference with hard links with hard links yaffslstat a and yaffslstat b would show the same results since they are exactly the same thing being referenced if we now unlink a then the file is no longer linked and will no longer be accessible from b note the difference with hard links 116 handlebased file handling a handle is file accessor that allows us to access the contents of a regular file the handle identifies the file being accessed as well as a position pointer tracking where the next read or write operation will take place a handle is identified by an integer of value  or greater a handle is created by using the yaffsopen call and returns the handle value if the handle could not be created then a negative value is returned and the yaffs error code is set a handle remains valid until the handle is closed by yaffsclose the yaffsopen call takes three parameters name full path name of the file being opened access flags flags being used to open this handle creation mode mode flags used when creating a file the access flags are one or more of ocreat create file if it does not already exist oexcl only use with ocreat create file if it does not exist if the file already exists then fail otrunc if the file exists and opening with write access then truncate the file to zero bytes long oappend regardless of the handle position always write to the end of the file ordwr open for read write access owronly open for write access and no read access  zero  if neither ordwr or owronly is set then the file will be opened for readonly access where they are not mutually exclusive these flags are typically combined for example ocreat otrunc ordwr create a new file if it does not exist otherwise if the file already exists then truncate to zero length typically used to overwrite a file or create if it does not already exist ocreat oexcl owronly create a new file opening it for write only fails if file already exists there are three mode flags that can be controlled or set these flags may be set by the open that creates the file or later by the yaffschmod siread the file may be opened for read access siwrite the file may be opened for write access siexec the file may be opened for execution this is not enforced by yaffs once you have opened a handle you can then do various operations on the file yaffsclose handle close the handle it is no longer usable yaffsfsync handle flush out any cached writes to the file as well as the file metadata yaffsdatasync handle same as yaffsfsync but no file metadata yaffsflush handle same as yaffsfsync yaffsdup handle duplicates a handle yaffslseek handle offset whence set the handle read write position note that this does not modify the file you can seek past the end of the file this does not modify the file size yaffsftruncate handle size change the file size it can be made bigger or smaller this does not change the handle read write position yaffsfstat handle buf get file status yaffsfchmod handle mode change the file mode yaffsread handle buffer nbytes read data from file at file pointer and update pointer yaffspread handle buffer nbytes position read data from file at specified position does not modify file pointer yaffswrite handle buffer nbytes write data to file at file pointer and update pointer yaffspread handle buffer nbytes position write data to file at specified position does not modify file pointer 117 changing file size yaffstruncate path newsize yaffsftruncate handle newsize these change a file s size note that truncating does not just mean make the file smaller the file can also be made larger yaffs does not store bytes that it does not need to if you use truncate to make a file larger then this will not necessarily occupt more flash space see also yaffslseek too note that yaffslseek only changes the position of the write pointer and does not impact on the file size unless the file is written 118 getting setting information about files yaffschmod path mode yaffsfchmod handle mode yaffsaccess path amode yaffsstat path struct yaffsstat buf yaffsfstat handle struct yaffsstat buf yaffslstat path struct yaffsstat buf yaffsreadlink path buf bufsize the chmod calls allow you to set different mode flags for the file these can only be used to manipulate the permissions flags and not change the mode flags relating to the type of file yaffsaccess tests that the file can be accessed in the specified mode this call returns zero on success and 1 is returned amode is a bitmask of the following values rok check read is ok wok check write is ok xok check execute is ok  zero just checks the file exists these can be combined for example if yaffsaccess path rok wok  the file exists and can be read and written if yaffsaccess path   the file exists the stat calls retrieve a yaffsstat structure of data which is defined in yaffsfsh there are three versions yaffsfstat takes a handle yaffsstat takes a path name and follows symbolic links yaffslstat takes a path but does not follow symbolic links thus if path is a symbolic link yaffsfstat will give information on the file that the link points to while yaffslstat will give information about the link itself yaffsreadlink will read the read the link value into the buffer provided for example yaffssymlink target link create a link called link to target yaffsreadlink link buffer 10 now buffer contains target  119 changing the directory structure and names yaffsopen path flags mode yaffsmkdir path mode yaffssymlink targetpath linkpath yaffsmknod pathname mode dev yaffslink existingpath newath yaffsunlink path yaffsrmdir path yaffsrename oldpath newpath files of various types and their first link are created via the yaffsopen yaffsmkdir yaffssymlink and yaffsmknod functions yaffslink can be used to create subsequent links to files note that you cannot create a link to a directory yaffsrename allows you to rename a link note that renaming one link over another link is an atomic operation that means that even if the operation is interrupted by a power failure the result will either complete or not happen at all if the target link is for a directory then the rename will only work if the target directory is empty 1110 searching directories yaffsdir yaffsopendir const ychar dirname struct yaffsdirent yaffsreaddir yaffsdir dirp void yaffsrewinddir yaffsdir dirp int yaffsclosedir yaffsdir dirp searching is performed by the following sequence of operations open the directory for reading with yaffsopendir iterate through the entries in the directory using yaffsreaddir each read will advance the directory read position you can reset to the start of the directory with yaffsrewinddir close the directory when finished with yaffsclosedir  1111 searching directories fd interface  int yaffsopen const ychar dirname ordonly  struct yaffsdirent yaffsreaddir fd int fd void yaffsrewinddir fd int fd int yaffsclose int fd this is not a posix interface but provides an alternate interface for reading directories searching is performed by the following sequence of operations open the directory for reading with yaffsopen name ordonly  iterate through the entries in the directory using yaffsreaddir fd each read will advance the directory read position you can reset to the start of the directory with yaffsrewinddir fd close the directory when finished with yaffsclose  1112 mount control and similar yaffsmount path yaffsmount2 path readonly yaffsunmount path yaffsunmount2 path int force yaffsremount path force readonly yaffssync path yaffsformat const ychar path int unmountflag int forceunmountflag int remountflag a partition must be mounted to be accessed yaffsmount will mount the partition for read write access yaffsmount2 can be used to control whether the access is read write or read only a partition can be unmounted to remove it from use yaffsunmount will fail if any files are in use whereas yaffsunmount2 allows you to force the unmount even if files are open note that any file handles will then be broken and will no longer access the files yaffsremount can be used to change the access to a currently mounted partition and is equivalent to making an unmount2 call followed by a mount2 call yaffssync does not change the mount status but flushes out any pending data on a partition that is mounted with write access yaffsformat  provides a mechanism to format a device it has various parameters unmountflag  if set yaffsformat will unmount the device before formatting if this flag is not set and the device is mounted then the format will fail with ebusy forceunmount  if set then an unmount is allowed even if the device is busy eg files open if not set then yaffsformat will fail ebusy if files are open remountflag  if set then the device will be remounted after the format if it was mounted the forceunmount and remountflag options only have meaning if unmountflag is set 1113 extended attributes xattrt  extended attributes provide a mechanism to attach a limited amount of extra data to a file without actually modifying the file each xattribute is a named pair of name and some data each file can have as many xattribs as there is space for in yaffs this is around chunksize 512 bytes so on devices with 2kbyte chunks you can store up to 15kbytes of xattribute information although there are 12 xattr functions there are really only four basic functions each with 3 different flavours the basic functions are set an xattr get an xattr remove an xattribute and list the xattribute names int yaffssetxattr const char path const char name const void data int size int flags int yaffslsetxattr const char path const char name const void data int size int flags int yaffsfsetxattr int fd const char name const void data int size int flags these functions are called with name being the name of the xattr a pointer to the data and the size of the data and flags the flags are xattrcreate create a new xattr fail with eexist if the xattrib already exists xattrreplace replace an existing xattr fail with enoattr if it does not exist zero just create with no checks replace if it already exists setting can fail with enospc if there is not enough space to store the xattrib int yaffsgetxattr const char path const char name void data int size int yaffslgetxattr const char path const char name void data int size int yaffsfgetxattr int fd const char name void data int size these get fetch an xattrib if the call succeeds the length of the retrieved xattrib is returned this call can fail with enoattr if the requested xattr does not exist or erange if the buffer was too small int yaffsremovexattr const char path const char name int yaffslremovexattr const char path const char name int yaffsfremovexattr int fd const char name these functions delete an existing xattr if the xattr does not exist then enoattr is returned int yaffslistxattr const char path char list int size int yaffsllistxattr const char path char list int size int yaffsflistxattr int fd char list int size these functions fetch a list of the xattrib names into the list buffer the names are nul terminated eg attrib00attrib10 the function returns the length of the list otherwise if the list buffer is too short it returns erange note if you call these functions with a list buffer size of zero this acts as a query of the required buffer size no data is actually transferred into the list for example we might choose to add some xattribs to a media file set description yaffsfsetxattr fd usercomment i hate this song 18 yaffsfsetxattr fd priceincents cost sizeof cost get the comment yaffsfgetxattr fd usercomment buffer sizeof buffer list the attributes in a nul delimited list yaffsflistxattr fd listbuf sizeof listbuf now listbuf has usercomment 0priceincents  yaffsfremovexattr fd usercomment  1114 other yaffsfreespace path yaffstotalspace path yaffsinodecount path these functions provide information on the free and total space in bytes for the mount that the path addresses yaffsinodecount returns the number of files on the mount that the path addresses 12 example yaffsreaddir and yaffsstat  this code snippet illustrates using yaffsreaddir and associated functions to iterate through a directory it also shows how to use yaffslstat to get information on a file and interpret it void dumpdirectory const char dname yaffsdir d yaffsdirent de struct yaffsstat s char str 100 d yaffsopendir dname if d printf opendir failed n else while de yaffsreaddir d null sprintf str s s dname de dname yaffslstat str s printf s inode d length d mode x str sstino int sstsize sstmode switch sstmode sifmt case sifreg printf data file break case sifdir printf directory break case siflnk printf symlink if yaffsreadlink str str 100  printf no alias else printf s str break default printf unknown break printf n if sstmode sifmt sifdir dumpdirectorytreeworker str yaffsclosedir d  ',0),(454,'und','node_search',' running yaffs direct tests running yaffs direct tests yaffsdirecttestspdf 522 kb admin 23 july 2012 103am  1 background this document is intended to provide a outline to the various tests that are incorporated into yaffs direct most of these tests were written as debug tools to test error response by various yaffs functions these and others can be used to check if yaffs is working properly 2 running the tests all of the test directories should have a makefile run it to compile the test the readmetxt file should tell you how to run the tests 3 tests isyaffsworkingtests folder contains a the tests related to simply seeing if yaffs is working there is only one test at the moment test1yaffsmountc which tests if yaffs will mount create a file and be able to read the file after remounting stresstester folder contains yaffstesterc which stress tests yaffs by opening and closing files at random this test will run forever or until it crashes handletests folder contains the test handletestsc which just creates files and duplicates the file handle the yaffsandlinuxmirrortests folder runs a yaffs operation and then compares the response the same command run under linux this test is used to check that yaffs responds in expected manner with respect to linux quicktests folder contains the quicktest which tests almost all of yaffs functions error handling and error codes the threading folder contains the testthreadingc which tests the thread locking ability of yaffs the folder linuxtests contains the linuxtestc test which tests yaffs running under linux using the nandsim generator  ',0),(455,'und','node_search',' yaffs nand flash failure mitigation yaffs nand flash failure mitigation admin 23 july 2012 129am yaffsnandfailuremitigationpdf 2296 kb  1 purpose the purpose of this document is to give an understanding of nand failure modes and the measures that yaffs takes to mitigate against these this document is intended to be easy reading but some very lightweight physics is required to understand the way nand works 2 the nand cell this section explains the internal construction of a nand device which helps to explain the way that it fails each nand cell consists of a floating gate field effect transistor described below 21 floating gate field effect transistor a fet is the fundamental switching element used in almost all digital electronics a fet is a a semiconductor element that conducts when a charge is applied to the gate a fet is a type of semiconductor device with a semiconducting region between the the source and drain connections an insulating oxide and a gate region the oxide prevents current from flowing from the gate to the oxide but applying a voltage to the gate injects charge into the gate creating an electric field which influences the conductive properties of the semiconductor region in a regular fet a conductive channel is formed between the source and drain when a suitable control voltage is applied to the gate the current passed by the channel is dependent on the voltage ie the strength of the gate field for now we will ignore analogue levels and just consider binary levels where the gate is either conducting or not this effectively makes a switch that is controlled by the control gate the floating gate fet is just like a regular fet except that it has an extra floating gate this floating gate is able to trap charge between the two insulating layers the trapped charge modifies the local electric field and thus modifies the effect of the control gate if the floating gate has extra electrons negative charge then the control gate must be raised to a higher voltage to make the fet conduct so a regular fet is conductive on when the control gate is high and is nonconductive off when the control gate is low a floating gate fet however is only nonconductive off when the floating gate is charged and the gate is low this gives us an output that is dependent on the floating gate and a way to read it the gate  floating gate charge control gate source drain channel neutral unprogrammed high on 1 neutral unprogrammed low on 1 charged programmed high on 1 charged programmed low off  the tunneling oxide is insulating at low voltages but allows quantum tunneling fowlernordheim tunneling at higher voltages this fntunneling provides a mechanism to inject or remove charge from the floating gate by applying high voltages to the control gate or the body by applying a high positive voltage to the control gate electrons are drawn into the floating gate resulting in a programmed gate erasing is accomplished by the reverse operation which draws electrons out of the gate so a floating gate fet is effectively a readable programmable switch in other words memory  22 nand array layout nand flash gets its name from the way that the cells are arranged nand cells are arranged in chains called strings  typically 1 string per bitposition in the page n for slc the length of the chain is the same as the number of pages per block this arrangement uses far less silicon area than the nor flash arrangement which reduces nand cost and increases density it does however also introduce some operational and reliability problems nand is read by biasing the unselected pages with a high bias voltage and the selected pages with the low bias voltage this means that the unselected cells are always on and the selected cells will be on or off according to the state of the floating gate this means we have a matrix where all unselected cells are on selected unprogrammed cells are on selected programmed cells are off since only one cell in a string is selected at a time the whole string is on if the selected cell is unprogrammed and is off if the selected cell is programmed thus even though the cells in a string are all in series we can still access them individually well that s how it would work in a perfect world anyway the string and block arrangement means that it takes quite a while typically a few µsec for the voltage of the string to stabilize after the selection has been made this stabilization time is the cause of the access time delay when accessing nand flash 3 fault modes sit back for a moment and consider everything that must come together for the nand flash to work and all the ways things can go wrong of course there can be fabrication faults where defects cause short circuits and open circuits within the chip these types of fault apply to all chips type not just flash each cell has two oxide layers trapping the floating gate charge one of which is semipermeable to support tunneling if either of these layers is too thick the gate will be unresponsive if they are too thin then the gate will tunnel too easily or will leak if there are impurities in the oxide then the layers may become resistive and leak thus causing the charge to change and possibly causing the state to change the floating gate state can change by either gaining or losing charge if charge is lost then a programmed cell may become unprogrammed a  changes to a 1 if charge is gained then an unprogrammed cell can become programmed in very extreme cases a programmed cell can gain further negative charge and become overprogrammed this means that even if the high read bias voltage is applied to the control gate the fet does not become conductive in this state a cell will read as programmed  even if it is not selected this means that the whole string will always read zero irrespective of which page is selected this fault mode will persist until the cell is erased these devices are made very cheaply flash parts with tens of billions of nand cells cost only a few dollars there is little money to spend on individual part testing extending the previous state selection table with the overprogrammed fault state we now have  floating gate charge control gate source drain channel neutral unprogrammed high on 1 neutral unprogrammed low on 1 charged programmed high on 1 charged programmed low off  overcharged overprogrammed high off  overcharged overprogrammed low off   4 fault mechanisms this section explains some of the common nand flash failure modes 41 general chip fault a nand is a chip built with normal fabrication techniques and is thus prone to fail just like any other chip some of these faults can be isolated by marking faulty blocks in some cases eg damaged interblock logic the whole chip is discarded yaffs does not use the bad blocks so they have no negative impact on the performance of the file system 9apart from a small reduction in the amount of storage available  42 oxide degradation every programming erasure cycle causes some degradation of the oxide layers over many cycles this has a tendency to degrade the properties of the oxide layer excessive degradation can cause the cell to fail to erase or program but more commonly just makes the other fault modes more prevalent the primary mechanism of oxide degradation is that charge becomes permanently trapped within the oxide layer in a way that it is not cleared by programming and erasure the resulting field disrupts both the fet s conductive channel and the effectiveness of the fn tunneling as a result of this field disruption two things happen the fn tunneling is disrupted which means that the programming and erasure take longer to complete eventually programming and erasure might fail see program erase failure below the programming and erasure is far more marginal meaning that less leakage is required to corrupt a bit value see charge leakage below this degradation is permanent and incremental and is not cleared by erasure this degradation is the cause of the endurance term in the nand specification typical nand flash endurance is 10000 mlc to 100000 slc program erasure cycles endurance issues are largely minimized by wear leveling and writepath caching blocks that become too unreliable are retired from use 43 program erase failure programming and erase operations are controlled by a builtin state machine that applies the programming erasure voltages for a while then check whether the operation has succeeded this is typically performed by an iterative algorithm that will time out if too many cycles are required a failure is signaled in the chip status register when the builtin programming erasure mechanisms fail to accomplish the programming or erasure within the maximum program erasure time it is important to realize that a programming failure is only checked on bits being set to a zero if one bits are inadvertently set to zero then these are not raised as programming errors but are considered to be program disturb errors program erase errors are generally the result of excessive oxide degradation yaffs handles programming erasure errors as unrecoverable hard errors if these are encountered then useful data is copied off the block and the whole block is permanently retired by marking the block as a bad block these are the only failures that the nand devices will actually identify all other failures need to be detected in software 44 charge leakage the oxide isolating the floating gate is not a perfect insulator and charge can escape very slowly particularly at temperature extremes and when the oxide had been degraded by extensive use high radiation environments can also make this worse an effective way to handle charge leakage is to use ecc to detect and correct errors blocks with errors are rewritten on a fresh block allowing the data to be recreated before unrecoverable errors occur 45 program disturb program disturb happens when a bit is unintentionally programmed 1 to  during a programming operation the affected bit can be in the same page or elsewhere in the block program disturb is caused by bias conditions in the flash block during programming even though full programming voltage is only applied to the cells being programmed the other cells are also subject to lesser voltages and minor tunneling can occur this effect is far less than regular programming but is more than read disturb however since a page is only programmed once before the block is erased there is no multiplier effect as there is in read disturb this condition is made worse by random programming in the block and by applying multiple partial writes to the pages yaffs1 only writes pages in a block in sequential order and writes pages only once except for writing deletion markers yaffs2 does not write deletion markers and thus only programs pages sequentially and only once thus yaffs2 is far less likely to cause write disturb yaffs1 should only be used with devices that are tolerant of partial page programming program disturb within the same page can be corrected by verifying the page after programming ecc provides a mechanism to correct infrequent program disturb errors 46 read disturb whenever a page is read the other pages in the block are biased at a readinhibit voltage to turn them on while this voltage is not as high as the programming voltage some very slight fn tunneling can occur with sufficient leakage the cell state may change or the cell may become overprogrammed this effect is known as read disturb read disturb only impacts the pages in the block that are not being read this makes it difficult to detect in some systems for example consider a block where only the first page is read repeatedly other pages in the block may be incurring read disturb but these are happening without the effect being noticed by software by the time the pages are eventually read the read disturb may have caused more bit errors than the ecc is able to fix thankfully the problem is seldom that bad read disturb is very gradual under worst case conditions read disturb effects are expected to happen only after approximately 1 million page reads on the block for slc flash or 100000 page reads on the block for most mlc flash or in other words 10 times the endurance number be warned though that as process sizes shrink read disturb is getting more problematic some flash parts are prone to read disturb after 20000 page reads the read disturb effect for a single read is far less than the write disturb effect for a single write however each page is only written once per block erase cycle but may be read many times therefore the cumulated effect of many read disturbs can cause problems read disturb effects are cleared by erasing the block various mechanisms are being implemented to correct read disturb in yaffs though these have not yet been implemented the first mechanism is to count the number of page reads on each block when a certain threshold is reached say 50000 reads for an mlc part the block is rewritten and the count is zeroed the second mechanism is to periodically read pages in the block eg every 256 times a block has a page read we read an additional page to check for read disturb if read disturb has happened then copy onto a fresh page in addition ecc does provide some benefit but is insufficient on its own 5 decoding nand reliability statistics many variables contribute to nand reliability these variables are interrelated in complex ways which mean that is is very difficult to try to isolate the variables from each other to fully characterize them the major variables are temperature temperature impacts the performance of the materials and thus impacts the movement of charge within the nand cells storage time this is related to the cell leakage the leakage integrates over time so the longer the cells are stored the more it changes manufacturing variance operating voltage erasure programming cycles read cycles  6 mlc vs slc both multilevel cell mlc and singlelevel cell slc nand cells work by trapping charge in the floating gate by trapping different amounts of charge in the gate it is possible to modify the conductance of the string mlc store two bits in once cell by using three threshold voltages to distinguish different cell charge levels 1  in the case of slc the cells are erased by the erasure state machine until the cell voltage is below v erase programming is accomplished by programming until the voltage exceeds vprog on reading the voltage is compared with vread mlc programming is accomplished in the same way except that there are multiple vprogs and vreads this means that there is far less margin for error and cell disturbance is far more likely to cause state changes for this reason mlc is less reliable has lower endurance numbers and lower readdisturb numbers mlc thus requires far better ecc strategies to ensure reliable storage but mlc is cheaper  7 summary in summary nand flash has many failure modes but these can be corrected in software to provide a reliable storage solution any flash storage mechanisms that do not provide sufficient coverage of different fault modes should be considered suspect  chip fault degradation p e failure leakage write disturb read disturb nand self check yes yes  block retirement yes yes yes  wear levelling  yes  write verification  yes  read counting rewrite  future infrequent read checking  future future future ecc  yes yes yes yes occasional rewrite of oldest data  yes yes yes thus all fault mechanisms are covered by at least two corrective mechanisms read disturb correcting features are planned  1 some mlc parts store more than 2 bits per cell storing n bits requires 2n levels  ',0),(456,'und','node_search',' yaffs structure diagram yaffs structure diagram admin 15 august 2012 209am this diagram shows the relationships between the yaffs filesystem the yaffs direct interface  posix the operating system and the flash hardware  ',0),(457,'und','node_search',' google android google android google android admin 15 august 2012 426pm  ',0),(458,'und','node_search',' preparing to build linux with yaffs preparing to build linux with yaffs admin 18 august 2012 258am this video covers the preparation needed to include linux in yaffs describing the kernel buildtools needed how to get the kernel source code and yaffs source code it s about 175mb and 6m30 long here s the script for the video  hello today i m going to show you the tools you need to compile yaffs into the linux kernel if you ve compiled linux before then this tutorial is not appropriate for you and you should skip to the next one yaffs is the most widely used file system which is specialised for flash memory it s used in millions of devices both under linux and other operatings systems it s available under the gnu public licence the gpl and commercial terms you can find out more about yaffs at yaffsnet this demo is being run on intel x86 because the end result is available for you to experiment with under vagrant and virtualbox but with some slight changes we could target another architecture for instance arm if you ve never used vagrant it provides a way to get a virtual system up and running in a few minutes you can download the vagrant box from the yaffs web site login we re starting off with a stock ubunutu precise 1204 386 server we re using 386 because it s the lowest common demoninator so the virtualbox will run on any system capable of running virtualbox but this works just as well for 64 bit architecture here we are at the commandline of a brandnew installation the server has been configured for the minimum it only has ssh and a couple of othre things required for vagrant of course there s no requirement for any of this for yaffs we need git version control to download yaffs and the kernel source sudo aptget install git we need these tools to build the kernel sudo aptget install crash kexectools makedumpfile kernelwedge sudo aptget install ncursesdev libncurses5dev sudo aptget install buildessential fakeroot and we need this to automate the job of creating a debian kernel package sudo aptget install kernelpackage okay we have all the tools i ll be needing so i m going to go ahead and make a working directory mkdir kernel cd kernel of course we re going to need yaffs so i ll go ahead and download that git clone git wwwaleph1couk yaffs2 that puts it into the yaffs directory ls this copy of yaffs is licensed under the gnu public licence the gpl so i must make changes available under the gpl too we also license yaffs under commercial terms removing the need to make your code available to others check our website for details now i need a copy of the kernel source code i could have used one directly from kernelorg but because this demo is running on ubuntu i m going to grab the ubuntu kernel this has the benefit of including the debian build rules git clone git kernelubuntucom ubuntu ubuntuprecisegit source cd source here it is ls and that s everything necessary to build the kernel with yaffs in the next video we ll show you how to configure and compile the kernel with yaffs more information about yaffs is available at wwwyaffsnet thanks for watching  ',0),(459,'und','node_search',' building yaffs into linux building yaffs into linux admin 19 august 2012 251am this video shows you how to compile yaffs into linux it s just over 10 minutes long and if you download it it s 325mb after watching this video you should be able to include yaffs in linux once you have yaffs available you will be able to mount a simulated nand device or if you have a flash device attached you will be able to use it the demo was run in a virtualbox system and is available as a  vagrant box from our downloads section  with details of how to build and use a simulated nand device  the script for the video  hello today i m going to show you how to compile yaffs into the linux kernel yaffs is the most widely used file system which is specialised for flash memory it s used in millions of devices both under linux and other operatings systems it s available under the gnu public licence the gpl and commercial terms you can find out more about yaffs at yaffsnet today we ll be targetting intel x86 but with some slight changes we could target another architecture for instance arm this demo is being run in a virtualbox machine and the resulting system is available as a vagrant box so you can download the image and test it yourself if you ve never used vagrant it provides a way to get a virtual system up and running in a few minutes login we re starting off with a stock ubunutu precise 1204 386 server we re using 386 because it s the lowest common demoninator so the virtualbox will run on any system capable of running virtualbox but this works just as well for 64 bit architecture here we are at the commandline of a brandnew installation to make a kernel with yaffs you will need all the usual kernelbuild tools for your distribution the kernel source code and the yaffs source code if you skipped the first video you won t have seen how to download yaffs here s a brief clip of retrieving a gpl licenced copy of the yaffs source git clone git  wwwaleph1couk yaffs2 ls we re starting off in the directory where i stored the kernel and yaffs source the next step isn t strictly necessary but it s useful to if you are going to be doing development i m going to make a branch for my changes to the kernel of course if you are using subversion cvs or some other system for version control then you ll want to skip this step or replace it let s list the branches git branch only one makes it easy git checkout master b yaffsdemox86 okay so we ve created a branch git branch and the star indicates that we are working in our new branch now we have the kernel source but we need to include yaffs luckily yaffs comes with a script which automates the source changes necessary to include it cd yaffs it s always a good idea to check the readme file especially if you are doing this yourself less readmelinuxtxt so the script we use to patch the kernel is  patchkersh c m kernel source the c tells the script to copy the changes rather than linking them and the m indicates that we want the multiprocess option because more than one process might be using yaffs at one time right yaffs has been patched into the kernel now we need to configure the kernel build because i m working on a virtual machine i don t need to worry about different flavours of the kernel configuration i can just go ahead and edit the default configuration to avoid a long compile i m going to remove pretty much all of the nonessential drivers and most of the hardware remember this is running on a virtual machine make menuconfig to include yaffs we need to enable two things the memory technology device support mtd and the caching block device access for mtd the mtd settings are in the device drivers section usually it will be on the caching should be on too once those are enabled yaffs becomes available as an optional file system go into file systems miscellaneous and enable yaffs here s a look at the various options i ve set up yaffs now i m going to go ahead and turn off all the things that i don t need in this kernel there are a lot of them and there s no need to watch hundreds of items being unticked skipping ahead once the config is suitable we can exit and save okay we re ready to build the kernel just to make sure that everything is fine  fakeroot makekpkg clean and let s kick the build off fakeroot makekpkg initrd appendtoversion yaffs kernelimage and now since this is running on a uniprocessor virtual machine i ll be going for some lunch but there s no need for you to wait so the build is finished it took about 12 hour your mileage will vary we have a debian package and i m going to go ahead and install that sudo dpkg install we should have our new build in the grub if we reboot we ll have yaffs available in the next video we ll show you how to set up a yaffs file system you can download a copy of the virtual machine but you ll need vagrant to use it details are on the site thanks for watching  ',0),(460,'und','node_search',' leica geosystems leica geosystems leica geosystems admin 20 august 2012 451pm  ',0),