{"id":26188,"date":"2020-04-01T03:28:00","date_gmt":"2020-04-01T03:28:00","guid":{"rendered":"http:\/\/3.85.220.248\/?p=26188"},"modified":"2024-05-01T07:23:55","modified_gmt":"2024-05-01T02:23:55","slug":"solr-json-facets-for-reporting-and-data-aggregation","status":"publish","type":"post","link":"https:\/\/kmwllc.com\/index.php\/2020\/04\/01\/solr-json-facets-for-reporting-and-data-aggregation\/","title":{"rendered":"Solr JSON Facets for Reporting and Data Aggregation"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"26188\" class=\"elementor elementor-26188\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-68c27652 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"68c27652\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-41cd2342\" data-id=\"41cd2342\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5f9fe90a flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor\" data-id=\"5f9fe90a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-text-editor elementor-clearfix\">\r\n\t\t\t\t\t\t\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" width=\"705\" height=\"287\" class=\"wp-image-26189\" src=\"http:\/\/3.85.220.248\/wp-content\/uploads\/2021\/03\/Computer_Girl.png\" alt=\"\" srcset=\"https:\/\/kmwllc.com\/wp-content\/uploads\/2021\/03\/Computer_Girl.png 705w, https:\/\/kmwllc.com\/wp-content\/uploads\/2021\/03\/Computer_Girl-300x122.png 300w\" sizes=\"(max-width: 705px) 100vw, 705px\" \/><\/figure>\n\n<p><span style=\"font-weight: 400;\">Today, I want to talk a bit about Solr\u2019s JSON faceting system, typical facet uses, and then get into more advanced uses.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Most Solr users already have a pretty good idea of what facets are used for. A facet result, at its most basic level, tells you how many documents in your result set have a given value in a given field. Originally, facets results were requested using request parameters, and were somewhat limited.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As of Solr 5, JSON facets are really the way to go. Yonik Seeley and others already give a pretty good <\/span><a href=\"http:\/\/yonik.com\/json-facet-api\/\"><span style=\"font-weight: 400;\">description<\/span><\/a><span style=\"font-weight: 400;\"> of how JSON facets can be used to replace the antiquated general facet request. The JSON facet API is vastly more powerful than the old parameter-based facet request because it allows nesting, statistics, querying and more. Let\u2019s get into some examples<\/span><\/p>\n\n<h5 class=\"wp-block-heading\">Basic JSON Facet Usages<\/h5>\n\n<p>Let\u2019s say your index is made up of documents that contain a field\u00a0<mark>color<\/mark>\u00a0. A facet on the\u00a0<mark>color<\/mark>\u00a0field might yield\u00a0<mark>red:6<\/mark>,\u00a0<mark>blue:2<\/mark>,\u00a0<mark>white:13<\/mark>. What does this tell you? It tells you that in your current result set, six documents have\u00a0<em>red<\/em>\u00a0in that field, two have\u00a0<em>blue<\/em>\u00a0and thirteen have\u00a0<em>white<\/em>. Pretty simple.<\/p>\n<p>Is that the only thing it tells you? No. It also tells you that the domain (possible values) for the current result set is [red,blue,white]. At the moment, this seems obvious, but it\u2019s important to think about it from that perspective. Why? If the documents in your index represent products, and they have a location as well as a color, then the question you may be trying to answer is: \u201cwhat colors are available at the Boston warehouse?\u201d. This question is easily answered by issuing a query\u00a0<mark>location:Boston<\/mark>\u00a0with a facet request on the\u00a0<mark>color<\/mark>\u00a0field (with mincount=1). So, faceting becomes useful from a reporting standpoint because questions like this are often asked by our clients<\/p>\n\n<h5 class=\"wp-block-heading\">More Advanced Usages<\/h5>\n\n<p>The JSON facet API has a lot more power built in. First, the facet requests can be nested. Using our example from above, this means that instead of filtering to\u00a0<mark>location:Boston<\/mark>, we can answer the question: \u201cwhat colors are available at\u00a0<em>all<\/em>\u00a0locations\u201d. You can do this by nesting the color facet inside of a location facet.<\/p>\n\n<pre class=\"wp-block-preformatted\"><mark class=\"has-inline-color has-vivid-cyan-blue-color\" style=\"background-color: rgba(0, 0, 0, 0);\">location{\n    buckets[{\n       val:\"Boston\",\n       count:123,\n       color{\n       buckets[{\n          val:\"red\",\n          count:50},\n         {\n          val:\"blue\",\n          count:40},\n         {\n          val:\"white\",\n          count:33}\n         }\n       },{\n          val:\"New York\",\n          count:102,\n          color{\n             buckets[{\n                val:\"red\",\n                count:35},\n               {\n                val:\"blue\",\n                count:34},\n              {\n               val:\"white\",\n               count:33}\n              }\n         }\n }<\/mark><\/pre>\n\n<pre class=\"wp-block-preformatted\"><mark class=\"has-inline-color has-vivid-cyan-blue-color\" style=\"background-color: rgba(0, 0, 0, 0);\">In the above example, there are 123 products in Boston (50 red, 40 blue, 33 white) and 102 in NY (35 red, 34 blue, 33 white)<\/mark><\/pre>\n\n<p>Now you can begin to see how one might build an analytics and reporting system based on facets. Most of the things I\u2019ve talked about so far have been written about before. There\u2019s a good amount of information on\u00a0<a href=\"http:\/\/yonik.com\/solr-subfacets\/\">Yonik\u2019s blog<\/a>. What I wanted to add is an example of how we\u2019ve used JSON facets with one client to build a comprehensive report, and what we had to do to get there.<\/p>\n\n<h4 class=\"wp-block-heading\">Building a Comprehensive Report with Advanced Querying<\/h4>\n\n<p>One of the really nice newer features of the JSON facet API is the ability to \u201cchange domains\u201d in a facet request.<\/p>\n\n<figure class=\"wp-block-pullquote\">\n<blockquote>\n<p>The domain of a facet is the set of values (normally de\ufb01ned by a set of documents) that calculations will be done over. The root domain is the set of documents that match the base query and any \ufb01lters.<\/p>\n<\/blockquote>\n<\/figure>\n\n<p>Domain change allows you to exclude parts of your base query and\/or add a \ufb01lter in order to change the result set that the facet is working against. Using our example above, if the base query includes a \ufb01lter\u00a0<mark>location:Boston<\/mark>, you may still want to be able to answer the question about\u00a0<em>all locations<\/em>. Without a domain change, the facet result will only contain Boston because that\u2019s what your result set is \ufb01ltered to. A domain change allows your facet request to ignore that part of the \ufb01lter\/query. This is a powerful thing, because in a single query request, you can obtain your normal query results as well as any other (perhaps totally unrelated) data, in as many facet requests as is necessary. This is essentially like doing multiple searches with a single request.<\/p>\n\n<p>Our client needed a tool to allow their users to obtain extremely detailed information and calculations on their data. The search entailed several steps. First, it required a basic search to obtain the correct set of documents. Then we had to join (graph really) in other documents that contained useful information. Finally, many calculations and aggregations were run on the data using facets. The JSON facet API allowed us to do this nicely with a single query (with one exception, which I\u2019ll get into later). We used the existing search and facet API to accomplish the task. However, at some point, it became useful for our client to have a full report of the \ufb01ndings rather than a search interface. Essentially, what they needed was the resulting outputs from all possible queries of which there were thousands. Issuing thousands of queries to Solr and then manually aggregating the results was not feasible. The astute among you may see where I\u2019m going with this. Since our result data was already facet based calculations and aggregations, obtaining all possible search results is just a parent facet to the existing query. Here\u2019s a simpli\ufb01ed example: Revisiting our product example, let\u2019s say that the search we built allows users to search for a product and get a breakdown of average sale price per location. The facet request might look something like this:<\/p>\n\n<pre class=\"wp-block-preformatted\"><mark class=\"has-inline-color has-vivid-cyan-blue-color\" style=\"background-color: rgba(0, 0, 0, 0);\">&amp;q=\"product_name:\\\"dell xps 15\\\"\"\n &amp;json.facet={\n    avg_by_location_and_color:{\n       type:\"terms\",\n       field:\"location\",\n       mincount:1,\n       facet:{\n          color:{\n             type:\"terms\",\n             field:\"color\",\n             facet:{\n                avg_price:\"avg(price)\"\n             }\n          }\n       }\n    }\n }<\/mark><\/pre>\n\n<p>In this example, you\u2019ll see the average price of the \u201cdell xps 15\u201d broken down by location and then color. Now, it might be a little easier to see that if we want to get those numbers for every product, we can omit the original query, and wrap the entire facet in a parent facet that looks at the product_name \ufb01eld (assuming product_name is not tokenized). This is similar to what we were doing for our client to produce a very large report for them. The one hangup we had was that their original \u201cproduct\u201d query wasn\u2019t this simple. In fact, it was a\u00a0<a href=\"https:\/\/lucene.apache.org\/solr\/guide\/7_7\/json-facet-api.html#graph-traversal-domain-changes\">graph query<\/a>\u00a0whose job it was to join in other documents containing data we needed for calculations. At the time, the domain functionality of the JSON facet API supported join, but not graph. As a result, we ended up adding the functionality to Solr in\u00a0<a href=\"https:\/\/issues.apache.org\/jira\/browse\/SOLR-12328\">version 7.4<\/a>. This allowed us to recreate our base query as a facet request and obtain all possible values at once. This use case is probably not what you normally want to do, because it\u2019s effectively thousands of queries (in our case) at once and consequently very slow. But this is what our client needed for this specialized case, and it illustrates the power of the JSON facet API nicely.<\/p>\n\n<h4 class=\"wp-block-heading\">Extending the JSON Facet API<\/h4>\n\n<p>Earlier, I alluded to the fact that we could basically get away with doing everything in a single Solr query. This is really nice for a number of reasons. For one, having all of your data consolidated and returned in a single response eliminates some timing housekeeping you\u2019d otherwise have to do in your UI. We\u00a0<em>almost<\/em> get away with doing everything as a single query, but not quite. And this gives me a bit of an opportunity to talk about how I\u2019d like to extend the facet API next. There is one piece of functionality that isn\u2019t present yet in the API.<\/p>\n<p>During our overly complicated faceting hierarchy, at some point we\u2019re obtaining data from one of the facet results and we\u2019d then like to use that data in some further sub-faceting. As a quick and simple example, imagine you want to use our above facet request to get the average price, but then you want to sub-facet to show how many products are below average and how many are above. It would be really nice if you could\u00a0<em>use<\/em>\u00a0your calculated values in descendant facet requests.<\/p>\n\n<pre class=\"wp-block-preformatted\"><mark class=\"has-inline-color has-vivid-cyan-blue-color\" style=\"background-color: rgba(0, 0, 0, 0);\">&amp;q=\"product_name:\\\"dell xps 15\\\"\" \n  &amp;json.facet={ \n      avg_by_location_and_color avg_by_location_and_color{ \n          type:\"terms\", \n          field:\"location\", \n          mincount:1, \n          facet:{\n              color:{ \n                  type:\"terms\", \n                  field:\"color\", \n                  facet{ \n                      avg_price:\"avg(price)\", \n                      facet:{ \n                          below_avg{ \n                              type:\"query\", \n                              q:\"price:[* TO ${avg_price}]\" \n                 },          }, \n                             above_avg:{ \n                              type:\"query\", \n                              q:\"price:{${avg_price} TO *]\" \n                 } \n                           } \n                     } \n                 } \n             } \n         } \n     }<\/mark><\/pre>\n\n<pre class=\"wp-block-preformatted\"><mark class=\"has-inline-color has-vivid-cyan-blue-color\" style=\"background-color: rgba(0, 0, 0, 0);\">Pseudo code showing how we'd like to be able to use calculations in sub-facets<\/mark><\/pre>\n\n<p><span style=\"font-weight: 400;\">Unfortunately, this currently isn\u2019t possible. For this reason, we have to issue a \ufb01rst request to obtain the values and then a second request with those values encoded in. If this is something you\u2019d like to see implemented at your organization, please reach out!<\/span><\/p>\n<p><br \/><br \/><\/p>\n\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a1ce6cc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a1ce6cc\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-110312a\" data-id=\"110312a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-74ccb4e flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-global elementor-global-28083 elementor-widget-post-navigation\" data-id=\"74ccb4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"post-navigation.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-post-navigation\" role=\"navigation\" aria-label=\"Post Navigation\">\n\t\t\t<div class=\"elementor-post-navigation__prev elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2020\/03\/20\/understanding-tf-idf-and-bm-25\/\" rel=\"prev\"><span class=\"elementor-post-navigation__link__prev\"><span class=\"post-navigation__prev--label\">Previous Post<\/span><span class=\"post-navigation__prev--title\">Understanding TF-IDF and BM-25<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"elementor-post-navigation__next elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2020\/07\/15\/the-cross-collection-join-query\/\" rel=\"next\"><span class=\"elementor-post-navigation__link__next\"><span class=\"post-navigation__next--label\">Next Post<\/span><span class=\"post-navigation__next--title\">The Cross Collection Join Query<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>We go over how we extended Solr&#8217;s JSON Facet API to return large amounts of data and reports for a client&#8217;s use case.<\/p>\n","protected":false},"author":5,"featured_media":29712,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[37],"tags":[],"class_list":{"0":"post-26188","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-solr"},"aioseo_notices":[],"post_meta_fields":{"_wp_page_template":["elementor_theme"],"_edit_lock":["1714530233:7"],"_zilla_likes":["0"],"_thumbnail_id":["29712"],"_edit_last":["7"],"_customize_sidebars":["yes"],"thegem_page_data":["a:190:{s:10:\"title_show\";s:7:\"default\";s:11:\"title_style\";s:1:\"2\";s:14:\"title_template\";s:5:\"27835\";s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:21:\"title_background_type\";s:5:\"color\";s:22:\"title_background_image\";s:0:\"\";s:29:\"title_background_image_repeat\";i:0;s:27:\"title_background_position_x\";s:6:\"center\";s:27:\"title_background_position_y\";s:3:\"top\";s:21:\"title_background_size\";s:5:\"cover\";s:28:\"title_background_image_color\";s:0:\"\";s:30:\"title_background_image_overlay\";s:0:\"\";s:30:\"title_background_gradient_type\";s:6:\"linear\";s:31:\"title_background_gradient_angle\";i:90;s:34:\"title_background_gradient_position\";s:13:\"center center\";s:38:\"title_background_gradient_point1_color\";s:9:\"#00BCD4BF\";s:41:\"title_background_gradient_point1_position\";i:0;s:38:\"title_background_gradient_point2_color\";s:9:\"#354093BF\";s:41:\"title_background_gradient_point2_position\";i:100;s:23:\"title_background_effect\";s:6:\"normal\";s:36:\"title_background_ken_burns_direction\";s:7:\"zoom_in\";s:43:\"title_background_ken_burns_transition_speed\";i:15000;s:37:\"title_background_video_play_on_mobile\";i:0;s:22:\"title_background_color\";s:7:\"#333144\";s:27:\"title_background_video_type\";s:0:\"\";s:22:\"title_background_video\";s:0:\"\";s:35:\"title_background_video_aspect_ratio\";s:0:\"\";s:36:\"title_background_video_overlay_color\";s:0:\"\";s:38:\"title_background_video_overlay_opacity\";s:0:\"\";s:29:\"title_background_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:7:\"#ffffff\";s:24:\"title_excerpt_text_color\";s:7:\"#ffffff\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";i:0;s:19:\"title_excerpt_width\";i:0;s:22:\"title_font_preset_html\";s:0:\"\";s:23:\"title_font_preset_style\";s:0:\"\";s:24:\"title_font_preset_weight\";s:0:\"\";s:27:\"title_font_preset_transform\";s:0:\"\";s:30:\"title_excerpt_font_preset_html\";s:0:\"\";s:31:\"title_excerpt_font_preset_style\";s:0:\"\";s:32:\"title_excerpt_font_preset_weight\";s:0:\"\";s:35:\"title_excerpt_font_preset_transform\";s:0:\"\";s:17:\"title_padding_top\";i:80;s:24:\"title_padding_top_tablet\";i:80;s:24:\"title_padding_top_mobile\";i:80;s:20:\"title_padding_bottom\";i:80;s:27:\"title_padding_bottom_tablet\";i:80;s:27:\"title_padding_bottom_mobile\";i:80;s:18:\"title_padding_left\";i:0;s:25:\"title_padding_left_tablet\";i:0;s:25:\"title_padding_left_mobile\";i:0;s:19:\"title_padding_right\";i:0;s:26:\"title_padding_right_tablet\";i:0;s:26:\"title_padding_right_mobile\";i:0;s:16:\"title_top_margin\";s:0:\"\";s:23:\"title_top_margin_tablet\";i:0;s:23:\"title_top_margin_mobile\";i:0;s:24:\"title_excerpt_top_margin\";i:18;s:31:\"title_excerpt_top_margin_tablet\";i:18;s:31:\"title_excerpt_top_margin_mobile\";i:18;s:17:\"title_breadcrumbs\";i:1;s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:25:\"breadcrumbs_default_color\";s:0:\"\";s:24:\"breadcrumbs_active_color\";s:0:\"\";s:23:\"breadcrumbs_hover_color\";s:0:\"\";s:27:\"title_breadcrumbs_alignment\";s:6:\"center\";s:18:\"header_transparent\";i:0;s:14:\"header_opacity\";i:0;s:22:\"header_menu_logo_light\";i:0;s:20:\"header_hide_top_area\";s:7:\"default\";s:27:\"header_hide_top_area_tablet\";s:7:\"default\";s:27:\"header_hide_top_area_mobile\";s:7:\"default\";s:9:\"menu_show\";s:7:\"default\";s:12:\"menu_options\";s:7:\"default\";s:18:\"header_custom_menu\";i:0;s:27:\"header_top_area_transparent\";i:0;s:23:\"header_top_area_opacity\";i:0;s:16:\"top_area_options\";s:7:\"default\";s:13:\"header_source\";s:7:\"default\";s:14:\"header_builder\";s:1:\"0\";s:29:\"header_builder_sticky_desktop\";i:0;s:28:\"header_builder_sticky_mobile\";i:0;s:34:\"header_builder_sticky_hide_desktop\";i:0;s:33:\"header_builder_sticky_hide_mobile\";i:1;s:21:\"header_builder_sticky\";s:1:\"0\";s:29:\"header_builder_sticky_opacity\";i:80;s:26:\"header_builder_light_color\";s:7:\"#FFFFFF\";s:32:\"header_builder_light_color_hover\";s:7:\"#00bcd4\";s:20:\"main_background_type\";b:0;s:21:\"main_background_color\";s:7:\"#ffffff\";s:21:\"main_background_image\";s:0:\"\";s:28:\"main_background_image_repeat\";i:0;s:26:\"main_background_position_x\";s:6:\"center\";s:26:\"main_background_position_y\";s:6:\"center\";s:20:\"main_background_size\";s:4:\"auto\";s:27:\"main_background_image_color\";s:0:\"\";s:29:\"main_background_image_overlay\";s:0:\"\";s:29:\"main_background_gradient_type\";s:6:\"linear\";s:30:\"main_background_gradient_angle\";i:90;s:33:\"main_background_gradient_position\";s:0:\"\";s:37:\"main_background_gradient_point1_color\";s:9:\"#E9ECDAFF\";s:40:\"main_background_gradient_point1_position\";i:0;s:37:\"main_background_gradient_point2_color\";s:9:\"#D5F6FAFF\";s:40:\"main_background_gradient_point2_position\";i:100;s:23:\"main_background_pattern\";s:0:\"\";s:19:\"content_padding_top\";i:135;s:26:\"content_padding_top_tablet\";s:0:\"\";s:26:\"content_padding_top_mobile\";s:0:\"\";s:22:\"content_padding_bottom\";i:110;s:29:\"content_padding_bottom_tablet\";s:0:\"\";s:29:\"content_padding_bottom_mobile\";s:0:\"\";s:20:\"content_area_options\";s:7:\"default\";s:18:\"footer_custom_show\";s:7:\"default\";s:13:\"footer_custom\";s:5:\"24822\";s:19:\"footer_hide_default\";s:7:\"default\";s:23:\"footer_hide_widget_area\";s:7:\"default\";s:16:\"effects_disabled\";i:0;s:17:\"effects_one_pager\";i:0;s:23:\"effects_parallax_footer\";i:0;s:24:\"effects_no_bottom_margin\";i:0;s:21:\"effects_no_top_margin\";i:0;s:19:\"redirect_to_subpage\";i:0;s:19:\"effects_hide_header\";s:7:\"default\";s:19:\"effects_hide_footer\";s:7:\"default\";s:21:\"effects_page_scroller\";i:0;s:28:\"effects_page_scroller_mobile\";i:0;s:26:\"effects_page_scroller_type\";s:8:\"advanced\";s:22:\"fullpage_disabled_dots\";i:0;s:19:\"fullpage_style_dots\";s:7:\"outline\";s:31:\"fullpage_disabled_tooltips_dots\";i:0;s:25:\"fullpage_fixed_background\";b:0;s:26:\"fullpage_enable_continuous\";i:0;s:24:\"fullpage_disabled_mobile\";i:0;s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:21:\"enable_page_preloader\";s:7:\"default\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:21:\"slideshow_layerslider\";s:0:\"\";s:19:\"slideshow_revslider\";s:0:\"\";s:19:\"slideshow_preloader\";i:1;s:12:\"sidebar_show\";s:8:\"disabled\";s:16:\"sidebar_position\";s:4:\"left\";s:14:\"sidebar_sticky\";i:0;s:24:\"product_header_separator\";i:0;s:23:\"page_layout_breadcrumbs\";s:7:\"default\";s:37:\"page_layout_breadcrumbs_default_color\";s:9:\"#99A9B5FF\";s:36:\"page_layout_breadcrumbs_active_color\";s:9:\"#3C3950FF\";s:35:\"page_layout_breadcrumbs_hover_color\";s:9:\"#3C3950FF\";s:33:\"page_layout_breadcrumbs_alignment\";s:4:\"left\";s:38:\"page_layout_breadcrumbs_bottom_spacing\";s:1:\"0\";s:37:\"page_layout_breadcrumbs_shop_category\";i:0;s:18:\"delay_js_execution\";i:0;s:13:\"disable_cache\";i:0;s:27:\"title_video_overlay_opacity\";s:0:\"\";s:31:\"title_breadcrumbs_shop_category\";s:1:\"0\";s:20:\"title_padding_locked\";s:0:\"\";s:27:\"title_padding_tablet_locked\";s:0:\"\";s:27:\"title_padding_mobile_locked\";s:0:\"\";s:24:\"title_background_pattern\";s:0:\"\";s:30:\"title_background_video_overlay\";s:0:\"\";s:16:\"title_icon__pack\";s:0:\"\";s:21:\"title_icon_shape_show\";s:0:\"\";s:25:\"footer_widget_woocommerce\";s:1:\"1\";s:19:\"portfolio_item_data\";a:9:{s:8:\"back_url\";s:0:\"\";s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:0:\"\";s:14:\"overview_title\";s:0:\"\";s:16:\"overview_summary\";s:0:\"\";s:12:\"project_link\";s:0:\"\";s:12:\"project_text\";s:0:\"\";s:9:\"fullwidth\";s:0:\"\";s:19:\"project_button_show\";s:0:\"\";}s:23:\"portfolio_elements_data\";a:7:{s:23:\"portfolio_page_elements\";s:7:\"default\";s:19:\"portfolio_hide_date\";s:0:\"\";s:19:\"portfolio_hide_sets\";s:0:\"\";s:20:\"portfolio_hide_likes\";s:0:\"\";s:22:\"portfolio_hide_socials\";s:0:\"\";s:29:\"portfolio_hide_top_navigation\";s:0:\"\";s:32:\"portfolio_hide_bottom_navigation\";s:0:\"\";}s:17:\"product_item_data\";a:109:{s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:7:\"squared\";s:28:\"thegem_product_disable_hover\";s:1:\"0\";s:10:\"size_guide\";s:7:\"default\";s:16:\"size_guide_image\";s:0:\"\";s:23:\"product_layout_settings\";s:7:\"default\";s:21:\"product_layout_source\";s:7:\"default\";s:24:\"product_builder_template\";s:0:\"\";s:19:\"product_page_layout\";s:7:\"default\";s:25:\"product_page_layout_style\";s:15:\"horizontal_tabs\";s:28:\"product_page_layout_centered\";s:1:\"0\";s:39:\"product_page_layout_centered_top_margin\";s:2:\"42\";s:34:\"product_page_layout_centered_boxed\";s:1:\"0\";s:40:\"product_page_layout_centered_boxed_color\";s:0:\"\";s:29:\"product_page_layout_fullwidth\";s:1:\"0\";s:26:\"product_page_layout_sticky\";s:1:\"0\";s:33:\"product_page_layout_sticky_offset\";s:1:\"0\";s:28:\"product_page_skeleton_loader\";s:1:\"0\";s:30:\"product_page_layout_background\";s:0:\"\";s:30:\"product_page_layout_title_area\";s:8:\"disabled\";s:29:\"product_page_ajax_add_to_cart\";s:1:\"1\";s:31:\"product_page_desc_review_source\";s:17:\"extra_description\";s:31:\"product_page_desc_review_layout\";s:4:\"tabs\";s:42:\"product_page_desc_review_layout_tabs_style\";s:10:\"horizontal\";s:46:\"product_page_desc_review_layout_tabs_alignment\";s:4:\"left\";s:44:\"product_page_desc_review_layout_acc_position\";s:13:\"below_gallery\";s:65:\"product_page_desc_review_layout_one_by_one_description_background\";s:9:\"#F4F6F7FF\";s:69:\"product_page_desc_review_layout_one_by_one_additional_info_background\";s:9:\"#FFFFFFFF\";s:61:\"product_page_desc_review_layout_one_by_one_reviews_background\";s:9:\"#F4F6F7FF\";s:36:\"product_page_desc_review_description\";s:1:\"1\";s:42:\"product_page_desc_review_description_title\";s:11:\"Description\";s:40:\"product_page_desc_review_additional_info\";s:1:\"1\";s:46:\"product_page_desc_review_additional_info_title\";s:15:\"Additional Info\";s:32:\"product_page_desc_review_reviews\";s:1:\"1\";s:38:\"product_page_desc_review_reviews_title\";s:7:\"Reviews\";s:36:\"product_page_button_add_to_cart_text\";s:11:\"Add to Cart\";s:36:\"product_page_button_add_to_cart_icon\";s:4:\"f1e7\";s:41:\"product_page_button_add_to_cart_icon_pack\";s:8:\"material\";s:45:\"product_page_button_add_to_cart_icon_position\";s:4:\"left\";s:40:\"product_page_button_add_to_wishlist_icon\";s:4:\"f37b\";s:45:\"product_page_button_add_to_wishlist_icon_pack\";s:8:\"material\";s:42:\"product_page_button_added_to_wishlist_icon\";s:4:\"f377\";s:47:\"product_page_button_added_to_wishlist_icon_pack\";s:8:\"material\";s:41:\"product_page_button_clear_attributes_text\";s:15:\"Clear selection\";s:31:\"product_page_elements_prev_next\";s:1:\"1\";s:38:\"product_page_elements_preview_on_hover\";s:1:\"1\";s:34:\"product_page_elements_back_to_shop\";s:1:\"1\";s:39:\"product_page_elements_back_to_shop_link\";s:9:\"main_shop\";s:50:\"product_page_elements_back_to_shop_link_custom_url\";s:0:\"\";s:27:\"product_page_elements_title\";s:1:\"1\";s:32:\"product_page_elements_attributes\";s:1:\"0\";s:37:\"product_page_elements_attributes_data\";s:0:\"\";s:29:\"product_page_elements_reviews\";s:1:\"1\";s:34:\"product_page_elements_reviews_text\";s:16:\"customer reviews\";s:27:\"product_page_elements_price\";s:1:\"1\";s:41:\"product_page_elements_price_strikethrough\";s:1:\"1\";s:33:\"product_page_elements_description\";s:1:\"1\";s:34:\"product_page_elements_stock_amount\";s:1:\"1\";s:39:\"product_page_elements_stock_amount_text\";s:17:\"Products in stock\";s:32:\"product_page_elements_size_guide\";s:1:\"1\";s:25:\"product_page_elements_sku\";s:1:\"1\";s:31:\"product_page_elements_sku_title\";s:3:\"SKU\";s:32:\"product_page_elements_categories\";s:1:\"1\";s:38:\"product_page_elements_categories_title\";s:10:\"Categories\";s:26:\"product_page_elements_tags\";s:1:\"1\";s:32:\"product_page_elements_tags_title\";s:4:\"Tags\";s:27:\"product_page_elements_share\";s:1:\"1\";s:33:\"product_page_elements_share_title\";s:5:\"Share\";s:36:\"product_page_elements_share_facebook\";s:1:\"1\";s:35:\"product_page_elements_share_twitter\";s:1:\"1\";s:37:\"product_page_elements_share_pinterest\";s:1:\"1\";s:34:\"product_page_elements_share_tumblr\";s:1:\"1\";s:36:\"product_page_elements_share_linkedin\";s:1:\"1\";s:34:\"product_page_elements_share_reddit\";s:1:\"1\";s:28:\"product_page_elements_upsell\";s:1:\"1\";s:34:\"product_page_elements_upsell_title\";s:17:\"You may also like\";s:44:\"product_page_elements_upsell_title_alignment\";s:4:\"left\";s:34:\"product_page_elements_upsell_items\";s:2:\"-1\";s:44:\"product_page_elements_upsell_columns_desktop\";s:2:\"4x\";s:43:\"product_page_elements_upsell_columns_tablet\";s:2:\"3x\";s:43:\"product_page_elements_upsell_columns_mobile\";s:2:\"2x\";s:40:\"product_page_elements_upsell_columns_100\";s:1:\"5\";s:29:\"product_page_elements_related\";s:1:\"1\";s:35:\"product_page_elements_related_title\";s:16:\"Related Products\";s:45:\"product_page_elements_related_title_alignment\";s:4:\"left\";s:35:\"product_page_elements_related_items\";s:2:\"-1\";s:45:\"product_page_elements_related_columns_desktop\";s:2:\"4x\";s:44:\"product_page_elements_related_columns_tablet\";s:2:\"3x\";s:44:\"product_page_elements_related_columns_mobile\";s:2:\"2x\";s:41:\"product_page_elements_related_columns_100\";s:1:\"5\";s:15:\"product_gallery\";s:7:\"enabled\";s:20:\"product_gallery_type\";s:10:\"horizontal\";s:31:\"product_gallery_column_position\";s:4:\"left\";s:28:\"product_gallery_column_width\";s:2:\"50\";s:26:\"product_gallery_show_image\";s:5:\"hover\";s:20:\"product_gallery_zoom\";s:1:\"1\";s:24:\"product_gallery_lightbox\";s:1:\"1\";s:22:\"product_gallery_labels\";s:1:\"1\";s:26:\"product_gallery_label_sale\";s:1:\"1\";s:25:\"product_gallery_label_new\";s:1:\"1\";s:31:\"product_gallery_label_out_stock\";s:1:\"1\";s:27:\"product_gallery_auto_height\";s:1:\"1\";s:30:\"product_gallery_elements_color\";s:0:\"\";s:28:\"product_gallery_grid_columns\";s:2:\"1x\";s:25:\"product_gallery_grid_gaps\";s:2:\"42\";s:30:\"product_gallery_grid_gaps_hide\";s:1:\"0\";s:31:\"product_gallery_grid_top_margin\";s:1:\"0\";s:30:\"product_gallery_video_autoplay\";s:1:\"0\";s:15:\"size_guide_text\";s:10:\"Size guide\";}s:25:\"product_archive_item_data\";a:2:{s:29:\"product_archive_layout_source\";s:7:\"default\";s:32:\"product_archive_builder_template\";s:0:\"\";}s:22:\"blog_archive_item_data\";a:2:{s:26:\"blog_archive_layout_source\";s:7:\"default\";s:29:\"blog_archive_builder_template\";s:0:\"\";}s:24:\"options_current_contents\";N;s:16:\"options_modified\";N;s:34:\"options_outside_parameter_modified\";b:0;s:22:\"options_saved_contents\";N;s:8:\"settings\";a:3:{s:5:\"theme\";s:5:\"light\";s:24:\"background_image_gallery\";a:0:{}s:21:\"colorpicker_favorites\";a:1:{s:7:\"default\";a:0:{}}}s:26:\"delay_js_execution_desktop\";s:1:\"0\";s:25:\"delay_js_execution_mobile\";s:1:\"0\";}"],"thegem_post_general_item_data":["a:22:{s:20:\"post_layout_settings\";s:7:\"default\";s:18:\"post_layout_source\";s:7:\"default\";s:21:\"post_builder_template\";s:1:\"0\";s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";s:8:\"disabled\";s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"thegem_show_featured_posts_slider":["0"],"_wp_old_date":["2021-03-14"],"_oembed_79d813f23eb66ee4bdc588fa6494d268":["{{unknown}}"],"thegem_page_data_old":["a:46:{s:11:\"title_style\";s:1:\"1\";s:14:\"title_template\";i:0;s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:22:\"title_background_image\";s:0:\"\";s:25:\"title_background_parallax\";i:0;s:22:\"title_background_color\";s:0:\"\";s:16:\"title_video_type\";s:0:\"\";s:22:\"title_video_background\";s:0:\"\";s:24:\"title_video_aspect_ratio\";s:0:\"\";s:25:\"title_video_overlay_color\";s:0:\"\";s:27:\"title_video_overlay_opacity\";s:0:\"\";s:18:\"title_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:0:\"\";s:24:\"title_excerpt_text_color\";s:0:\"\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";s:1:\"0\";s:19:\"title_excerpt_width\";s:1:\"0\";s:17:\"title_padding_top\";s:2:\"80\";s:20:\"title_padding_bottom\";s:2:\"80\";s:16:\"title_top_margin\";s:1:\"0\";s:24:\"title_excerpt_top_margin\";s:2:\"18\";s:17:\"title_breadcrumbs\";s:1:\"1\";s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:14:\"header_opacity\";s:1:\"0\";s:23:\"header_top_area_opacity\";s:1:\"0\";s:13:\"footer_custom\";s:5:\"24822\";s:16:\"sidebar_position\";s:0:\"\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:19:\"fullpage_style_dots\";s:7:\"outline\";s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:14:\"sidebar_sticky\";i:0;}"],"thegem_post_general_item_data_old":["a:19:{s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";i:0;s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"thegem_post_page_elements_data":["a:12:{s:13:\"post_elements\";s:7:\"default\";s:11:\"show_author\";i:0;s:16:\"blog_hide_author\";i:0;s:14:\"blog_hide_date\";i:0;s:26:\"blog_hide_date_in_blog_cat\";i:0;s:20:\"blog_hide_categories\";i:0;s:14:\"blog_hide_tags\";i:0;s:18:\"blog_hide_comments\";i:0;s:15:\"blog_hide_likes\";i:0;s:20:\"blog_hide_navigation\";i:0;s:17:\"blog_hide_socials\";i:0;s:17:\"blog_hide_realted\";i:0;}"],"_elementor_edit_mode":["builder"],"_elementor_template_type":["wp-post"],"_elementor_version":["3.18.3"],"_elementor_data":["[{\"id\":\"68c27652\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"41cd2342\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"5f9fe90a\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<!-- wp:image {\\\"id\\\":26189,\\\"sizeSlug\\\":\\\"large\\\",\\\"linkDestination\\\":\\\"none\\\"} -->\\n<figure class=\\\"wp-block-image size-large\\\"><img class=\\\"wp-image-26189\\\" src=\\\"http:\\\/\\\/3.85.220.248\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/Computer_Girl.png\\\" alt=\\\"\\\" \\\/><\\\/figure>\\n<!-- \\\/wp:image --><!-- wp:paragraph -->\\n<p><span style=\\\"font-weight: 400;\\\">Today, I want to talk a bit about Solr\\u2019s JSON faceting system, typical facet uses, and then get into more advanced uses.<\\\/span><\\\/p>\\n<p><span style=\\\"font-weight: 400;\\\">Most Solr users already have a pretty good idea of what facets are used for. A facet result, at its most basic level, tells you how many documents in your result set have a given value in a given field. Originally, facets results were requested using request parameters, and were somewhat limited.<\\\/span><\\\/p>\\n<p><span style=\\\"font-weight: 400;\\\">As of Solr 5, JSON facets are really the way to go. Yonik Seeley and others already give a pretty good <\\\/span><a href=\\\"http:\\\/\\\/yonik.com\\\/json-facet-api\\\/\\\"><span style=\\\"font-weight: 400;\\\">description<\\\/span><\\\/a><span style=\\\"font-weight: 400;\\\"> of how JSON facets can be used to replace the antiquated general facet request. The JSON facet API is vastly more powerful than the old parameter-based facet request because it allows nesting, statistics, querying and more. Let\\u2019s get into some examples<\\\/span><\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:heading {\\\"level\\\":5} -->\\n<h5>Basic JSON Facet Usages<\\\/h5>\\n<!-- \\\/wp:heading --><!-- wp:paragraph -->\\n<p>Let\\u2019s say your index is made up of documents that contain a field\\u00a0<mark>color<\\\/mark>\\u00a0. A facet on the\\u00a0<mark>color<\\\/mark>\\u00a0field might yield\\u00a0<mark>red:6<\\\/mark>,\\u00a0<mark>blue:2<\\\/mark>,\\u00a0<mark>white:13<\\\/mark>. What does this tell you? It tells you that in your current result set, six documents have\\u00a0<em>red<\\\/em>\\u00a0in that field, two have\\u00a0<em>blue<\\\/em>\\u00a0and thirteen have\\u00a0<em>white<\\\/em>. Pretty simple.<\\\/p>\\n<p>Is that the only thing it tells you? No. It also tells you that the domain (possible values) for the current result set is [red,blue,white]. At the moment, this seems obvious, but it\\u2019s important to think about it from that perspective. Why? If the documents in your index represent products, and they have a location as well as a color, then the question you may be trying to answer is: \\u201cwhat colors are available at the Boston warehouse?\\u201d. This question is easily answered by issuing a query\\u00a0<mark>location:Boston<\\\/mark>\\u00a0with a facet request on the\\u00a0<mark>color<\\\/mark>\\u00a0field (with mincount=1). So, faceting becomes useful from a reporting standpoint because questions like this are often asked by our clients<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:heading {\\\"level\\\":5} -->\\n<h5>More Advanced Usages<\\\/h5>\\n<!-- \\\/wp:heading --><!-- wp:paragraph -->\\n<p>The JSON facet API has a lot more power built in. First, the facet requests can be nested. Using our example from above, this means that instead of filtering to\\u00a0<mark>location:Boston<\\\/mark>, we can answer the question: \\u201cwhat colors are available at\\u00a0<em>all<\\\/em>\\u00a0locations\\u201d. You can do this by nesting the color facet inside of a location facet.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\"><mark class=\\\"has-inline-color has-vivid-cyan-blue-color\\\" style=\\\"background-color: rgba(0, 0, 0, 0);\\\">location{\\n    buckets[{\\n       val:\\\"Boston\\\",\\n       count:123,\\n       color{\\n       buckets[{\\n          val:\\\"red\\\",\\n          count:50},\\n         {\\n          val:\\\"blue\\\",\\n          count:40},\\n         {\\n          val:\\\"white\\\",\\n          count:33}\\n         }\\n       },{\\n          val:\\\"New York\\\",\\n          count:102,\\n          color{\\n             buckets[{\\n                val:\\\"red\\\",\\n                count:35},\\n               {\\n                val:\\\"blue\\\",\\n                count:34},\\n              {\\n               val:\\\"white\\\",\\n               count:33}\\n              }\\n         }\\n }<\\\/mark><\\\/pre>\\n<!-- \\\/wp:preformatted --><!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\"><mark class=\\\"has-inline-color has-vivid-cyan-blue-color\\\" style=\\\"background-color: rgba(0, 0, 0, 0);\\\">In the above example, there are 123 products in Boston (50 red, 40 blue, 33 white) and 102 in NY (35 red, 34 blue, 33 white)<\\\/mark><\\\/pre>\\n<!-- \\\/wp:preformatted --><!-- wp:paragraph -->\\n<p>Now you can begin to see how one might build an analytics and reporting system based on facets. Most of the things I\\u2019ve talked about so far have been written about before. There\\u2019s a good amount of information on\\u00a0<a href=\\\"http:\\\/\\\/yonik.com\\\/solr-subfacets\\\/\\\">Yonik\\u2019s blog<\\\/a>. What I wanted to add is an example of how we\\u2019ve used JSON facets with one client to build a comprehensive report, and what we had to do to get there.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:heading {\\\"level\\\":4} -->\\n<h4>Building a Comprehensive Report with Advanced Querying<\\\/h4>\\n<!-- \\\/wp:heading --><!-- wp:paragraph -->\\n<p>One of the really nice newer features of the JSON facet API is the ability to \\u201cchange domains\\u201d in a facet request.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:pullquote -->\\n<figure class=\\\"wp-block-pullquote\\\">\\n<blockquote>\\n<p>The domain of a facet is the set of values (normally de\\ufb01ned by a set of documents) that calculations will be done over. The root domain is the set of documents that match the base query and any \\ufb01lters.<\\\/p>\\n<\\\/blockquote>\\n<\\\/figure>\\n<!-- \\\/wp:pullquote --><!-- wp:paragraph -->\\n<p>Domain change allows you to exclude parts of your base query and\\\/or add a \\ufb01lter in order to change the result set that the facet is working against. Using our example above, if the base query includes a \\ufb01lter\\u00a0<mark>location:Boston<\\\/mark>, you may still want to be able to answer the question about\\u00a0<em>all locations<\\\/em>. Without a domain change, the facet result will only contain Boston because that\\u2019s what your result set is \\ufb01ltered to. A domain change allows your facet request to ignore that part of the \\ufb01lter\\\/query. This is a powerful thing, because in a single query request, you can obtain your normal query results as well as any other (perhaps totally unrelated) data, in as many facet requests as is necessary. This is essentially like doing multiple searches with a single request.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:paragraph -->\\n<p>Our client needed a tool to allow their users to obtain extremely detailed information and calculations on their data. The search entailed several steps. First, it required a basic search to obtain the correct set of documents. Then we had to join (graph really) in other documents that contained useful information. Finally, many calculations and aggregations were run on the data using facets. The JSON facet API allowed us to do this nicely with a single query (with one exception, which I\\u2019ll get into later). We used the existing search and facet API to accomplish the task. However, at some point, it became useful for our client to have a full report of the \\ufb01ndings rather than a search interface. Essentially, what they needed was the resulting outputs from all possible queries of which there were thousands. Issuing thousands of queries to Solr and then manually aggregating the results was not feasible. The astute among you may see where I\\u2019m going with this. Since our result data was already facet based calculations and aggregations, obtaining all possible search results is just a parent facet to the existing query. Here\\u2019s a simpli\\ufb01ed example: Revisiting our product example, let\\u2019s say that the search we built allows users to search for a product and get a breakdown of average sale price per location. The facet request might look something like this:<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\"><mark class=\\\"has-inline-color has-vivid-cyan-blue-color\\\" style=\\\"background-color: rgba(0, 0, 0, 0);\\\">&amp;q=\\\"product_name:\\\\\\\"dell xps 15\\\\\\\"\\\"\\n &amp;json.facet={\\n    avg_by_location_and_color:{\\n       type:\\\"terms\\\",\\n       field:\\\"location\\\",\\n       mincount:1,\\n       facet:{\\n          color:{\\n             type:\\\"terms\\\",\\n             field:\\\"color\\\",\\n             facet:{\\n                avg_price:\\\"avg(price)\\\"\\n             }\\n          }\\n       }\\n    }\\n }<\\\/mark><\\\/pre>\\n<!-- \\\/wp:preformatted --><!-- wp:paragraph -->\\n<p>In this example, you\\u2019ll see the average price of the \\u201cdell xps 15\\u201d broken down by location and then color. Now, it might be a little easier to see that if we want to get those numbers for every product, we can omit the original query, and wrap the entire facet in a parent facet that looks at the product_name \\ufb01eld (assuming product_name is not tokenized). This is similar to what we were doing for our client to produce a very large report for them. The one hangup we had was that their original \\u201cproduct\\u201d query wasn\\u2019t this simple. In fact, it was a\\u00a0<a href=\\\"https:\\\/\\\/lucene.apache.org\\\/solr\\\/guide\\\/7_7\\\/json-facet-api.html#graph-traversal-domain-changes\\\">graph query<\\\/a>\\u00a0whose job it was to join in other documents containing data we needed for calculations. At the time, the domain functionality of the JSON facet API supported join, but not graph. As a result, we ended up adding the functionality to Solr in\\u00a0<a href=\\\"https:\\\/\\\/issues.apache.org\\\/jira\\\/browse\\\/SOLR-12328\\\">version 7.4<\\\/a>. This allowed us to recreate our base query as a facet request and obtain all possible values at once. This use case is probably not what you normally want to do, because it\\u2019s effectively thousands of queries (in our case) at once and consequently very slow. But this is what our client needed for this specialized case, and it illustrates the power of the JSON facet API nicely.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:heading {\\\"level\\\":4} -->\\n<h4>Extending the JSON Facet API<\\\/h4>\\n<!-- \\\/wp:heading --><!-- wp:paragraph -->\\n<p>Earlier, I alluded to the fact that we could basically get away with doing everything in a single Solr query. This is really nice for a number of reasons. For one, having all of your data consolidated and returned in a single response eliminates some timing housekeeping you\\u2019d otherwise have to do in your UI. We\\u00a0<em>almost<\\\/em> get away with doing everything as a single query, but not quite. And this gives me a bit of an opportunity to talk about how I\\u2019d like to extend the facet API next. There is one piece of functionality that isn\\u2019t present yet in the API.<\\\/p>\\n<p>During our overly complicated faceting hierarchy, at some point we\\u2019re obtaining data from one of the facet results and we\\u2019d then like to use that data in some further sub-faceting. As a quick and simple example, imagine you want to use our above facet request to get the average price, but then you want to sub-facet to show how many products are below average and how many are above. It would be really nice if you could\\u00a0<em>use<\\\/em>\\u00a0your calculated values in descendant facet requests.<\\\/p>\\n<!-- \\\/wp:paragraph --><!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\"><mark class=\\\"has-inline-color has-vivid-cyan-blue-color\\\" style=\\\"background-color: rgba(0, 0, 0, 0);\\\">&amp;q=\\\"product_name:\\\\\\\"dell xps 15\\\\\\\"\\\" \\n  &amp;json.facet={ \\n      avg_by_location_and_color avg_by_location_and_color{ \\n          type:\\\"terms\\\", \\n          field:\\\"location\\\", \\n          mincount:1, \\n          facet:{\\n              color:{ \\n                  type:\\\"terms\\\", \\n                  field:\\\"color\\\", \\n                  facet{ \\n                      avg_price:\\\"avg(price)\\\", \\n                      facet:{ \\n                          below_avg{ \\n                              type:\\\"query\\\", \\n                              q:\\\"price:[* TO ${avg_price}]\\\" \\n                 },          }, \\n                             above_avg:{ \\n                              type:\\\"query\\\", \\n                              q:\\\"price:{${avg_price} TO *]\\\" \\n                 } \\n                           } \\n                     } \\n                 } \\n             } \\n         } \\n     }<\\\/mark><\\\/pre>\\n<!-- \\\/wp:preformatted --><!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\"><mark class=\\\"has-inline-color has-vivid-cyan-blue-color\\\" style=\\\"background-color: rgba(0, 0, 0, 0);\\\">Pseudo code showing how we'd like to be able to use calculations in sub-facets<\\\/mark><\\\/pre>\\n<!-- \\\/wp:preformatted --><!-- wp:paragraph -->\\n<p><span style=\\\"font-weight: 400;\\\">Unfortunately, this currently isn\\u2019t possible. For this reason, we have to issue a \\ufb01rst request to obtain the values and then a second request with those values encoded in. If this is something you\\u2019d like to see implemented at your organization, please reach out!<\\\/span><\\\/p>\\n<p><br \\\/><br \\\/><\\\/p>\\n<!-- \\\/wp:paragraph -->\"},\"elements\":[],\"widgetType\":\"text-editor\"}],\"isInner\":false}],\"isInner\":false},{\"id\":\"a1ce6cc\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"110312a\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"_inline_size\":null,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"74ccb4e\",\"elType\":\"widget\",\"settings\":{\"prev_label\":\"Previous Post\",\"next_label\":\"Next Post\",\"show_borders\":\"\",\"title_typography_typography\":\"custom\",\"title_typography_font_size\":{\"unit\":\"px\",\"size\":14,\"sizes\":[]},\"title_typography_font_weight\":\"700\",\"__globals__\":{\"arrow_color\":\"globals\\\/colors?id=primary\",\"label_color\":\"globals\\\/colors?id=secondary\"},\"arrow\":\"fa fa-caret-left\",\"show_arrow\":\"\"},\"elements\":[],\"widgetType\":\"global\",\"templateID\":\"28083\"}],\"isInner\":false}],\"isInner\":false}]"],"_elementor_pro_version":["3.18.3"],"_last_editor_used_jetpack":["block-editor"],"thegem_popups_data":["a:2:{s:20:\"popups_layout_source\";s:7:\"default\";s:12:\"thegemPopups\";a:0:{}}"],"_yoast_wpseo_primary_category":["37"],"_yoast_wpseo_content_score":["30"],"_yoast_wpseo_estimated-reading-time-minutes":["6"],"_yoast_wpseo_wordproof_timestamp":[""],"_elementor_controls_usage":["a:4:{s:11:\"text-editor\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:7:\"content\";a:1:{s:14:\"section_editor\";a:1:{s:6:\"editor\";i:1;}}}}s:6:\"column\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:6:\"layout\";a:1:{s:6:\"layout\";a:1:{s:12:\"_inline_size\";i:1;}}}}s:7:\"section\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:0:{}}s:15:\"post-navigation\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:2;s:8:\"controls\";a:2:{s:7:\"content\";a:1:{s:31:\"section_post_navigation_content\";a:5:{s:10:\"prev_label\";i:1;s:10:\"next_label\";i:1;s:12:\"show_borders\";i:1;s:5:\"arrow\";i:1;s:10:\"show_arrow\";i:1;}}s:5:\"style\";a:1:{s:11:\"title_style\";a:3:{s:27:\"title_typography_typography\";i:1;s:26:\"title_typography_font_size\";i:1;s:28:\"title_typography_font_weight\";i:1;}}}}}"],"_elementor_page_assets":["a:2:{s:7:\"scripts\";a:2:{i:0;s:18:\"elementor-frontend\";i:1;s:15:\"post-navigation\";}s:6:\"styles\";a:1:{i:0;s:22:\"widget-post-navigation\";}}"],"_elementor_css":["a:6:{s:4:\"time\";i:1775590643;s:5:\"fonts\";a:0:{}s:5:\"icons\";a:0:{}s:20:\"dynamic_elements_ids\";a:0:{}s:6:\"status\";s:4:\"file\";i:0;s:0:\"\";}"],"_elementor_element_cache":["{\"timeout\":1776890001,\"value\":{\"content\":\"\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-68c27652 elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"68c27652\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-41cd2342\\\" data-id=\\\"41cd2342\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6IjVmOWZlOTBhIiwiZWxUeXBlIjoid2lkZ2V0Iiwic2V0dGluZ3MiOnsiZWRpdG9yIjoiPCEtLSB3cDppbWFnZSB7XCJpZFwiOjI2MTg5LFwic2l6ZVNsdWdcIjpcImxhcmdlXCIsXCJsaW5rRGVzdGluYXRpb25cIjpcIm5vbmVcIn0gLS0+XG48ZmlndXJlIGNsYXNzPVwid3AtYmxvY2staW1hZ2Ugc2l6ZS1sYXJnZVwiPjxpbWcgY2xhc3M9XCJ3cC1pbWFnZS0yNjE4OVwiIHNyYz1cImh0dHA6XC9cLzMuODUuMjIwLjI0OFwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyMVwvMDNcL0NvbXB1dGVyX0dpcmwucG5nXCIgYWx0PVwiXCIgXC8+PFwvZmlndXJlPlxuPCEtLSBcL3dwOmltYWdlIC0tPjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+PHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPlRvZGF5LCBJIHdhbnQgdG8gdGFsayBhIGJpdCBhYm91dCBTb2xyXHUyMDE5cyBKU09OIGZhY2V0aW5nIHN5c3RlbSwgdHlwaWNhbCBmYWNldCB1c2VzLCBhbmQgdGhlbiBnZXQgaW50byBtb3JlIGFkdmFuY2VkIHVzZXMuPFwvc3Bhbj48XC9wPlxuPHA+PHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPk1vc3QgU29sciB1c2VycyBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBpZGVhIG9mIHdoYXQgZmFjZXRzIGFyZSB1c2VkIGZvci4gQSBmYWNldCByZXN1bHQsIGF0IGl0cyBtb3N0IGJhc2ljIGxldmVsLCB0ZWxscyB5b3UgaG93IG1hbnkgZG9jdW1lbnRzIGluIHlvdXIgcmVzdWx0IHNldCBoYXZlIGEgZ2l2ZW4gdmFsdWUgaW4gYSBnaXZlbiBmaWVsZC4gT3JpZ2luYWxseSwgZmFjZXRzIHJlc3VsdHMgd2VyZSByZXF1ZXN0ZWQgdXNpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzLCBhbmQgd2VyZSBzb21ld2hhdCBsaW1pdGVkLjxcL3NwYW4+PFwvcD5cbjxwPjxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMDtcIj5BcyBvZiBTb2xyIDUsIEpTT04gZmFjZXRzIGFyZSByZWFsbHkgdGhlIHdheSB0byBnby4gWW9uaWsgU2VlbGV5IGFuZCBvdGhlcnMgYWxyZWFkeSBnaXZlIGEgcHJldHR5IGdvb2QgPFwvc3Bhbj48YSBocmVmPVwiaHR0cDpcL1wveW9uaWsuY29tXC9qc29uLWZhY2V0LWFwaVwvXCI+PHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPmRlc2NyaXB0aW9uPFwvc3Bhbj48XC9hPjxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMDtcIj4gb2YgaG93IEpTT04gZmFjZXRzIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGFudGlxdWF0ZWQgZ2VuZXJhbCBmYWNldCByZXF1ZXN0LiBUaGUgSlNPTiBmYWNldCBBUEkgaXMgdmFzdGx5IG1vcmUgcG93ZXJmdWwgdGhhbiB0aGUgb2xkIHBhcmFtZXRlci1iYXNlZCBmYWNldCByZXF1ZXN0IGJlY2F1c2UgaXQgYWxsb3dzIG5lc3RpbmcsIHN0YXRpc3RpY3MsIHF1ZXJ5aW5nIGFuZCBtb3JlLiBMZXRcdTIwMTlzIGdldCBpbnRvIHNvbWUgZXhhbXBsZXM8XC9zcGFuPjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjV9IC0tPlxuPGg1PkJhc2ljIEpTT04gRmFjZXQgVXNhZ2VzPFwvaDU+XG48IS0tIFwvd3A6aGVhZGluZyAtLT48IS0tIHdwOnBhcmFncmFwaCAtLT5cbjxwPkxldFx1MjAxOXMgc2F5IHlvdXIgaW5kZXggaXMgbWFkZSB1cCBvZiBkb2N1bWVudHMgdGhhdCBjb250YWluIGEgZmllbGRcdTAwYTA8bWFyaz5jb2xvcjxcL21hcms+XHUwMGEwLiBBIGZhY2V0IG9uIHRoZVx1MDBhMDxtYXJrPmNvbG9yPFwvbWFyaz5cdTAwYTBmaWVsZCBtaWdodCB5aWVsZFx1MDBhMDxtYXJrPnJlZDo2PFwvbWFyaz4sXHUwMGEwPG1hcms+Ymx1ZToyPFwvbWFyaz4sXHUwMGEwPG1hcms+d2hpdGU6MTM8XC9tYXJrPi4gV2hhdCBkb2VzIHRoaXMgdGVsbCB5b3U\\\/IEl0IHRlbGxzIHlvdSB0aGF0IGluIHlvdXIgY3VycmVudCByZXN1bHQgc2V0LCBzaXggZG9jdW1lbnRzIGhhdmVcdTAwYTA8ZW0+cmVkPFwvZW0+XHUwMGEwaW4gdGhhdCBmaWVsZCwgdHdvIGhhdmVcdTAwYTA8ZW0+Ymx1ZTxcL2VtPlx1MDBhMGFuZCB0aGlydGVlbiBoYXZlXHUwMGEwPGVtPndoaXRlPFwvZW0+LiBQcmV0dHkgc2ltcGxlLjxcL3A+XG48cD5JcyB0aGF0IHRoZSBvbmx5IHRoaW5nIGl0IHRlbGxzIHlvdT8gTm8uIEl0IGFsc28gdGVsbHMgeW91IHRoYXQgdGhlIGRvbWFpbiAocG9zc2libGUgdmFsdWVzKSBmb3IgdGhlIGN1cnJlbnQgcmVzdWx0IHNldCBpcyBbcmVkLGJsdWUsd2hpdGVdLiBBdCB0aGUgbW9tZW50LCB0aGlzIHNlZW1zIG9idmlvdXMsIGJ1dCBpdFx1MjAxOXMgaW1wb3J0YW50IHRvIHRoaW5rIGFib3V0IGl0IGZyb20gdGhhdCBwZXJzcGVjdGl2ZS4gV2h5PyBJZiB0aGUgZG9jdW1lbnRzIGluIHlvdXIgaW5kZXggcmVwcmVzZW50IHByb2R1Y3RzLCBhbmQgdGhleSBoYXZlIGEgbG9jYXRpb24gYXMgd2VsbCBhcyBhIGNvbG9yLCB0aGVuIHRoZSBxdWVzdGlvbiB5b3UgbWF5IGJlIHRyeWluZyB0byBhbnN3ZXIgaXM6IFx1MjAxY3doYXQgY29sb3JzIGFyZSBhdmFpbGFibGUgYXQgdGhlIEJvc3RvbiB3YXJlaG91c2U\\\/XHUyMDFkLiBUaGlzIHF1ZXN0aW9uIGlzIGVhc2lseSBhbnN3ZXJlZCBieSBpc3N1aW5nIGEgcXVlcnlcdTAwYTA8bWFyaz5sb2NhdGlvbjpCb3N0b248XC9tYXJrPlx1MDBhMHdpdGggYSBmYWNldCByZXF1ZXN0IG9uIHRoZVx1MDBhMDxtYXJrPmNvbG9yPFwvbWFyaz5cdTAwYTBmaWVsZCAod2l0aCBtaW5jb3VudD0xKS4gU28sIGZhY2V0aW5nIGJlY29tZXMgdXNlZnVsIGZyb20gYSByZXBvcnRpbmcgc3RhbmRwb2ludCBiZWNhdXNlIHF1ZXN0aW9ucyBsaWtlIHRoaXMgYXJlIG9mdGVuIGFza2VkIGJ5IG91ciBjbGllbnRzPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PCEtLSB3cDpoZWFkaW5nIHtcImxldmVsXCI6NX0gLS0+XG48aDU+TW9yZSBBZHZhbmNlZCBVc2FnZXM8XC9oNT5cbjwhLS0gXC93cDpoZWFkaW5nIC0tPjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+VGhlIEpTT04gZmFjZXQgQVBJIGhhcyBhIGxvdCBtb3JlIHBvd2VyIGJ1aWx0IGluLiBGaXJzdCwgdGhlIGZhY2V0IHJlcXVlc3RzIGNhbiBiZSBuZXN0ZWQuIFVzaW5nIG91ciBleGFtcGxlIGZyb20gYWJvdmUsIHRoaXMgbWVhbnMgdGhhdCBpbnN0ZWFkIG9mIGZpbHRlcmluZyB0b1x1MDBhMDxtYXJrPmxvY2F0aW9uOkJvc3RvbjxcL21hcms+LCB3ZSBjYW4gYW5zd2VyIHRoZSBxdWVzdGlvbjogXHUyMDFjd2hhdCBjb2xvcnMgYXJlIGF2YWlsYWJsZSBhdFx1MDBhMDxlbT5hbGw8XC9lbT5cdTAwYTBsb2NhdGlvbnNcdTIwMWQuIFlvdSBjYW4gZG8gdGhpcyBieSBuZXN0aW5nIHRoZSBjb2xvciBmYWNldCBpbnNpZGUgb2YgYSBsb2NhdGlvbiBmYWNldC48XC9wPlxuPCEtLSBcL3dwOnBhcmFncmFwaCAtLT48IS0tIHdwOnByZWZvcm1hdHRlZCAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1wcmVmb3JtYXR0ZWRcIj48bWFyayBjbGFzcz1cImhhcy1pbmxpbmUtY29sb3IgaGFzLXZpdmlkLWN5YW4tYmx1ZS1jb2xvclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcIj5sb2NhdGlvbntcbiAgICBidWNrZXRzW3tcbiAgICAgICB2YWw6XCJCb3N0b25cIixcbiAgICAgICBjb3VudDoxMjMsXG4gICAgICAgY29sb3J7XG4gICAgICAgYnVja2V0c1t7XG4gICAgICAgICAgdmFsOlwicmVkXCIsXG4gICAgICAgICAgY291bnQ6NTB9LFxuICAgICAgICAge1xuICAgICAgICAgIHZhbDpcImJsdWVcIixcbiAgICAgICAgICBjb3VudDo0MH0sXG4gICAgICAgICB7XG4gICAgICAgICAgdmFsOlwid2hpdGVcIixcbiAgICAgICAgICBjb3VudDozM31cbiAgICAgICAgIH1cbiAgICAgICB9LHtcbiAgICAgICAgICB2YWw6XCJOZXcgWW9ya1wiLFxuICAgICAgICAgIGNvdW50OjEwMixcbiAgICAgICAgICBjb2xvcntcbiAgICAgICAgICAgICBidWNrZXRzW3tcbiAgICAgICAgICAgICAgICB2YWw6XCJyZWRcIixcbiAgICAgICAgICAgICAgICBjb3VudDozNX0sXG4gICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsOlwiYmx1ZVwiLFxuICAgICAgICAgICAgICAgIGNvdW50OjM0fSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgdmFsOlwid2hpdGVcIixcbiAgICAgICAgICAgICAgIGNvdW50OjMzfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICB9XG4gfTxcL21hcms+PFwvcHJlPlxuPCEtLSBcL3dwOnByZWZvcm1hdHRlZCAtLT48IS0tIHdwOnByZWZvcm1hdHRlZCAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1wcmVmb3JtYXR0ZWRcIj48bWFyayBjbGFzcz1cImhhcy1pbmxpbmUtY29sb3IgaGFzLXZpdmlkLWN5YW4tYmx1ZS1jb2xvclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcIj5JbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlcmUgYXJlIDEyMyBwcm9kdWN0cyBpbiBCb3N0b24gKDUwIHJlZCwgNDAgYmx1ZSwgMzMgd2hpdGUpIGFuZCAxMDIgaW4gTlkgKDM1IHJlZCwgMzQgYmx1ZSwgMzMgd2hpdGUpPFwvbWFyaz48XC9wcmU+XG48IS0tIFwvd3A6cHJlZm9ybWF0dGVkIC0tPjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+Tm93IHlvdSBjYW4gYmVnaW4gdG8gc2VlIGhvdyBvbmUgbWlnaHQgYnVpbGQgYW4gYW5hbHl0aWNzIGFuZCByZXBvcnRpbmcgc3lzdGVtIGJhc2VkIG9uIGZhY2V0cy4gTW9zdCBvZiB0aGUgdGhpbmdzIElcdTIwMTl2ZSB0YWxrZWQgYWJvdXQgc28gZmFyIGhhdmUgYmVlbiB3cml0dGVuIGFib3V0IGJlZm9yZS4gVGhlcmVcdTIwMTlzIGEgZ29vZCBhbW91bnQgb2YgaW5mb3JtYXRpb24gb25cdTAwYTA8YSBocmVmPVwiaHR0cDpcL1wveW9uaWsuY29tXC9zb2xyLXN1YmZhY2V0c1wvXCI+WW9uaWtcdTIwMTlzIGJsb2c8XC9hPi4gV2hhdCBJIHdhbnRlZCB0byBhZGQgaXMgYW4gZXhhbXBsZSBvZiBob3cgd2VcdTIwMTl2ZSB1c2VkIEpTT04gZmFjZXRzIHdpdGggb25lIGNsaWVudCB0byBidWlsZCBhIGNvbXByZWhlbnNpdmUgcmVwb3J0LCBhbmQgd2hhdCB3ZSBoYWQgdG8gZG8gdG8gZ2V0IHRoZXJlLjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjR9IC0tPlxuPGg0PkJ1aWxkaW5nIGEgQ29tcHJlaGVuc2l2ZSBSZXBvcnQgd2l0aCBBZHZhbmNlZCBRdWVyeWluZzxcL2g0PlxuPCEtLSBcL3dwOmhlYWRpbmcgLS0+PCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5PbmUgb2YgdGhlIHJlYWxseSBuaWNlIG5ld2VyIGZlYXR1cmVzIG9mIHRoZSBKU09OIGZhY2V0IEFQSSBpcyB0aGUgYWJpbGl0eSB0byBcdTIwMWNjaGFuZ2UgZG9tYWluc1x1MjAxZCBpbiBhIGZhY2V0IHJlcXVlc3QuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PCEtLSB3cDpwdWxscXVvdGUgLS0+XG48ZmlndXJlIGNsYXNzPVwid3AtYmxvY2stcHVsbHF1b3RlXCI+XG48YmxvY2txdW90ZT5cbjxwPlRoZSBkb21haW4gb2YgYSBmYWNldCBpcyB0aGUgc2V0IG9mIHZhbHVlcyAobm9ybWFsbHkgZGVcdWZiMDFuZWQgYnkgYSBzZXQgb2YgZG9jdW1lbnRzKSB0aGF0IGNhbGN1bGF0aW9ucyB3aWxsIGJlIGRvbmUgb3Zlci4gVGhlIHJvb3QgZG9tYWluIGlzIHRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgbWF0Y2ggdGhlIGJhc2UgcXVlcnkgYW5kIGFueSBcdWZiMDFsdGVycy48XC9wPlxuPFwvYmxvY2txdW90ZT5cbjxcL2ZpZ3VyZT5cbjwhLS0gXC93cDpwdWxscXVvdGUgLS0+PCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5Eb21haW4gY2hhbmdlIGFsbG93cyB5b3UgdG8gZXhjbHVkZSBwYXJ0cyBvZiB5b3VyIGJhc2UgcXVlcnkgYW5kXC9vciBhZGQgYSBcdWZiMDFsdGVyIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgcmVzdWx0IHNldCB0aGF0IHRoZSBmYWNldCBpcyB3b3JraW5nIGFnYWluc3QuIFVzaW5nIG91ciBleGFtcGxlIGFib3ZlLCBpZiB0aGUgYmFzZSBxdWVyeSBpbmNsdWRlcyBhIFx1ZmIwMWx0ZXJcdTAwYTA8bWFyaz5sb2NhdGlvbjpCb3N0b248XC9tYXJrPiwgeW91IG1heSBzdGlsbCB3YW50IHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiBhYm91dFx1MDBhMDxlbT5hbGwgbG9jYXRpb25zPFwvZW0+LiBXaXRob3V0IGEgZG9tYWluIGNoYW5nZSwgdGhlIGZhY2V0IHJlc3VsdCB3aWxsIG9ubHkgY29udGFpbiBCb3N0b24gYmVjYXVzZSB0aGF0XHUyMDE5cyB3aGF0IHlvdXIgcmVzdWx0IHNldCBpcyBcdWZiMDFsdGVyZWQgdG8uIEEgZG9tYWluIGNoYW5nZSBhbGxvd3MgeW91ciBmYWNldCByZXF1ZXN0IHRvIGlnbm9yZSB0aGF0IHBhcnQgb2YgdGhlIFx1ZmIwMWx0ZXJcL3F1ZXJ5LiBUaGlzIGlzIGEgcG93ZXJmdWwgdGhpbmcsIGJlY2F1c2UgaW4gYSBzaW5nbGUgcXVlcnkgcmVxdWVzdCwgeW91IGNhbiBvYnRhaW4geW91ciBub3JtYWwgcXVlcnkgcmVzdWx0cyBhcyB3ZWxsIGFzIGFueSBvdGhlciAocGVyaGFwcyB0b3RhbGx5IHVucmVsYXRlZCkgZGF0YSwgaW4gYXMgbWFueSBmYWNldCByZXF1ZXN0cyBhcyBpcyBuZWNlc3NhcnkuIFRoaXMgaXMgZXNzZW50aWFsbHkgbGlrZSBkb2luZyBtdWx0aXBsZSBzZWFyY2hlcyB3aXRoIGEgc2luZ2xlIHJlcXVlc3QuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5PdXIgY2xpZW50IG5lZWRlZCBhIHRvb2wgdG8gYWxsb3cgdGhlaXIgdXNlcnMgdG8gb2J0YWluIGV4dHJlbWVseSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY2FsY3VsYXRpb25zIG9uIHRoZWlyIGRhdGEuIFRoZSBzZWFyY2ggZW50YWlsZWQgc2V2ZXJhbCBzdGVwcy4gRmlyc3QsIGl0IHJlcXVpcmVkIGEgYmFzaWMgc2VhcmNoIHRvIG9idGFpbiB0aGUgY29ycmVjdCBzZXQgb2YgZG9jdW1lbnRzLiBUaGVuIHdlIGhhZCB0byBqb2luIChncmFwaCByZWFsbHkpIGluIG90aGVyIGRvY3VtZW50cyB0aGF0IGNvbnRhaW5lZCB1c2VmdWwgaW5mb3JtYXRpb24uIEZpbmFsbHksIG1hbnkgY2FsY3VsYXRpb25zIGFuZCBhZ2dyZWdhdGlvbnMgd2VyZSBydW4gb24gdGhlIGRhdGEgdXNpbmcgZmFjZXRzLiBUaGUgSlNPTiBmYWNldCBBUEkgYWxsb3dlZCB1cyB0byBkbyB0aGlzIG5pY2VseSB3aXRoIGEgc2luZ2xlIHF1ZXJ5ICh3aXRoIG9uZSBleGNlcHRpb24sIHdoaWNoIElcdTIwMTlsbCBnZXQgaW50byBsYXRlcikuIFdlIHVzZWQgdGhlIGV4aXN0aW5nIHNlYXJjaCBhbmQgZmFjZXQgQVBJIHRvIGFjY29tcGxpc2ggdGhlIHRhc2suIEhvd2V2ZXIsIGF0IHNvbWUgcG9pbnQsIGl0IGJlY2FtZSB1c2VmdWwgZm9yIG91ciBjbGllbnQgdG8gaGF2ZSBhIGZ1bGwgcmVwb3J0IG9mIHRoZSBcdWZiMDFuZGluZ3MgcmF0aGVyIHRoYW4gYSBzZWFyY2ggaW50ZXJmYWNlLiBFc3NlbnRpYWxseSwgd2hhdCB0aGV5IG5lZWRlZCB3YXMgdGhlIHJlc3VsdGluZyBvdXRwdXRzIGZyb20gYWxsIHBvc3NpYmxlIHF1ZXJpZXMgb2Ygd2hpY2ggdGhlcmUgd2VyZSB0aG91c2FuZHMuIElzc3VpbmcgdGhvdXNhbmRzIG9mIHF1ZXJpZXMgdG8gU29sciBhbmQgdGhlbiBtYW51YWxseSBhZ2dyZWdhdGluZyB0aGUgcmVzdWx0cyB3YXMgbm90IGZlYXNpYmxlLiBUaGUgYXN0dXRlIGFtb25nIHlvdSBtYXkgc2VlIHdoZXJlIElcdTIwMTltIGdvaW5nIHdpdGggdGhpcy4gU2luY2Ugb3VyIHJlc3VsdCBkYXRhIHdhcyBhbHJlYWR5IGZhY2V0IGJhc2VkIGNhbGN1bGF0aW9ucyBhbmQgYWdncmVnYXRpb25zLCBvYnRhaW5pbmcgYWxsIHBvc3NpYmxlIHNlYXJjaCByZXN1bHRzIGlzIGp1c3QgYSBwYXJlbnQgZmFjZXQgdG8gdGhlIGV4aXN0aW5nIHF1ZXJ5LiBIZXJlXHUyMDE5cyBhIHNpbXBsaVx1ZmIwMWVkIGV4YW1wbGU6IFJldmlzaXRpbmcgb3VyIHByb2R1Y3QgZXhhbXBsZSwgbGV0XHUyMDE5cyBzYXkgdGhhdCB0aGUgc2VhcmNoIHdlIGJ1aWx0IGFsbG93cyB1c2VycyB0byBzZWFyY2ggZm9yIGEgcHJvZHVjdCBhbmQgZ2V0IGEgYnJlYWtkb3duIG9mIGF2ZXJhZ2Ugc2FsZSBwcmljZSBwZXIgbG9jYXRpb24uIFRoZSBmYWNldCByZXF1ZXN0IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8XC9wPlxuPCEtLSBcL3dwOnBhcmFncmFwaCAtLT48IS0tIHdwOnByZWZvcm1hdHRlZCAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1wcmVmb3JtYXR0ZWRcIj48bWFyayBjbGFzcz1cImhhcy1pbmxpbmUtY29sb3IgaGFzLXZpdmlkLWN5YW4tYmx1ZS1jb2xvclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcIj4mYW1wO3E9XCJwcm9kdWN0X25hbWU6XFxcImRlbGwgeHBzIDE1XFxcIlwiXG4gJmFtcDtqc29uLmZhY2V0PXtcbiAgICBhdmdfYnlfbG9jYXRpb25fYW5kX2NvbG9yOntcbiAgICAgICB0eXBlOlwidGVybXNcIixcbiAgICAgICBmaWVsZDpcImxvY2F0aW9uXCIsXG4gICAgICAgbWluY291bnQ6MSxcbiAgICAgICBmYWNldDp7XG4gICAgICAgICAgY29sb3I6e1xuICAgICAgICAgICAgIHR5cGU6XCJ0ZXJtc1wiLFxuICAgICAgICAgICAgIGZpZWxkOlwiY29sb3JcIixcbiAgICAgICAgICAgICBmYWNldDp7XG4gICAgICAgICAgICAgICAgYXZnX3ByaWNlOlwiYXZnKHByaWNlKVwiXG4gICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICB9XG4gICAgfVxuIH08XC9tYXJrPjxcL3ByZT5cbjwhLS0gXC93cDpwcmVmb3JtYXR0ZWQgLS0+PCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5JbiB0aGlzIGV4YW1wbGUsIHlvdVx1MjAxOWxsIHNlZSB0aGUgYXZlcmFnZSBwcmljZSBvZiB0aGUgXHUyMDFjZGVsbCB4cHMgMTVcdTIwMWQgYnJva2VuIGRvd24gYnkgbG9jYXRpb24gYW5kIHRoZW4gY29sb3IuIE5vdywgaXQgbWlnaHQgYmUgYSBsaXR0bGUgZWFzaWVyIHRvIHNlZSB0aGF0IGlmIHdlIHdhbnQgdG8gZ2V0IHRob3NlIG51bWJlcnMgZm9yIGV2ZXJ5IHByb2R1Y3QsIHdlIGNhbiBvbWl0IHRoZSBvcmlnaW5hbCBxdWVyeSwgYW5kIHdyYXAgdGhlIGVudGlyZSBmYWNldCBpbiBhIHBhcmVudCBmYWNldCB0aGF0IGxvb2tzIGF0IHRoZSBwcm9kdWN0X25hbWUgXHVmYjAxZWxkIChhc3N1bWluZyBwcm9kdWN0X25hbWUgaXMgbm90IHRva2VuaXplZCkuIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IHdlIHdlcmUgZG9pbmcgZm9yIG91ciBjbGllbnQgdG8gcHJvZHVjZSBhIHZlcnkgbGFyZ2UgcmVwb3J0IGZvciB0aGVtLiBUaGUgb25lIGhhbmd1cCB3ZSBoYWQgd2FzIHRoYXQgdGhlaXIgb3JpZ2luYWwgXHUyMDFjcHJvZHVjdFx1MjAxZCBxdWVyeSB3YXNuXHUyMDE5dCB0aGlzIHNpbXBsZS4gSW4gZmFjdCwgaXQgd2FzIGFcdTAwYTA8YSBocmVmPVwiaHR0cHM6XC9cL2x1Y2VuZS5hcGFjaGUub3JnXC9zb2xyXC9ndWlkZVwvN183XC9qc29uLWZhY2V0LWFwaS5odG1sI2dyYXBoLXRyYXZlcnNhbC1kb21haW4tY2hhbmdlc1wiPmdyYXBoIHF1ZXJ5PFwvYT5cdTAwYTB3aG9zZSBqb2IgaXQgd2FzIHRvIGpvaW4gaW4gb3RoZXIgZG9jdW1lbnRzIGNvbnRhaW5pbmcgZGF0YSB3ZSBuZWVkZWQgZm9yIGNhbGN1bGF0aW9ucy4gQXQgdGhlIHRpbWUsIHRoZSBkb21haW4gZnVuY3Rpb25hbGl0eSBvZiB0aGUgSlNPTiBmYWNldCBBUEkgc3VwcG9ydGVkIGpvaW4sIGJ1dCBub3QgZ3JhcGguIEFzIGEgcmVzdWx0LCB3ZSBlbmRlZCB1cCBhZGRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gU29sciBpblx1MDBhMDxhIGhyZWY9XCJodHRwczpcL1wvaXNzdWVzLmFwYWNoZS5vcmdcL2ppcmFcL2Jyb3dzZVwvU09MUi0xMjMyOFwiPnZlcnNpb24gNy40PFwvYT4uIFRoaXMgYWxsb3dlZCB1cyB0byByZWNyZWF0ZSBvdXIgYmFzZSBxdWVyeSBhcyBhIGZhY2V0IHJlcXVlc3QgYW5kIG9idGFpbiBhbGwgcG9zc2libGUgdmFsdWVzIGF0IG9uY2UuIFRoaXMgdXNlIGNhc2UgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IG5vcm1hbGx5IHdhbnQgdG8gZG8sIGJlY2F1c2UgaXRcdTIwMTlzIGVmZmVjdGl2ZWx5IHRob3VzYW5kcyBvZiBxdWVyaWVzIChpbiBvdXIgY2FzZSkgYXQgb25jZSBhbmQgY29uc2VxdWVudGx5IHZlcnkgc2xvdy4gQnV0IHRoaXMgaXMgd2hhdCBvdXIgY2xpZW50IG5lZWRlZCBmb3IgdGhpcyBzcGVjaWFsaXplZCBjYXNlLCBhbmQgaXQgaWxsdXN0cmF0ZXMgdGhlIHBvd2VyIG9mIHRoZSBKU09OIGZhY2V0IEFQSSBuaWNlbHkuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PCEtLSB3cDpoZWFkaW5nIHtcImxldmVsXCI6NH0gLS0+XG48aDQ+RXh0ZW5kaW5nIHRoZSBKU09OIEZhY2V0IEFQSTxcL2g0PlxuPCEtLSBcL3dwOmhlYWRpbmcgLS0+PCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5FYXJsaWVyLCBJIGFsbHVkZWQgdG8gdGhlIGZhY3QgdGhhdCB3ZSBjb3VsZCBiYXNpY2FsbHkgZ2V0IGF3YXkgd2l0aCBkb2luZyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIFNvbHIgcXVlcnkuIFRoaXMgaXMgcmVhbGx5IG5pY2UgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuIEZvciBvbmUsIGhhdmluZyBhbGwgb2YgeW91ciBkYXRhIGNvbnNvbGlkYXRlZCBhbmQgcmV0dXJuZWQgaW4gYSBzaW5nbGUgcmVzcG9uc2UgZWxpbWluYXRlcyBzb21lIHRpbWluZyBob3VzZWtlZXBpbmcgeW91XHUyMDE5ZCBvdGhlcndpc2UgaGF2ZSB0byBkbyBpbiB5b3VyIFVJLiBXZVx1MDBhMDxlbT5hbG1vc3Q8XC9lbT4gZ2V0IGF3YXkgd2l0aCBkb2luZyBldmVyeXRoaW5nIGFzIGEgc2luZ2xlIHF1ZXJ5LCBidXQgbm90IHF1aXRlLiBBbmQgdGhpcyBnaXZlcyBtZSBhIGJpdCBvZiBhbiBvcHBvcnR1bml0eSB0byB0YWxrIGFib3V0IGhvdyBJXHUyMDE5ZCBsaWtlIHRvIGV4dGVuZCB0aGUgZmFjZXQgQVBJIG5leHQuIFRoZXJlIGlzIG9uZSBwaWVjZSBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgaXNuXHUyMDE5dCBwcmVzZW50IHlldCBpbiB0aGUgQVBJLjxcL3A+XG48cD5EdXJpbmcgb3VyIG92ZXJseSBjb21wbGljYXRlZCBmYWNldGluZyBoaWVyYXJjaHksIGF0IHNvbWUgcG9pbnQgd2VcdTIwMTlyZSBvYnRhaW5pbmcgZGF0YSBmcm9tIG9uZSBvZiB0aGUgZmFjZXQgcmVzdWx0cyBhbmQgd2VcdTIwMTlkIHRoZW4gbGlrZSB0byB1c2UgdGhhdCBkYXRhIGluIHNvbWUgZnVydGhlciBzdWItZmFjZXRpbmcuIEFzIGEgcXVpY2sgYW5kIHNpbXBsZSBleGFtcGxlLCBpbWFnaW5lIHlvdSB3YW50IHRvIHVzZSBvdXIgYWJvdmUgZmFjZXQgcmVxdWVzdCB0byBnZXQgdGhlIGF2ZXJhZ2UgcHJpY2UsIGJ1dCB0aGVuIHlvdSB3YW50IHRvIHN1Yi1mYWNldCB0byBzaG93IGhvdyBtYW55IHByb2R1Y3RzIGFyZSBiZWxvdyBhdmVyYWdlIGFuZCBob3cgbWFueSBhcmUgYWJvdmUuIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHlvdSBjb3VsZFx1MDBhMDxlbT51c2U8XC9lbT5cdTAwYTB5b3VyIGNhbGN1bGF0ZWQgdmFsdWVzIGluIGRlc2NlbmRhbnQgZmFjZXQgcmVxdWVzdHMuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PCEtLSB3cDpwcmVmb3JtYXR0ZWQgLS0+XG48cHJlIGNsYXNzPVwid3AtYmxvY2stcHJlZm9ybWF0dGVkXCI+PG1hcmsgY2xhc3M9XCJoYXMtaW5saW5lLWNvbG9yIGhhcy12aXZpZC1jeWFuLWJsdWUtY29sb3JcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7XCI+JmFtcDtxPVwicHJvZHVjdF9uYW1lOlxcXCJkZWxsIHhwcyAxNVxcXCJcIiBcbiAgJmFtcDtqc29uLmZhY2V0PXsgXG4gICAgICBhdmdfYnlfbG9jYXRpb25fYW5kX2NvbG9yIGF2Z19ieV9sb2NhdGlvbl9hbmRfY29sb3J7IFxuICAgICAgICAgIHR5cGU6XCJ0ZXJtc1wiLCBcbiAgICAgICAgICBmaWVsZDpcImxvY2F0aW9uXCIsIFxuICAgICAgICAgIG1pbmNvdW50OjEsIFxuICAgICAgICAgIGZhY2V0OntcbiAgICAgICAgICAgICAgY29sb3I6eyBcbiAgICAgICAgICAgICAgICAgIHR5cGU6XCJ0ZXJtc1wiLCBcbiAgICAgICAgICAgICAgICAgIGZpZWxkOlwiY29sb3JcIiwgXG4gICAgICAgICAgICAgICAgICBmYWNldHsgXG4gICAgICAgICAgICAgICAgICAgICAgYXZnX3ByaWNlOlwiYXZnKHByaWNlKVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICBmYWNldDp7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvd19hdmd7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpcInF1ZXJ5XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTpcInByaWNlOlsqIFRPICR7YXZnX3ByaWNlfV1cIiBcbiAgICAgICAgICAgICAgICAgfSwgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlX2F2Zzp7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpcInF1ZXJ5XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTpcInByaWNlOnske2F2Z19wcmljZX0gVE8gKl1cIiBcbiAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIH0gXG4gICAgICAgICB9IFxuICAgICB9PFwvbWFyaz48XC9wcmU+XG48IS0tIFwvd3A6cHJlZm9ybWF0dGVkIC0tPjwhLS0gd3A6cHJlZm9ybWF0dGVkIC0tPlxuPHByZSBjbGFzcz1cIndwLWJsb2NrLXByZWZvcm1hdHRlZFwiPjxtYXJrIGNsYXNzPVwiaGFzLWlubGluZS1jb2xvciBoYXMtdml2aWQtY3lhbi1ibHVlLWNvbG9yXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO1wiPlBzZXVkbyBjb2RlIHNob3dpbmcgaG93IHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSBjYWxjdWxhdGlvbnMgaW4gc3ViLWZhY2V0czxcL21hcms+PFwvcHJlPlxuPCEtLSBcL3dwOnByZWZvcm1hdHRlZCAtLT48IS0tIHdwOnBhcmFncmFwaCAtLT5cbjxwPjxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMDtcIj5VbmZvcnR1bmF0ZWx5LCB0aGlzIGN1cnJlbnRseSBpc25cdTIwMTl0IHBvc3NpYmxlLiBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gaXNzdWUgYSBcdWZiMDFyc3QgcmVxdWVzdCB0byBvYnRhaW4gdGhlIHZhbHVlcyBhbmQgdGhlbiBhIHNlY29uZCByZXF1ZXN0IHdpdGggdGhvc2UgdmFsdWVzIGVuY29kZWQgaW4uIElmIHRoaXMgaXMgc29tZXRoaW5nIHlvdVx1MjAxOWQgbGlrZSB0byBzZWUgaW1wbGVtZW50ZWQgYXQgeW91ciBvcmdhbml6YXRpb24sIHBsZWFzZSByZWFjaCBvdXQhPFwvc3Bhbj48XC9wPlxuPHA+PGJyIFwvPjxiciBcLz48XC9wPlxuPCEtLSBcL3dwOnBhcmFncmFwaCAtLT4ifSwiZWxlbWVudHMiOltdLCJ3aWRnZXRUeXBlIjoidGV4dC1lZGl0b3IifQ==\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-a1ce6cc elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"a1ce6cc\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-110312a\\\" data-id=\\\"110312a\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6Ijc0Y2NiNGUiLCJlbFR5cGUiOiJ3aWRnZXQiLCJzZXR0aW5ncyI6eyJwcmV2X2xhYmVsIjoiUHJldmlvdXMgUG9zdCIsIm5leHRfbGFiZWwiOiJOZXh0IFBvc3QiLCJzaG93X2JvcmRlcnMiOiIiLCJ0aXRsZV90eXBvZ3JhcGh5X3R5cG9ncmFwaHkiOiJjdXN0b20iLCJ0aXRsZV90eXBvZ3JhcGh5X2ZvbnRfc2l6ZSI6eyJ1bml0IjoicHgiLCJzaXplIjoxNCwic2l6ZXMiOltdfSwidGl0bGVfdHlwb2dyYXBoeV9mb250X3dlaWdodCI6IjcwMCIsIl9fZ2xvYmFsc19fIjp7ImFycm93X2NvbG9yIjoiZ2xvYmFsc1wvY29sb3JzP2lkPXByaW1hcnkiLCJsYWJlbF9jb2xvciI6Imdsb2JhbHNcL2NvbG9ycz9pZD1zZWNvbmRhcnkifSwiYXJyb3ciOiJmYSBmYS1jYXJldC1sZWZ0Iiwic2hvd19hcnJvdyI6IiJ9LCJlbGVtZW50cyI6W10sIndpZGdldFR5cGUiOiJnbG9iYWwiLCJ0ZW1wbGF0ZUlEIjoiMjgwODMifQ==\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\",\"scripts\":[],\"styles\":[]}}"]},"jetpack_featured_media_url":"https:\/\/kmwllc.com\/wp-content\/uploads\/2020\/04\/blog_JSONfacets1200x900-min.png","menu_order":0,"_links":{"self":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/comments?post=26188"}],"version-history":[{"count":10,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26188\/revisions"}],"predecessor-version":[{"id":29715,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26188\/revisions\/29715"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media\/29712"}],"wp:attachment":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media?parent=26188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/categories?post=26188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/tags?post=26188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}