[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fuvoKpnrJf5rR9PLYLv29FzTSCKWSNKbppjbtfbUwDmw":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":13,"num_ratings":14,"last_updated":15,"tested_up_to":16,"requires_at_least":17,"requires_php":18,"tags":19,"homepage":22,"download_link":23,"security_score":24,"vuln_count":25,"unpatched_count":25,"last_vuln_date":26,"fetched_at":27,"vulnerabilities":28,"developer":29,"crawl_stats":26,"alternatives":37,"analysis":58,"fingerprints":177},"wp-router","WP Router","0.5","Jonathan Brinley","https:\u002F\u002Fprofiles.wordpress.org\u002Fjbrinley\u002F","\u003Cp>WordPress’s rewrite rules and query variables provide a powerful system\u003Cbr \u002F>\nfor mapping URL strings to collections of posts. Every request is parsed\u003Cbr \u002F>\ninto query variables and turned into a SQL query via \u003Ccode>$wp_query->query()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Sometimes, though, you don’t want to display a list of posts. You just want\u003Cbr \u002F>\na URL to map to a callback function, with the output displayed in place of\u003Cbr \u002F>\nposts in whatever theme you happen to be using.\u003C\u002Fp>\n\u003Cp>That’s where WP Router comes in. It handles all the messy bits of registering\u003Cbr \u002F>\npost types, query variables, rewrite rules, etc., and lets you write code to\u003Cbr \u002F>\ndo what you want it to do. One function call is all it takes to map a\u003Cbr \u002F>\nURL to your designated callback function and display the return value in the page.\u003C\u002Fp>\n\u003Cp>Created by \u003Ca href=\"http:\u002F\u002Fflightless.us\" rel=\"nofollow ugc\">Flightless\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Usage\u003C\u002Fh3>\n\u003Ch4>Creating Routes\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Your plugin should hook into the \u003Ccode>wp_router_generate_routes\u003C\u002Fcode> action.\u003Cbr \u002F>\nThe callback should take one argument, a \u003Ccode>WP_Router\u003C\u002Fcode> object.\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Register a route and its callback using \u003Ccode>WP_Router::add_route( $id, $args )\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>$id\u003C\u002Fcode> is a unique string your plugin should use to identify the route\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>$args\u003C\u002Fcode> is an associative array, that sets the following properties for your route.\u003Cbr \u002F>\nAny omitted argument will use the default value.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>path\u003C\u002Fcode> (required) – A regular expression to match against the request path.\u003Cbr \u002F>\nThis corresponds to the array key you would use when creating rewrite rules for WordPress.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>query_vars\u003C\u002Fcode> – An associative array, with the keys being query vars, and the\u003Cbr \u002F>\nvalues being explicit strings or integers corresponding to matches in the path regexp.\u003Cbr \u002F>\n Any query variables included here will be automatically registered.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title\u003C\u002Fcode> – The title of the page.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title_callback\u003C\u002Fcode> – A callback to use for dynamically generating the title.\u003Cbr \u002F>\nDefaults to \u003Ccode>__()\u003C\u002Fcode>. If \u003Ccode>NULL\u003C\u002Fcode>, the \u003Ccode>title\u003C\u002Fcode> argument will be used as-is. if\u003Cbr \u002F>\n    page_callback or \u003Ccode>access_callback\u003C\u002Fcode> returns \u003Ccode>FALSE\u003C\u002Fcode>, \u003Ccode>title_callback\u003C\u002Fcode> will not be called.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>title_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed\u003Cbr \u002F>\nas arguments to \u003Ccode>title_callback\u003C\u002Fcode>. Defaults to the value of \u003Ccode>title\u003C\u002Fcode>. If an argument\u003Cbr \u002F>\nis not a registered query variable, it will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>page_callback\u003C\u002Fcode> (required) – A callback to use for dynamically generating the\u003Cbr \u002F>\ncontents of the page. The callback should either echo or return the contents of\u003Cbr \u002F>\nthe page (if both, the returned value will be appended to the echoed value). If\u003Cbr \u002F>\n    FALSE is returned, nothing will be output, and control of the page contents will\u003Cbr \u002F>\nbe handed back to WordPress. The callback will be called during the \u003Ccode>parse_request\u003C\u002Fcode>\u003Cbr \u002F>\nphase of WordPress’s page load. If \u003Ccode>access_callback\u003C\u002Fcode> returns \u003Ccode>FALSE\u003C\u002Fcode>, \u003Ccode>page_callback\u003C\u002Fcode>\u003Cbr \u002F>\nwill not be called.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>page_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>page_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed as\u003Cbr \u002F>\narguments to \u003Ccode>page_callback\u003C\u002Fcode>. If an argument is not a registered query variable,\u003Cbr \u002F>\nit will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>access_callback\u003C\u002Fcode> – A callback to determine if the user has permission to access\u003Cbr \u002F>\nthis page. If \u003Ccode>access_arguments\u003C\u002Fcode> is provided, default is \u003Ccode>current_user_can\u003C\u002Fcode>, otherwise\u003Cbr \u002F>\ndefault is \u003Ccode>TRUE\u003C\u002Fcode>. If the callback returns \u003Ccode>FALSE\u003C\u002Fcode>, anonymous users are redirected to\u003Cbr \u002F>\nthe login page, authenticated users get a 403 error.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>access_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>access_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed\u003Cbr \u002F>\nas arguments to \u003Ccode>access_callback\u003C\u002Fcode>. If an argument is not a registered query variable,\u003Cbr \u002F>\nit will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>template\u003C\u002Fcode> – An array of templates that can be used to display the page. If a path\u003Cbr \u002F>\nis absolute, it will be used as-is; relative paths allow for overrides by the theme.\u003Cbr \u002F>\nThe string \u003Ccode>$id\u003C\u002Fcode> will be replaced with the ID of the route. If no template is found,\u003Cbr \u002F>\nfallback templates are (in this order): \u003Ccode>route-$id.php\u003C\u002Fcode>, \u003Ccode>route.php\u003C\u002Fcode>, \u003Ccode>page-$id.php\u003C\u002Fcode>,\u003Cbr \u002F>\n    page.php, \u003Ccode>index.php\u003C\u002Fcode>. If FALSE is given instead of an array, the page contents will\u003Cbr \u002F>\nbe printed before calling \u003Ccode>exit()\u003C\u002Fcode> (you can also accomplish this by printing your output\u003Cbr \u002F>\nand exiting directly from your callback function).\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Example:\u003Cbr \u002F>\n    $router->add_route(‘wp-router-sample’, array(\u003Cbr \u002F>\n        ‘path’ => ‘^wp_router\u002F(.*?)$’,\u003Cbr \u002F>\n        ‘query_vars’ => array(\u003Cbr \u002F>\n            ‘sample_argument’ => 1,\u003Cbr \u002F>\n        ),\u003Cbr \u002F>\n        ‘page_callback’ => array(get_class(), ‘sample_callback’),\u003Cbr \u002F>\n        ‘page_arguments’ => array(‘sample_argument’),\u003Cbr \u002F>\n        ‘access_callback’ => TRUE,\u003Cbr \u002F>\n        ‘title’ => ‘WP Router Sample Page’,\u003Cbr \u002F>\n        ‘template’ => array(‘sample-page.php’, dirname(\u003Cstrong>FILE\u003C\u002Fstrong>).DIRECTORY_SEPARATOR.’sample-page.php’)\u003Cbr \u002F>\n    ));\u003C\u002Fp>\n\u003Cp>In this example, the path \u003Ccode>http:\u002F\u002Fexample.com\u002Fwp_router\u002Fmy_sample_path\u002F\u003C\u002Fcode> will call\u003Cbr \u002F>\nthe function \u003Ccode>sample_callback\u003C\u002Fcode> in the calling class. The value of the \u003Ccode>sample_argument\u003C\u002Fcode>\u003Cbr \u002F>\nquery variable, in this case “my_sample_path”, will be provided as the first and only\u003Cbr \u002F>\nargument to the callback function. If the file \u003Ccode>sample-page.php\u003C\u002Fcode> is found in the theme,\u003Cbr \u002F>\nit will be used as the template, otherwise \u003Ccode>sample-page.php\u003C\u002Fcode> in your plugin directory will\u003Cbr \u002F>\nbe used (if that’s not found either, fall back to \u003Ccode>route-wp-router-sample.php\u003C\u002Fcode>, etc.).\u003C\u002Fp>\n\u003Ch4>Editing Routes\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>You can hook into the \u003Ccode>wp_router_alter_routes\u003C\u002Fcode> action to modify routes created by other plugins. The callback should take one argument, a \u003Ccode>WP_Router\u003C\u002Fcode> object.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Public API Functions\u003C\u002Fh4>\n\u003Cp>Creating or changing routes should always occur in the context of the \u003Ccode>wp_router_generate_routes\u003C\u002Fcode> or \u003Ccode>wp_router_alter_routes\u003C\u002Fcode> actions, using the \u003Ccode>WP_Router\u003C\u002Fcode> object supplied to your callback function.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>WP_Router::edit_route( string $id, array $changes )\u003C\u002Fcode> – update each\u003Cbr \u002F>\nproperty given in \u003Ccode>$changes\u003C\u002Fcode> for the route with the given ID. Any properties\u003Cbr \u002F>\nnot given in \u003Ccode>$changes\u003C\u002Fcode> will be left unaltered.\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::remove_route( string $id )\u003C\u002Fcode> – delete the route with the given ID\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::get_route( string $id )\u003C\u002Fcode> – get the \u003Ccode>WP_Route\u003C\u002Fcode> object for the given ID\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::get_url( string $id, array $arguments )\u003C\u002Fcode> – get the URL to reach the route with the given ID, with the given query variables and their values\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Route::get( string $property )\u003C\u002Fcode> – get the value of the specified property for\u003Cbr \u002F>\nthe \u003Ccode>WP_Route\u003C\u002Fcode> instance\u003C\u002Fli>\n\u003C\u002Ful>\n","Provides a simple API for mapping requests to callback functions.",1000,16922,74,3,"2012-08-06T15:06:00.000Z","3.4.2","3.0","",[20,21],"callback-functions","url-mapping","https:\u002F\u002Fgithub.com\u002Fjbrinley\u002FWP-Router","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwp-router.zip",85,0,null,"2026-03-15T15:16:48.613Z",[],{"slug":30,"display_name":7,"profile_url":8,"plugin_count":31,"total_installs":32,"avg_security_score":33,"avg_patch_time_days":34,"trust_score":35,"computed_at":36},"jbrinley",6,1170,84,1,89,"2026-04-04T14:11:59.346Z",[38],{"slug":39,"name":40,"version":41,"author":42,"author_profile":43,"description":44,"short_description":45,"active_installs":46,"downloaded":47,"rating":25,"num_ratings":25,"last_updated":18,"tested_up_to":48,"requires_at_least":49,"requires_php":18,"tags":50,"homepage":18,"download_link":55,"security_score":56,"vuln_count":25,"unpatched_count":25,"last_vuln_date":26,"fetched_at":57},"custom-url-mapper","Custom URL Mapper","1.0","freeliancenow","https:\u002F\u002Fprofiles.wordpress.org\u002Ffreeliancenow\u002F","\u003Cp>Custom URL Mapper, created and maintained by Michael Kiamanesh and Grigor Nikolov, is a totally free plugin that allows you to easily create custom URLs on your WordPress site and map them to specific posts or pages. Whether you need to create short, clean, or personalized URLs for a better user experience, this plugin makes it simple to redirect any custom URL to existing content on your site. No coding required—just add your custom URL, select the target post or page, and you’re set!\u003C\u002Fp>\n\u003Cp>We built this plugin out of necessity as a way to manage redirects on our own websites without the headache of coding or overcomplicated tools. We’re sharing it for free, hoping it will help others facing similar challenges.\u003C\u002Fp>\n\u003Ch3>How It Works\u003C\u002Fh3>\n\u003Cp>Adding a custom URL is simple and straightforward. Here’s a step-by-step guide:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Enter a Custom Query\u003C\u002Fstrong>: In the Custom Query field, type the word or phrase you want to use in the URL. For example, let’s say your website has a page called “Contact” with the URL \u003Ccode>yourwebsite.com\u002Fcontact\u003C\u002Fcode>. You can enter a word like “test” into the Custom Query field.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Select the Target Post\u002FPage\u003C\u002Fstrong>: From the Associated Post\u002FPage dropdown menu, select the page or post where you want the custom URL to redirect. In this case, you would choose your “Contact” page.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Save and Test\u003C\u002Fstrong>: After saving, whenever someone types \u003Ccode>yourwebsite.com\u002Ftest\u003C\u002Fcode> into their browser, they will automatically be redirected to your “Contact” page. You can create as many custom queries and redirects as you need for any posts or pages on your site.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Key Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Completely Free: No hidden costs or premium versions.\u003C\u002Fli>\n\u003Cli>Unlimited Custom URLs: Create as many custom URLs as you need and map them to any post or page.\u003C\u002Fli>\n\u003Cli>Seamless Integration: Works flawlessly with WordPress’s native permalink structure.\u003C\u002Fli>\n\u003Cli>SEO-Friendly Redirects: Automatically handles URL redirects with a 301 (permanent) redirect to maintain SEO integrity.\u003C\u002Fli>\n\u003Cli>Easy-to-use Admin Interface: For adding and managing your custom URLs.\u003C\u002Fli>\n\u003Cli>Secure and Lightweight: No impact on website performance.\u003C\u002Fli>\n\u003Cli>No Technical Knowledge Required: Set up your redirects with simple point-and-click actions.\u003C\u002Fli>\n\u003C\u002Ful>\n","Create custom URLs and redirect them to any post or page on your WordPress site.",10,700,"6.6.5","5.0",[51,52,53,54,21],"custom-urls","permalink","redirect","url","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcustom-url-mapper.1.0.zip",100,"2026-03-15T10:48:56.248Z",{"attackSurface":59,"codeSignals":126,"taintFlows":137,"riskAssessment":167,"analyzedAt":176},{"hooks":60,"ajaxHandlers":122,"restRoutes":123,"shortcodes":124,"cronEvents":125,"entryPointCount":25,"unprotectedCount":25},[61,66,70,74,77,82,86,91,95,99,103,107,111,115,119],{"type":62,"name":63,"callback":63,"file":64,"line":65},"action","init","wp-router.php",49,{"type":62,"name":67,"callback":68,"priority":25,"file":64,"line":69},"admin_head","failed_to_load_notices",58,{"type":62,"name":63,"callback":71,"priority":11,"file":72,"line":73},"generate_routes","WP_Router.class.php",123,{"type":62,"name":75,"callback":75,"priority":46,"file":72,"line":76},"parse_request",124,{"type":78,"name":79,"callback":80,"priority":46,"file":72,"line":81},"filter","rewrite_rules_array","add_rewrite_rules",125,{"type":78,"name":83,"callback":84,"priority":46,"file":72,"line":85},"query_vars","add_query_vars",126,{"type":62,"name":87,"callback":88,"priority":46,"file":89,"line":90},"pre_get_posts","edit_query","WP_Router_Page.class.php",93,{"type":62,"name":92,"callback":93,"priority":46,"file":89,"line":94},"the_post","set_post_contents",94,{"type":78,"name":96,"callback":97,"priority":46,"file":89,"line":98},"the_title","get_title",95,{"type":78,"name":100,"callback":101,"priority":46,"file":89,"line":102},"single_post_title","get_single_post_title",96,{"type":78,"name":104,"callback":105,"priority":46,"file":89,"line":106},"redirect_canonical","override_redirect",97,{"type":78,"name":108,"callback":109,"priority":46,"file":89,"line":110},"get_post_metadata","set_post_meta",98,{"type":78,"name":112,"callback":113,"priority":46,"file":89,"line":114},"post_type_link","override_permalink",99,{"type":78,"name":116,"callback":117,"priority":46,"file":89,"line":118},"template_include","override_template",101,{"type":62,"name":120,"callback":71,"priority":46,"file":121,"line":46},"wp_router_generate_routes","WP_Router_Sample.class.php",[],[],[],[],{"dangerousFunctions":127,"sqlUsage":128,"outputEscaping":130,"fileOperations":25,"externalRequests":25,"nonceChecks":25,"capabilityChecks":25,"bundledLibraries":136},[],{"prepared":25,"raw":25,"locations":129},[],{"escaped":34,"rawEcho":34,"locations":131},[132],{"file":133,"line":134,"context":135},"WP_Route.class.php",113,"raw output",[],[138,157],{"entryPoint":139,"graph":140,"unsanitizedCount":34,"severity":156},"login_redirect (WP_Route.class.php:262)",{"nodes":141,"edges":153},[142,147],{"id":143,"type":144,"label":145,"file":133,"line":146},"n0","source","$_SERVER",263,{"id":148,"type":149,"label":150,"file":133,"line":151,"wp_function":152},"n1","sink","wp_redirect() [Open Redirect]",264,"wp_redirect",[154],{"from":143,"to":148,"sanitized":155},false,"medium",{"entryPoint":158,"graph":159,"unsanitizedCount":25,"severity":166},"\u003CWP_Route.class> (WP_Route.class.php:0)",{"nodes":160,"edges":163},[161,162],{"id":143,"type":144,"label":145,"file":133,"line":146},{"id":148,"type":149,"label":150,"file":133,"line":151,"wp_function":152},[164],{"from":143,"to":148,"sanitized":165},true,"low",{"summary":168,"deductions":169},"The 'wp-router' plugin version 0.5 exhibits a generally positive security posture based on the provided static analysis. There are no identified direct entry points like AJAX handlers, REST API routes, or shortcodes that are exposed to the public without authentication or permission checks. The absence of dangerous functions, file operations, and external HTTP requests is also a strong indicator of secure coding practices. Furthermore, all SQL queries utilize prepared statements, which is a critical defense against SQL injection vulnerabilities. The plugin also avoids bundling external libraries, simplifying its security management.\n\nHowever, there are a couple of areas that warrant attention. The presence of output that is not properly escaped presents a potential Cross-Site Scripting (XSS) risk, albeit with only 50% of outputs being problematic. More concerning is the taint analysis, which identified one flow with an unsanitized path. While no critical or high severity issues were flagged in the taint analysis, an unsanitized path can be a precursor to more serious vulnerabilities if it involves user-supplied data. The plugin's vulnerability history is clean, with no recorded CVEs, which is a positive sign but should not lead to complacency. The lack of nonce and capability checks on any potential entry points (though zero are identified here) is a noted observation, but less impactful given the zero attack surface.\n\nIn conclusion, 'wp-router' v0.5 appears to be a relatively secure plugin, with significant strengths in its handling of database interactions and its limited attack surface. The primary concerns lie with the potential for XSS due to unescaped output and the single identified unsanitized path in the taint analysis. Addressing these specific code quality issues would further enhance its security.",[170,173],{"reason":171,"points":172},"Unescaped output detected",5,{"reason":174,"points":175},"Flow with unsanitized path detected",8,"2026-03-16T19:08:12.519Z",{"wat":178,"direct":184},{"assetPaths":179,"generatorPatterns":181,"scriptPaths":182,"versionParams":183},[180],"\u002Fwp-content\u002Fplugins\u002Fwp-router\u002FWP_Router_Sample.class.php",[],[],[],{"cssClasses":185,"htmlComments":186,"htmlAttributes":187,"restEndpoints":189,"jsGlobals":190,"shortcodeOutput":192},[],[],[188],"name=\"WP_Route\"",[],[191],"window.WP_Router",[]]