1<!DOCTYPE html> 2<html lang="en"> 3 <!-- Head --> 4 <head> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 7 <!-- Metadata, OpenGraph and Schema.org --> 8 9 10 11 12<!-- Standard metadata --> 13<meta charset="utf-8"> 14<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 15<meta http-equiv="X-UA-Compatible" content="IE=edge"> 16<title> 17 18 19 20 Pruning in Snowflake: Working Smarter, Not Harder | Andi Zimmerer 21 22 23</title> 24<meta name="author" content="Andi Zimmerer"> 25<meta name="description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruningâskipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%."> 26 27 <meta name="keywords" content="Snowflake, Databases, Data Skipping, Pruning"> 28 29 30 31 32 33 34 <!-- OpenGraph --> 35 <meta property="og:site_name" content="Andi Zimmerer"> 36 <meta property="og:type" content="website"> 37 <meta property="og:title" content="Andi Zimmerer | Pruning in Snowflake: Working Smarter, Not Harder"> 38 <meta property="og:url" content="http://localhost:4000/papers/snowflake-pruning.html"> 39 <meta property="og:description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruningâskipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%."> 40 41 <meta property="og:image" content="/assets/img/posts/snowflake_pruning_flow.png"> 42 43 <meta property="og:locale" content="en"> 44 45 <!-- Twitter card --> 46 <meta name="twitter:card" content="summary"> 47 <meta name="twitter:title" content="Pruning in Snowflake: Working Smarter, Not Harder"> 48 <meta name="twitter:description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruningâskipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%."> 49 50 <meta name="twitter:image" content="/assets/img/posts/snowflake_pruning_flow.png"> 51 52 53 54 55 56 <!-- Schema.org --> 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
95<script type="application/ld+json"> 96 { 97 "author": 98 { 99 "@type": "Person", 100 "name": "Andi Zimmerer" 101 }, 102 "url": "http://localhost:4000/papers/snowflake-pruning.html", 103 "@type": "WebSite", 104 "description": "Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning—skipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.", 105 "headline": "Pruning in Snowflake: Working Smarter, Not Harder", 106 107 "name": "Andi Zimmerer", 108 "@context": "https://schema.org" 109 } 110 </script>
110 111 112 113 114<!-- Vercel insights --> 115 116
116<script defer src="/_vercel/speed-insights/script.js"></script>
116 117
117<script defer src="/_vercel/insights/script.js"></script>
117 118 119 120<!-- Bootstrap & MDB --> 121<link rel="stylesheet" href="/assets/css/bootstrap.min.css?a4b3f509e79c54a512b890d73235ef04"> 122<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/mdb.min.css" integrity="sha256-jpjYvU3G3N6nrrBwXJoVEYI/0zw8htfFnhT9ljN3JJw=" crossorigin="anonymous"> 123 124 125 126<!-- Fonts & Icons --> 127<link defer rel="stylesheet" href="/assets/css/academicons.min.css?f0b7046b84e425c55f3463ac249818f5"> 128<link defer rel="stylesheet" href="/assets/css/scholar-icons.css?62b2ac103a88034e6882a5be5f3e2772"> 129<link defer rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:100,300,400,500,700|Material+Icons&display=swap"> 130 131<!-- Code Syntax Highlighting --> 132<link defer rel="stylesheet" href="/assets/css/jekyll-pygments-themes-github.css?591dab5a4e56573bf4ef7fd332894c99" media="" id="highlight_theme_light"> 133 134 135 136<!-- Styles --> 137 138 139 140 141 <link rel="shortcut icon" href="data:image/svg+xml,<svg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%20100%20100%22><text%20y=%22.9em%22%20font-size=%2290%22>%E2%9A%9B%EF%B8%8F</text></svg>"> 142 143<link rel="stylesheet" href="/assets/css/main.css?d41d8cd98f00b204e9800998ecf8427e"> 144<link rel="canonical" href="http://localhost:4000/papers/snowflake-pruning.html"> 145 146<!-- Dark Mode -->
147<script src="/assets/js/theme.js?a81d82887dd692e91686b43de4542f18"></script>
147 148 149 <link defer rel="stylesheet" href="/assets/css/jekyll-pygments-themes-native.css?5847e5ed4a4568527aa6cfab446049ca" media="none" id="highlight_theme_dark"> 150
150<script> 151 initTheme(); 152 </script>
152 153 154 155 156 157 158 159 160 161 162 163 </head> 164 165 <!-- Body --> 166 <body class="fixed-top-nav sticky-bottom-footer"> 167 <!-- Header --> 168 <header> 169 <!-- Nav Bar --> 170 <nav id="navbar" class="navbar navbar-light navbar-expand-sm fixed-top" role="navigation"> 171 <div class="container"> 172 173 <a class="navbar-brand title font-weight-lighter" href="https://andi-zimmerer.com?utm_source=sfpruningcompanion"> 174 175 176 <span class="font-weight-bold">Andi</span> 177 178 179 Zimmerer 180 181 </a> 182 183 <!-- Navbar Toggle --> 184 <button class="navbar-toggler collapsed ml-auto" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> 185 <span class="sr-only">Toggle navigation</span> 186 <span class="icon-bar top-bar"></span> 187 <span class="icon-bar middle-bar"></span> 188 <span class="icon-bar bottom-bar"></span> 189 </button> 190 191 <div class="collapse navbar-collapse text-right" id="navbarNav"> 192 <ul class="navbar-nav ml-auto flex-nowrap"> 193 194 195 <!-- About --> 196 <li class="nav-item "> 197 <a class="nav-link" href="https://andi-zimmerer.com?utm_source=sfpruningcompanion">About 198 199 </a> 200 </li> 201 202 <!-- Other pages --> 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 <li class="nav-item "> 303 <a class="nav-link" href="https://andi-zimmerer.com/blog?utm_source=sfpruningcompanion">Blog 304 305 </a> 306 </li> 307 308 309 310 311 312 313 <li class="nav-item active"> 314 <a class="nav-link" href="https://andi-zimmerer.com/papers?utm_source=sfpruningcompanion">Papers 315 316 <span class="sr-only">(current)</span> 317 318 </a> 319 </li> 320 321 322 323 324 <!-- Search --> 325 <li class="nav-item"> 326 <button id="search-toggle" title="Search" onclick="openSearchModal()"> 327 <span class="nav-link">ctrl k <i class="ti ti-search"></i></span> 328 </button> 329 </li> 330 331 332 <!-- Toogle theme mode --> 333 <li class="toggle-container"> 334 <button id="light-toggle" title="Change theme"> 335 <i class="ti ti-sun-moon" id="light-toggle-system"></i> 336 <i class="ti ti-moon-filled" id="light-toggle-dark"></i> 337 <i class="ti ti-sun-filled" id="light-toggle-light"></i> 338 </button> 339 </li> 340 341 </ul> 342 </div> 343 </div> 344 </nav> 345 346 <!-- Scrolling Progress Bar --> 347 <progress id="progress" value="0"> 348 <div class="progress-container">
349 <span class="progress-bar"></span> 350 </div> 351 </progress> 352 353</header> 354 355 356 <!-- Content --> 357 <div class="container mt-5" role="main"> 358 359 360 361<div class="post"> 362 <header class="post-header"> 363 364 <span class="d-block text-muted text-center fst-italic mt-4 mb-2">Published in: Proceedings of the 2025 ACM SIGMOD International Conference on Management of Data</span> 365 366 <h1 class="post-title" itemprop="headline">Pruning in Snowflake: Working Smarter, Not Harder</h1> 367 </header> 368 369 370 <style> 371 .paper-author-list { 372 display: flex; 373 flex-wrap: wrap; 374 justify-content: space-evenly; 375 align-items: baseline; 376 gap: 1em 10px; 377 margin-top: 1em; 378 margin-bottom: 1.5em; 379 max-width: 7in; /* 6.75in would be textwidth of ACM Latex template */ 380 } 381 382 .paper-author { 383 flex: 1 1 215px; /* 220px is based on width of widest element, but 170px works better with smaller layouts */ 384 text-align: center; 385 line-height: 1.2em; 386 } 387 </style> 388 389 <div class="d-flex justify-content-center"> 390 <div class="paper-author-list"> 391 392 <div class="paper-author"> 393 <a href="https://www.linkedin.com/in/andi-zimmerer/" target="_blank" rel="noopener noreferrer"> 394 <span class="d-block strong">Andreas Zimmerer</span> 395 <span class="d-block small">University of Technology Nuremberg</span> 396 <span class="d-block small">Nuremberg, Germany</span> 397 </a> 398 </div> 399 400 <div class="paper-author"> 401 <a href="https://www.linkedin.com/in/damien-dam/" target="_blank" rel="noopener noreferrer"> 402 <span class="d-block strong">Damien Dam</span> 403 <span class="d-block small">Snowflake Inc.</span> 404 <span class="d-block small">Berlin, Germany</span> 405 </a> 406 </div> 407 408 <div class="paper-author"> 409 <a href="https://scholar.google.de/citations?hl=en&user=nIYiva8AAAAJ" target="_blank" rel="noopener noreferrer"> 410 <span class="d-block strong">Jan Kossmann</span> 411 <span class="d-block small">Snowflake Inc.</span> 412 <span class="d-block small">Berlin, Germany</span> 413 </a> 414 </div> 415 416 <div class="paper-author"> 417 <a href="https://www.linkedin.com/in/juliane-waack-327171202/" target="_blank" rel="noopener noreferrer"> 418 <span class="d-block strong">Juliane Waack</span> 419 <span class="d-block small">Snowflake Inc.</span> 420 <span class="d-block small">Berlin, Germany</span> 421 </a> 422 </div> 423 424 <div class="paper-author"> 425 <a href="https://scholar.google.de/citations?hl=en&user=QmwXUf4AAAAJ" target="_blank" rel="noopener noreferrer"> 426 <span class="d-block strong">Ismail Oukid</span> 427 <span class="d-block small">Snowflake Inc.</span> 428 <span class="d-block small">Berlin, Germany</span> 429 </a> 430 </div> 431 432 <div class="paper-author"> 433 <a href="https://scholar.google.de/citations?hl=en&user=y3IdRusAAAAJ" target="_blank" rel="noopener noreferrer"> 434 <span class="d-block strong">Andreas Kipf</span> 435 <span class="d-block small">University of Technology Nuremberg</span> 436 <span class="d-block small">Nuremberg, Germany</span> 437 </a> 438 </div> 439 440 </div> 441 </div> 442 443 444 <div class="d-flex justify-content-center flex-wrap gap-2 pt-1 pb-5"> 445 446 <a href="https://arxiv.org/pdf/2504.11540" class="btn btn-blue btn-sm rounded-pill px-3" rel="external nofollow noopener" target="_blank"><i class="fa-solid fa-download mr-2"></i>PDF</a> 447 448 <a href="https://arxiv.org/abs/2504.11540" class="btn btn-blue btn-sm rounded-pill px-3" rel="external nofollow noopener" target="_blank"><i class="ai ai-arxiv mr-2"></i>arXiv</a> 449 450 <a href="/assets/pdf/SIGMOD25-presentation-pruning-in-snowflake.pdf" class="btn btn-blue btn-sm rounded-pill px-3"><i class="fa-solid fa-display mr-2"></i>Slides (SIGMOD)</a> 451 452 <a href="#cite" class="btn btn-blue btn-sm rounded-pill px-3"><i class="fa-solid fa-quote-left mr-2"></i>Cite</a> 453 </div> 454 455 <article> 456 <div class="d-flex justify-content-center"> 457 <div class="w-75 mb-5" style="text-align: justify;"> 458 <h2>Abstract</h2> 459 <p>Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruningâskipping chunks of data that do not contain relevant information for computing query results.</p> <p>While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to <code>LIMIT</code>, top-k, and <code>JOIN</code> operations, dramatically expanding the opportunities for pruning across diverse query types.</p> <p>Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.</p> 460 </div> 461 </div> 462 463 <h2>Highlights</h2> 464 465<p>We presented four data pruning techniques that are used in the Snowflake data platform and evaluated them based on their pruning effectiveness on real-world customer workloads. 466The pruning flow is as follows:</p> 467<ol> 468 <li> 469<b>Filter Pruning:</b> All queries containing a <code>WHERE</code> predicate are subject to <em>filter pruning</em>, which removes data partitions by identifying the ones that do not contain any rows that would match the filter condition in the <code>WHERE</code> clause.</li> 470 <li> 471<b>LIMIT Pruning:</b> If the query is a simple <code>LIMIT</code> query without an <code>ORDER BY</code>, the query engine tries to reduce the number of partitions to the minimally necessary set of partitions such that the query result can be computed. This works for queries with and without <code>WHERE</code> clause.</li> 472 <li> 473<b>Join Pruning:</b> While executing a join, the probe side of a join is subject to <em>join pruning</em>, i.e., removing partitions from the probe side that do not contain join partners based on the collected values from the build side.</li> 474 <li> 475<b>Top-K Pruning:</b>
475 Lastly, if a query is a top-k query, i.e., it contains an <code>ORDER BY ... LIMIT</code>, a specialized <em>top-k pruning</em> technique attempts to reduce the number of processed partitions by pushing runtime information about the current top-k heap down to the table scan.</li> 476</ol> 477<p>While the first two techniques can be applied during query optimization, the latter two techniques require runtime information about the current state of the query execution.</p> 478 479<p>The pruning flow can be visualized as follows:</p> 480<div class="text-center"> 481 482 483 484 485<figure> 486 <picture> 487 <!-- Auto scaling with imagemagick --> 488 <!-- 489 See https://www.debugbear.com/blog/responsive-images#w-descriptors-and-the-sizes-attribute and 490 https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images for info on defining 'sizes' for responsive images 491 --> 492 493 494 <source class="responsive-img-srcset" srcset="/assets/img/posts/snowflake_pruning_flow-480.webp 480w,/assets/img/posts/snowflake_pruning_flow-800.webp 800w,/assets/img/posts/snowflake_pruning_flow-1400.webp 1400w," type="image/webp" sizes="95vw"> 495 496 497 <img src="/assets/img/posts/snowflake_pruning_flow.png" class="img-fluid w-75" width="100%" height="auto" alt="Pruning flow in Snowflake across all query types. 58.7% of all queries have partitions pruned by filter pruning. 0.2% of all queries are first subject to filter pruning, then LIMIT-pruning. There is another 0.0002% of queries that have no partitions pruned by filters, but only have partitions pruned by LIMIT-pruning. Overall, 0.2% of all queries are subject to LIMIT-pruning. Let's go to join pruning now. Overall, 10.7% of queries have partitions pruned by join-pruning. 4.0% of all queries have partitions pruned by join pruning but have neither filter pruning nor LIMIT-pruning applied. 0.0001% of queries saw successful LIMIT-pruning before having partitions pruned by join-pruning. And 6.7% of queries had partitions pruned by filter pruning before getting at least one partition pruned by join-pruning. Lastly, 0.1% of all queries across all query types have at least one partition pruned by top-k pruning. 0.03% of queries only saw successful topk-pruning without having any other partitions pruned by other techniques. 0.007% had at least one partition pruned by join-pruning before successful top-k pruning. And 0.08% of all queries first had partitions pruned by filter pruning before top-k pruning." loading="eager" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"> 498 </source></picture> 499 500 501 <figcaption class="caption">Pruning Flow in the Snowflake Data Platform across all Query Types</figcaption> 502 503</figure> 504 505</div> 506<p>Note that the figure contains distributions across all query types, including DML queries. The distribution of <code>SELECT</code>-only queries might be different as certain operators might be seen more oftenâe.g., DML queries tend to not contain <code>LIMIT</code> clauses and might have fewer joins.</p> 507 508 509<p>As in interesting side-remark, we also objectified that it makes sense to optimize for small <code>LIMIT k</code> by looking at the relative distribution of of <code>k</code> across production queries:</p> 510<div class="d-flex justify-content-center"> 511 <div>
511<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script>
511<script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>
511
511<script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
511 512
512<script charset="utf-8" src="https://cdn.plot.ly/plotly-3.0.1.min.js"></script>
512 <div id="8d250aff-7fea-440f-86df-502f16115a23" class="plotly-graph-div" style="height:250px; width:700px;"></div>
512<script type="text/javascript"> window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("8d250aff-7fea-440f-86df-502f16115a23")) { Plotly.newPlot( "8d250aff-7fea-440f-86df-502f16115a23", [{"fill":"tozeroy","line":{"color":"#29b5e8","width":1},"mode":"lines","name":"CDF","x":{"dtype":"i4","bdata":"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAHAAAAB4AAAAfAAAAIAAAACMAAAAoAAAAKQAAAC0AAAAuAAAALwAAADAAAAAyAAAAMwAAADQAAAA3AAAAPAAAAD0AAABAAAAAQwAAAEYAAABLAAAATAAAAFAAAABTAAAAVQAAAFoAAABbAAAAXwAAAGMAAABkAAAAZQAAAGYAAABoAAAAeAAAAIAAAACCAAAAhwAAAIkAAACMAAAAlAAAAJYAAACXAAAAnAAAAJ0AAACgAAAAoQAAAKIAAAClAAAAqQAAAKoAAACuAAAAtAAAALgAAAC7AAAAvgAAAMgAAADJAAAA0gAAANkAAADcAAAA4AAAAOEAAADqAAAA8AAAAPoAAAD7AAAA\u002fAAAAAABAAACAQAAAwEAAAQBAAAOAQAAEAEAABEBAAAeAQAAIgEAACMBAAAoAQAAKwEAACwBAAA2AQAAQAEAAFMBAABeAQAAbAEAAG0BAACPAQAAkAEAAJEBAACYAQAAmgEAAKQBAACsAQAAuQEAAL4BAADCAQAAwwEAAMYBAADMAQAA1gEAANgBAADwAQAA9AEAAPUBAAD2AQAA+AEAAPoBAAAAAgAAEgIAABkCAAAgAgAALAIAADACAAA2AgAAOgIAAD4CAABRAgAAVgIAAFgCAABbAgAAdgIAAIoCAACUAgAApwIAAKgCAACzAgAAvAIAAL0CAADLAgAA7gIAAAIDAAAHAwAADAMAABIDAAAWAwAAHQMAACADAAA+AwAAUgMAAHsDAACEAwAAhQMAAJgDAACsAwAAuQMAANQDAADnAwAA6AMAAOkDAADqAwAA\u002fAMAAAYEAAAaBAAATAQAAGAEAABlBAAAZgQAAIgEAACwBAAAtwQAAMQEAADiBAAAFAUAACgFAABaBQAAcwUAAHgFAAB+BQAAtAUAANwFAAAYBgAAIgYAADkGAABABgAASgYAAGAGAAByBgAAcwYAAHwGAACDBgAApAYAALgGAADWBgAACAcAABAHAAAcBwAAMAcAAGwHAACoBwAAtgcAAM0HAADQBwAA0QcAAOQHAAACCAAAIAgAADQIAABICAAAjggAAJgIAADLCAAA1AgAAOgIAAD8CAAAEAkAADgJAABMCQAAYAkAAGgJAACICQAAnAkAAKsJAADECQAAxQkAAPYJAAAoCgAAZAoAAPAKAABUCwAAaAsAAJALAACkCwAAuAsAALkLAADCCwAA6gsAAP4LAAAcDAAAgAwAABYNAABcDQAAZA0AAHoNAACsDQAArg0AAMANAADKDQAATA4AAGAOAAB0DgAA2A4AAOIOAAAKDwAAbg8AAJYPAACgDwAAoQ8AANwPAAD6DwAAaBAAAIYQAADMEAAA\u002fhAAAGIRAABsEQAAgBEAAJQRAACVEQAAqBEAANoRAAD4EQAAthIAAMASAADyEgAAGhMAACQTAAAuEwAAfhMAAIgTAACJEwAAnBMAAO0TAAD2EwAAUBQAAGQUAACCFAAAkBQAALEUAAC0FAAAGBUAAHwVAACuFQAAdhYAAAwXAAAqFwAAcBcAADgYAABVGAAAnBgAAAAZAABkGQAAlhkAAMgZAAD6GQAAXhoAAPQaAABYGwAAYhsAAIobAAC8GwAAIBwAAFAcAABSHAAA1BwAAOgcAAAcHQAAJB0AAEwdAAAUHgAAWh4AAJAeAABAHwAAQR8AAAAgAADsIAAAFyEAADQhAACYIQAAtiEAAPYhAAD3IQAAKiIAAFYiAABgIgAAeiIAAIUiAACSIgAAxCIAACgjAAApIwAAYCMAAPAjAAAiJAAAlSQAALgkAAC+JAAA6iQAANAlAAAQJgAAFiYAABomAAAfJgAAQiYAAEcmAABdJgAAfyYAAMgmAADVJgAA2CYAAOAmAADqJgAA8SYAAPImAAD1JgAA+CYAAPwmAAD\u002fJgAACycAAAwnAAANJwAADicAAA8nAAAQJwAAEScAABInAABCJwAApicAAKAoAAAEKQAAaCkAAAgqAACUKgAA+CoAAPkqAACILAAA7CwAAB4tAADgLgAARC8AAHAwAADUMAAAODEAAJwxAADOMQAAyDIAAMIzAAD0MwAAvDQAAO40AABMNgAAfjYAALA2AACxNgAA4jYAAHg3AABAOAAACDkAAJ45AADQOQAANDoAAJg6AABgOwAAxDsAAFo8AACMPAAAvjwAAG89AACGPQAAgD4AAMA+AABIPwAAnEAAAKZAAADYQAAAaEIAAJpCAAAMRAAAKkQAAFxEAADyRAAAHkYAAFBGAACCRgAAREgAAD5JAAAGSgAAOEoAAJBMAAAgTgAAIU4AACJOAADoTgAAzlAAAAhSAAA0UwAAZlMAAPxTAAAoVQAA8FUAABxXAACAVwAAslcAAHpYAACsWAAAQlkAANhZAAAEWwAAaFsAAMxbAAD+WwAAXF0AAMBdAACoYQAAqWEAAGpjAADIZAAAkGUAAJFlAAC8ZgAAhGcAABpoAAB4aQAAQGoAAGxrAAD8bAAAYG0AAJJtAAAWcQAASHEAAKxxAABCcgAApnIAANJzAAD+dAAAMHUAADF1AAAydQAAJHcAAFZ3AADsdwAAtHgAABh5AAAMewAAonsAANR7AAA4fAAAAH0AAAF9AAD0fgAA\u002f38AAACAAADogAAAOoQAAGyEAADQhAAAxIYAALiIAACAiQAAEIsAAG6MAACgjAAA\u002fo0AAIiQAAB8kgAAPpQAAHCUAAAAlgAAlpYAACaYAABYmAAAIJkAAEyaAAB4mwAA3JsAAECcAADEnwAAvqAAALihAAAcogAAEKQAAASmAADMpgAAxqcAAPinAADgqwAAoq0AANStAADIrwAAya8AACaxAACwswAAQLUAAJ62AACYtwAA\u002fLcAAC64AACAuwAAdL0AANK+AABovwAAusIAAB7DAABQwwAAUcMAALTDAADmwwAAGMQAAAbHAAAyyAAAZMgAAMjIAAAgywAA6MsAAEDOAAAIzwAAbM8AAJjQAABg0QAA8NIAAPHSAAC40wAA2NYAAMDaAAC03AAA4N0AANTfAAA44AAAauAAAJDiAAB45gAAQOcAAGDqAABh6gAAkuoAAEjuAADY7wAAMPIAABj2AAAM+AAAAPoAAAH6AADo\u002fQAA6f0AANz\u002fAACkAAEA0AEBAAICAQC4BQEAoAkBAHMLAQCIDQEA4A8BAHARAQBYFQEAQBkBADQbAQAoHQEAHB8BABAhAQAEIwEA+CQBAPkkAQDgKAEAqCkBAHAqAQCwMAEA4jABAEAyAQCYNAEAvjYBAIA4AQAWOQEAXD4BAPI+AQBQQAEAOEQBACBIAQAITAEA8E8BALhQAQDAVwEAwVcBAJBfAQBsZQEAYGcBAGFnAQBIawEAMG8BABhzAQAAdwEAUHkBAOh6AQCshAEAnYYBAKCGAQChhgEAiIoBAHCOAQBYkgEAQJYBACiaAQAEoAEA+KEBALyrAQCwrQEAgLUBAGi5AQBQvQEAOMEBADnBAQAgxQEACMkBAPDMAQDA1AEAwdQBAJDcAQBg5AEAVOYBAEjoAQA86gEAMOwBAIjuAQAM8gEAAPQBAOj3AQDQ+wEA0fsBAP\u002f\u002fAQCsAQIAoAMCAIgHAgBwCwIAcQsCAFgPAgBAEwIA7CACAOAiAgCwKgIAsSoCAIwwAgBoNgIAUDoCACxAAgAIRgIA8EkCAORLAgDYTQIAwFECAMFRAgC0UwIAbF8CADBpAgAkawIAAHECANx2AgDEegIAoIACAIiEAgBwiAIAII0CAECQAgA0kgIAEJgCAKCZAgD4mwIA4J8CALCnAgCkqQIAmKsCAIytAgBQtwIAOLsCACC\u002fAgDwxgIA2MoCAMzMAgDAzgIAqNICAGDeAgBU4AIAMOYCADHmAgAA7gIAuPkCAKD9AgAYAwMAcQUDAGQHAwBADQMAQQ0DABwTAwAQFQMABBcDAPgYAwDgHAMAmCgDAOgyAwBQNAMA5EUDANhHAwDASwMAnFEDAJBTAwBgWwMAVF0DADxhAwAwYwMAAGsDAPRsAwDobgMA3HADAKx4AwCgegMAiH4DAHCCAwBAigMANIwDALiPAwAQkgMA+JUDAOCZAwDUmwMAyJ0DALChAwCMpwMAgKkDAFCxAwAstwMAILkDAPDAAwDYxAMAwMgDAJDQAwB41AMAdN0DABjkAwDc7QMA0O8DAMTxAwCg9wMAKAsEABwNBAAQDwQA4BYEALAeBABcLAQAUC4EABQ4BAAIOgQASEAEAMBFBAC0RwQAnEsEAJBNBACETwQAVFcEADBdBADoaAQA0GwEALhwBACgdAQAcHwEACiIBADskQQA4JMEALCbBAB0pQQAUKsEABS1BAAItwQA8LoEAMDCBACcyAQAkMoEAHjOBABs0AQASNYEADDaBAAY3gQAAOIEAOjlBACs7wQAoPEEAJTzBAB89wQAZPsEAFj9BAAoBQUAEAkFAOwOB
512QDgEAUA4RAFAHQiBQBoJAUAUCgFACAwBQAhMAUA8DcFANg7BQDAPwUAbE0FAGBPBQBUUQUASFMFAElTBQCgVQUABFYFADBXBQAYWwUADF0FAABfBQDQZgUAoG4FAJRwBQB8dAUAcHYFAGR4BQBMfAUAQH4FADSABQAoggUAEIYFAMiRBQCAnQUAUKUFABSvBQAIsQUA2LgFAMy6BQCowAUAnMIFAGDMBQAA3AUAoOsFAHDzBQBx8wUAZPUFAFj3BQAo\u002fwUABAUGAPgGBgDhCgYAsBIGAIAaBgB0HAYACC4GAMA5BgC0OwYAkEEGAGBJBgDoXAYA3F4GALhkBgCgaAYA+IMGAMiLBgCwjwYAdJkGAFCfBgAgpwYAFKkGAPCuBgDYsgYAwLYGANDdBgCg5QYAWPEGACj5BgAQ\u002fQYA4AQHALAMBwCMEgcAgBQHAHQWBwAgJAcA8CsHALQ1BwCQOwcAeD8HAGBDBwAYTwcADFEHAABTBwC4XgcAZGwHAEByBwAQegcAvIcHALCJBwAsnwcAIKEHAAilBwDwqAcAYMAHADDIBwAYzAcA6NMHANDXBwC42wcAoN8HAEDvBwDIAggAsAYIAHQQCABoEggAUBYIADgaCABgPQgAVD8IAABNCADoUAgAcGQIAEBsCAAQdAgAmIcIAICLCAC0rAgAqK4IAKDZCABw4QgAWOUIAEznCAA06wgA1PoIALAACQA4FAkALBYJACAYCQAUGgkACBwJAMAnCQCoKwkAAEcJANxMCQDQTgkArFQJAHBeCQBYYgkA4HUJAICFCQDMogkAwaQJAKioCQBgtAkAAMQJAOjHCQDQywkAxM0JAKzRCQAQ6wkA7PAJALD6CQCAAgoAaAYKACASCgCoJQoAeC0KADA5CgAMPwoAAEEKAAFBCgD0QgoA0EgKALhMCgCgUAoAQGAKAChkCgC8dQoAmHsKAFCHCgAIkwoA2JoKALSgCgCcpAoAYK4KAEiyCgAYugoAAL4KANDFCgCI0QoAcNUKAPjoCgDA6QoA4OwKAMjwCgCA\u002fAoAOAgLAPATCwCQIwsAADsLAOg+CwC4RgsAoEoLAIhOCwBkVAsA+GULAABtCwCwcQsAIIkLAAiNCwBgqAsA0L8LAADRCwBA1wsANNkLABDfCwAE4QsA4OYLADgCDAB4IQwAADUMAOg4DACsQgwAWFAMADRWDAAQXAwAsGsMAJhvDABQewwAUXsMACyBDAAggwwAwJIMAKiWDABgogwAMKoMACSsDAC4vQwAZMsMAEzPDABA0QwAEdkMAMjkDADADw0A6DINALBlDQCAbQ0ACIENAPCEDQCQlA0AGKgNAKC7DQCIvw0A4NoNANTcDQCw4g0AOPYNACD6DQAI\u002fg0A\u002fP8NANgFDgDACQ4AqA0OAJERDgBgGQ4AACkOAFhEDgDgVw4AaGsOAJCODgB4kg4AAKYOAEDFDgAQzQ4AwAMPAKgHDwB4Dw8AP0IPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAA=="},"y":{"dtype":"f8","bdata":"LMU1+H9o6T8WELCce3bpP+OcMgF0g+k\u002fH9SgfteG6T\u002fiWR0vNp7pPxdEzl2qoOk\u002flc7rrkmk6T+kredOy6TpP7OM4+5Mpek\u002f61JianPl6T+7yqksLevpP9r+nmfq7uk\u002fkRmxQhzv6T\u002f\u002fTtX4f+\u002fpP15jHtXWFuo\u002foLbNqBIX6j+2JwiaJhfqP1fR34NEF+o\u002fy5l4I+0j6j+247wvNiXqP0EcWihAJeo\u002fV42UGVQl6j8Q2SLtnCnqP9C27xF4Leo\u002f5icqA4wt6j+MM\u002frd1zXqPyAvUiCLOeo\u002fFDxRdn0+6j\u002fhx51Cwz7qP3XD9YR2Quo\u002fAPySfYBC6j+LNDB2ikLqPxZtzW6UQuo\u002foaVqZ55C6j+3FqVYskLqP4SjJ72qT+o\u002f1kvQKyJT6j\u002fsvAodNlPqP41m4gZUU+o\u002fA+nDC6dU6j+OIWEEsVTqP0Q8c9\u002fiVOo\u002fz3QQ2OxU6j9wHujBClXqP\u002ftWhboUVeo\u002fho8isx5V6j\u002fI4tGGWlXqP1Mbb39kVeo\u002f9MRGaYJV6j+uENU8y1nqPwC5fatCXeo\u002fi\u002fEapExd6j\u002fylAAJHl7qPxh1PJVISOs\u002fNfAeAw5k6z9LYVn0IWTrP9aZ9uwrZOs\u002fjbQIyF1k6z8uXuCxe2TrP7mWfaqFZOs\u002fRM8ao49k6z\u002fPB7ibmWTrP+V48oytZOs\u002fcLGPhbdk6z94\u002fkzUpmXrP6TgwbbOZes\u002fulH8p+Jl6z9Fipmg7GXrP1v705EAZus\u002f5jNxigpm6z9xbA6DFGbrP\u002fykq3seZus\u002fh91IdChm6z+dToNlPGbrP7O\u002fvVZQZus\u002fN2Yc\u002fsdm6z\u002fCnrn20WbrP03XVu\u002fbZus\u002f2A\u002f05+Vm6z9qloTHkXTrP\u002faJoL34des\u002fDPvargx26z+XM3inFnbrP9mGJ3tSdus\u002f7\u002fdhbGZ26z96MP9kcHbrPwVpnF16dus\u002fphJ0R5h2
5126z+18W\u002fnGXfrP+HT5MlBd+s\u002f90Qfu1V36z8NtlmsaXfrP5ju9qRzd+s\u002fIyeUnX136z84mM6OkXfrP04JCYCld+s\u002f2UGmeK936z9kekNxuXfrP++y4GnDd+s\u002fBSQbW9d36z+QXLhT4XfrPxuVVUzrd+s\u002fvD4tNgl46z+Mt6qQdYrrPxfwR4l\u002fius\u002fLWGCepOK6z9D0rxrp4rrP84KWmSxius\u002f5HuUVcWK6z\u002fHeBsTH4vrP1KxuAspi+s\u002fNiQ9xDyO6z9MlXe1UI7rP9fNFK5ajus\u002fYgaypmSO6z94d+yXeI7rPwOwiZCCjus\u002fjugmiYyO6z+kWWF6oI7rP7rKm2u0jus\u002fKADAIRiP6z+zOF0aIo\u002frP8mplws2j+s\u002fVOI0BECP6z\u002ffGtL8SY\u002frP2pTb\u002fVTj+s\u002fG8wV1jHI6z9SXnaQKd7rP6oiYFV53us\u002fNVv9TYPe6z9LzDc\u002fl97rP9YE1Teh3us\u002f7HUPKbXe6z93rqwhv97rPwLnSRrJ3us\u002fjR\u002fnEtPe6z8YWIQL3d7rP6OQIQTn3us\u002fLsm+\u002fPDe6z+5AVz1+t7rP0Q6+e0E3+s\u002fWqsz3xjf6z+IA6a8+uHrPxM8Q7UE4us\u002fnnTgrQ7i6z8\u002fHriXLOLrP8pWVZA24us\u002fVY\u002fyiEDi6z\u002fgx4+BSuLrP2sALXpU4us\u002fcwhpxqDk6z\u002f+QAa\u002fquTrP4l5o7e05Os\u002fVgXwg\u002frk6z\u002fhPY18BOXrP\u002feux20Y5es\u002fDSACXyzl6z+YWJ9XNuXrP67J2UhK5es\u002fOQJ3QVTl6z\u002fl5AZw1evrP3AdpGjf6+s\u002f+1VBYenr6z+Gjt5Z8+vrP0xDa9ID7us\u002f13sIyw3u6z9itKXDF+7rP+3sQrwh7us\u002feCXgtCvu6z8DXn2tNe7rP1siZ3KF7us\u002foU9qoZW27T\u002fGWh8wiLjtP0oBftf\u002fuO0\u002f1Tkb0Am57T9gcrjIE7ntPwEckLIxue0\u002fCiTM\u002fn277T+VXGn3h7vtPyCVBvCRu+0\u002fNgZB4aW77T\u002fBPt7Zr7vtP8lGGib8ve0\u002fVH+3Hga+7T\u002fft1QXEL7tP2rw8Q8avu0\u002f0k5WckjA7T9dh\u002fNqUsDtP+i\u002fkGNcwO0\u002fc\u002fgtXGbA7T8Ny0XyTsLtP5gD4+pYwu0\u002fIzyA42LC7T+OQpTRFNjtPxl7Mcoe2O0\u002fpLPOwijY7T8v7Gu7MtjtP+AvvkIv2u0\u002fa2hbOzna7T\u002f2oPgzQ9rtP4HZlSxN2u0\u002fDBIzJVfa7T+XStAdYdrtPzj0pwd\u002f2u0\u002f\u002fqg0gI\u002fc7T+J4dF4mdztPxQab3Gj3O0\u002fUJZe8ane7T\u002fbzvvps97tP2YHmeK93u0\u002f8T8228fe7T9CLWBM4uDtP81l\u002fUTs4O0\u002fWJ6aPfbg7T\u002fj1jc2AOHtP402P4kdQ+4\u002fAIoQxr5Z7j+Lwq2+yFnuPxb7SrfSWe4\u002foTPor9xZ7j8IkkwSC1zuPx4DhwMfXO4\u002fv6xe7Txc7j\u002f7KE5tQ17uP2leciOnXu4\u002ff8+sFLte7j8KCEoNxV7uP4fX6GAHYe4\u002fEhCGWRFh7j+dSCNSG2HuPyiBwEolYe4\u002fZP2vyitj7j\u002fvNU3DNWPuP3pu6rs\u002fY+4\u002fBaeHtElj7j+Q3yStU2PuP08Cc9TRZe4\u002foe+cRexn7j8sKDo+9mfuP86MkCVxae4\u002fWcUtHntp7j+Fp6IAo2nuPxDgP\u002fmsae4\u002fmxjd8bZp7j8mUXrqwGnuP7GJF+PKae4\u002fdoRb9jB37j8BvfjuOnfuP4z1ledEd+4\u002fFy4z4E537j+iZtDYWHfuPy2fbdFid+4\u002fQxCownZ37j\u002fOSEW7gHfuP1mB4rOKd+4\u002f5Ll\u002frJR37j9v8hylnnfuPxCc9I68d+4\u002fPH5pceR37j\u002fHtgZq7nfuP90nQVsCeO4\u002fftEYRSB47j8JCrY9KnjuP5RCUzY0eO4\u002fH3vwLj547j+qs40nSHjuPzXsKiBSeO4\u002fS11lEWZ47j\u002fWlQIKcHjuP4HxMfzCp+4\u002fDCrP9Myn7j+XYmzt1qfuPyKbCebgp+4\u002frdOm3uqn7j84DETX9KfuP059fsgIqO4\u002f2bUbwRKo7j9k7ri5HKjuP+8mVrImqO4\u002fel\u002fzqjCo7j8xegWGYqjuP7yyon5sqO4\u002fR+s\u002fd3ao7j\u002fSI91vgKjuP11cemiKqO4\u002fc820WZ6o7j\u002f+BVJSqKjuP4k+70qyqO4\u002fFHeMQ7yo7j8q6MY00KjuP7UgZC3aqO4\u002fQFkBJuSo7j9Nf+r4bcHuP\u002fcw\u002fi7Yw+4\u002fgmmbJ+LD7j8Nojgg7MPuP5ja1Rj2w+4\u002fOYStAhTE7j\u002fEvEr7HcTuP0\u002f15\u002fMnxO4\u002f2i2F7DHE7j9lZiLlO8TuP\u002fCev91F
512xO4\u002fe9dc1k\u002fE7j8cgTTAbcTuP6e50bh3xO4\u002fMvJusYHE7j+9Kgyqi8TuP0hjqaKVxO4\u002f4npCOyHF7j9ts98zK8XuP\u002fjrfCw1xe4\u002fgyQaJT\u002fF7j+ZlVQWU8XuP9voA+qOxe4\u002fZiGh4pjF7j\u002fxWT7bosXuP3yS29Osxe4\u002fB8t4zLbF7j8dPLO9ysXuPysbr11Mxu4\u002ftlNMVlbG7j9BjOlOYMbuP8zEhkdqxu4\u002f4jXBOH7G7j9tbl4xiMbuP\u002fim+ymSxu4\u002fg9+YIpzG7j8OGDYbpsbuP5lQ0xOwxu4\u002fJIlwDLrG7j9Qa+Xu4cbuP9ujgufrxu4\u002fZtwf4PXG7j\u002fxFL3Y\u002f8buP0JHaEy9x+4\u002fzX8FRcfH7j\u002fj8D8228fuP24p3S7lx+4\u002f+WF6J+\u002fH7j+Emhcg+cfuPw\u002fTtBgDyO4\u002fmgtSEQ3I7j8lRO8JF8juP7B8jAIhyO4\u002fxu3G8zTI7j9RJmTsPsjuP9xeAeVIyO4\u002fZ5ee3VLI7j\u002fyzzvWXMjuP30I2c5myO4\u002fk3kTwHrI7j9hwN6JHcruP3cxGXsxyu4\u002fAmq2czvK7j8Y2\u002fBkT8ruP6MTjl1Zyu4\u002fLkwrVmPK7j+5hMhObcruP0S9ZUd3yu4\u002fz\u002fUCQIHK7j9aLqA4i8ruP3Cf2imfyu4\u002f+9d3IqnK7j8RSbITvcruP5yBTwzHyu4\u002fJ7rsBNHK7j+y8on92sruPz0rJ\u002fbkyu4\u002fyGPE7u7K7j9TnGHn+MruP97U\u002ft8Cy+4\u002faQ2c2AzL7j9\u002fftbJIMvuP5XvELs0y+4\u002fq2BLrEjL7j\u002fB0YWdXMvuP0sKI5Zmy+4\u002f1kLAjnDL7j9he12HesvuP+yz+n+Ey+4\u002fd+yXeI7L7j8CJTVxmMvuPxiWb2Ksy+4\u002fo84MW7bL7j\u002flIbwu8svuP675Aye9I+8\u002fGrpgehku7z+l8v1yIy7vPzArm2stLu8\u002fu2M4ZDcu7z9GnNVcQS7vP9HUclVLLu8\u002f50WtRl8u7z9yfko\u002faS7vP4jvhDB9Lu8\u002fOHhYuhwv7z\u002fDsPWyJi\u002fvP07pkqswL+8\u002f2SEwpDov7z9kWs2cRC\u002fvP0dXVFqeL+8\u002f0o\u002fxUqgv7z9dyI5Lsi\u002fvP+gALES8L+8\u002fcznJPMYv7z\u002f+cWY10C\u002fvP4mqAy7aL+8\u002fghjF3Ecw7z8NUWLVUTDvP5iJ\u002f81bMO8\u002frvo5v28w7z85M9e3eTDvP8RrdLCDMO8\u002fT6QRqY0w7z9IEtNX+zDvP9NKcFAFMe8\u002fXoMNSQ8x7z\u002fpu6pBGTHvP3T0RzojMe8\u002fimWCKzcx7z8Vnh8kQTHvP6DWvBxLMe8\u002fKw9aFVUx7z90r8Y3gDLvP\u002f\u002fnYzCKMu8\u002fiiABKZQy7z8VWZ4hnjLvPyvK2BKyMu8\u002ftgJ2C7wy7z9BOxMExjLvP8xzsPzPMu8\u002fJfMYv3w07z87ZFOwkDTvP8ac8KiaNO8\u002fUdWNoaQ07z\u002fcDSuarjTvP\u002fJ+ZYvCNO8\u002fAV5hK0Q17z+Mlv4jTjXvPxfPmxxYNe8\u002fogc5FWI17z+4eHMGdjXvP0OxEP9\u002fNe8\u002fzumt94k17z+bdfrDzzXvPyaul7zZNe8\u002fseY0teM17z88H9Kt7TXvP8dXb6b3Ne8\u002fNY2TXFs27z\u002fAxTBVZTbvP\u002f1ynM2CPO8\u002ftI2uqLQ87z\u002fF4qdD8D\u002fvP1AbRTz6P+8\u002f21PiNARA7z+SbvQPNkDvPx2nkQhAQO8\u002fqN8uAUpA7z++UGnyXUDvP0mJButnQO8\u002foE3wr7dA7z8rho2owUDvP0H3x5nVQO8\u002fzC9lkt9A7z9XaAKL6UDvP+Kgn4PzQO8\u002fbdk8fP1A7z\u002fFnSZBTUHvP1DWwzlXQe8\u002f2w5hMmFB7z9mR\u002f4qa0HvP3y4OBx\u002fQe8\u002fkilzDZNB7z9ftb\u002fZ2EHvP8zsT8ChW+8\u002fooDY2DNe7z8tuXXRPV7vP7jxEspHXu8\u002fJic3gKte7z+xX9R4tV7vPzyYcXG\u002fXu8\u002f3UFJW91e7z9oeuZT517vP5RcWzYPX+8\u002fH5X4Lhlf7z+qzZUnI1\u002fvPzUGMyAtX+8\u002fojtX1pBf7z8tdPTOml\u002fvP7iskcekX+8\u002f5I4Gqsxf7z9vx6Oi1l\u002fvP\u002fr\u002fQJvgX+8\u002fhTjek+pf7z8QcXuM9F\u002fvP5upGIX+X+8\u002f2VaE\u002fRtm7z+DCJgzhmjvP+pm\u002fJW0au8\u002fdZ+Zjr5q7z8A2DaHyGrvP4sQ1H\u002fSau8\u002fFklxeNxq7z8PtzInSmvvPyUobRhea+8\u002fsGAKEWhr7z87macJcmvvP8bRRAJ8a+8\u002f8rO55KNr7z997FbdrWvvP5Ndkc7Ba+8\u002fSnijqfNr7z+My1J9L2zvP7itx19XbO8\u002fzh4CUWts7z9ZV59JdWzvP2\u002fI2TqJbO8\u002f+gB3M5Ns7z+xG4kOxWzvPzxUJgfPbO8\u002fx4zD\u002f9hs7z9SxWD44mzvP939\u002ffDsbO8\u002faDab6fZs7z\u002fzbjjiAG3vPwngctMUbe8\u002flBgQzB5t7z81wue1PG3vP8D6hK5Gbe8\u002fSzMip1Bt7z\u002fWa7+fWm3vP2GkXJhkbe8\u002f7Nz5kG5t7z93FZeJeG3vPwJONIKCbe8\u002fjYbReoxt7z9TO17znG\u002fvP95z++umb+8\u002faayY5LBv7z\u002f05DXdum\u002fvP38d09XEb+8\u002fIMeqv+Jv7z+r\u002f0e47G\u002fvPzY45bD2b+8\u002fwXCCqQBw7z9iGlqTHnDvP3iLlIQycO8\u002fA8QxfTxw7z+O\u002fM51RnDvP6RtCWdacO8\u002fut5DWG5w7z9FF+FQeHDvP\u002fwx8yuqcO8\u002fh2qQJLRw7z8Soy0dvnDvPygUaA7ScO8\u002fs0wFB9xw7z8+haL\u002f5XDvP1T23PD5cO8\u002f3y566QNx7z9qZxfiDXHvP\u002fWftNoXce8\u002fgNhR0yFx7z8LEe\u002fLK3HvPw+4aL\u002f8d+8\u002fmvAFuAZ47z8lKaOwEHjvP7BhQKkaeO8\u002fxtJ6mi547z9RCxiTOHjvP9xDtYtCeO8\u002fZ3xShEx47z\u002fytO98VnjvPwgmKm5qeO8\u002fk17HZnR47z8el2RffnjvP6nPAViIeO8\u002fNAifUJJ47z+\u002fQDxJnHjvP0p52UGmeO8\u002f1bF2OrB47z9g6hMzunjvP+sisSvEeO8\u002fi8yIFeJ47z+hPcMG9njvPyx2YP\u002f\u002feO8\u002ft6799wl57z9C55rwE3nvP80fOOkdee8\u002fWFjV4Sd57z\u002fjkHLaMXnvP27JD9M7ee8\u002f+QGty0V57z\u002fc\u002fjOJn3nvPzTDHU7vee8\u002fv\u002fu6Rvl57z\u002fVbPU3DXrvP2ClkjAXeu8\u002f690vKSF67z8BT2oaNXrvP4yHBxM\u002feu8\u002fuGl89WZ67z+zCLqc637vP9\u002fqLn8Tf+8\u002fN68YRGN\u002f7z\u002fC57U8bX\u002fvP00gUzV3f+8\u002f7skqH5V\u002f7z95AsgXn3\u002fvP49zAgmzf+8\u002fMB3a8tB\u002f7z+7VXfr2n\u002fvP1z\u002fTtX4f+8\u002f5zfszQKA7z+BT4VmjoDvP5fAv1eigO8\u002fOGqXQcCA7z9O29Ey1IDvP9kTbyvegO8\u002fZEwMJOiA7z96vUYV\u002fIDvPwX24w0Gge8\u002f0oEw2kuB7z+CxYJhSIPvP66n90Nwg+8\u002fOeCUPHqD7z\u002fEGDI1hIPvP9qJbCaYg+8\u002fZcIJH6KD7z\u002fw+qYXrIPvP3szRBC2g+8\u002fBmzhCMCD7z\u002fKNakjD43vP1VuRhwZje8\u002f4KbjFCON7z9r34ANLY3vP5bB9e9Uje8\u002frDIw4WiN7z\u002fYFKXDkI3vP3m+fK2uje8\u002fGmhUl8yN7z+loPGP1o3vP7sRLIHqje8\u002fRkrJefSN7z8\u002fuIooYo7vP8rwJyFsju8\u002f4GFiEoCO7z9rmv8Kio7vP\u002fbSnAOUju8\u002fDETX9KeO7z\u002fDXunP2Y7vP9nPI8Htju8\u002fZAjBufeO7z8FspijFY\u002fvP5DqNZwfj+8\u002fGyPTlCmP7z+rNghCM8DvP98guXCnwu8\u002fljvLS9nC7z+srAU97cLvP01W3SYLw+8\u002fY8cXGB\u002fD7z\u002fu\u002f7QQKcPvP3k4Ugkzw+8\u002fBHHvAT3D7z+PqYz6RsPvP+dtdr+Ww+8\u002fcqYTuKDD7z+IF06ptMPvP56IiJrIw+8\u002ftPnCi9zD7z\u002fKav188MPvP2sU1WYOxO8\u002f9kxyXxjE7z+BhQ9YIsTvP++6Mw6GxO8\u002fevPQBpDE7z8FLG7\u002fmcTvP5BkC\u002fijxO8\u002fG52o8K3E7z+m1UXpt8TvPzEO4+HBxO8\u002fR38d09XE7z\u002fSt7rL38TvP+go9bzzxO8\u002fidLMphHF7z+fQweYJcXvP+CWtmthxe8\u002fa89TZGvF7z\u002f2B\u002fFcdcXvP4FAjlV\u002fxe8\u002fDHkrTonF7z+XschGk8XvPzhboDCxxe8\u002fw5M9KbvF7z9OzNohxcXvP9kEeBrPxe8\u002fZD0VE9nF7z9HOpzQMsbvP9JyOck8xu8\u002fXavWwUbG7z9zHBGzWsbvP4mNS6Ruxu8\u002fFMbonHjG7z+f\u002foWVgsbvPyo3I46Mxu8\u
512002frt2BNQTH7z85Fh8uDsfvP8ROvCYYx+8\u002f2r\u002f2FyzH7z9l+JMQNsfvP\u002fAwMQlAx+8\u002fe2nOAUrH7z8Gomv6U8fvP5HaCPNdx+8\u002fXmZVv6PH7z\u002fpnvK3rcfvP3TXj7C3x+8\u002f\u002fw8tqcHH7z8VgWea1cfvP6C5BJPfx+8\u002fK\u002fKhi+nH7z+2Kj+E88fvP0Fj3Hz9x+8\u002f+H3uVy\u002fI7z+DtotQOcjvPw7vKElDyO8\u002fJGBjOlfI7z+vmAAzYcjvPzrRnStryO8\u002f23p1FYnI7z9msxIOk8jvP\u002fHrrwadyO8\u002ffCRN\u002f6bI7z+oBsLhzsjvPzM\u002fX9rYyO8\u002fvnf80uLI7z9JsJnL7MjvP9ToNsT2yO8\u002f6llxtQrJ7z8Ay6umHsnvP4sDSZ8oye8\u002fQh5belrJ7z\u002fNVvhyZMnvP+PHMmR4ye8\u002fbgDQXILJ7z+EcQpOlsnvPw+qp0agye8\u002fmuJEP6rJ7z8lG+I3tMnvPxAgpUFazO8\u002fscl8K3jM7z88AhokgszvP1JzVBWWzO8\u002f3avxDaDM7z9o5I4GqszvP35Vyfe9zO8\u002fCY5m8MfM7z+UxgPp0czvPzVw29LvzO8\u002fwKh4y\u002fnM7z9L4RXEA83vP+yK7a0hze8\u002fd8OKpivN7z8C\u002fCefNc3vP0RP13Jxze8\u002fz4d0a3vN7z9awBFkhc3vP3AxTFWZze8\u002fhqKGRq3N7z8R2yM\u002ft83vPydMXjDLze8\u002fsoT7KNXN7z89vZgh383vP8j1NRrpze8\u002faZ8NBAfO7z8guh\u002ffOM7vPzYrWtBMzu8\u002fTJyUwWDO7z\u002fX1DG6as7vP+1FbKt+zu8\u002feH4JpIjO7z8ZKOGNps7vP6Rgfoawzu8\u002fL5kbf7rO7z+60bh3xM7vP0UKVnDOzu8\u002f\u002fCRoSwDP7z+HXQVECs\u002fvPxKWojwUz+8\u002fPngXHzzP7z\u002fJsLQXRs\u002fvP1TpURBQz+8\u002falqMAWTP7z8SUSE6cdDvP52JvjJ70O8\u002fKMJbK4XQ7z+z+vgjj9DvP8lrMxWj0O8\u002fVKTQDa3Q7z\u002ff3G0Gt9DvP4CGRfDU0O8\u002fC7\u002fi6N7Q7z+W93\u002fh6NDvP6xoutL80O8\u002fN6FXywbR7z\u002fC2fTDENHvP00Skrwa0e8\u002fY4PMrS7R7z\u002fuu2mmONHvPwQtpJdM0e8\u002fj2VBkFbR7z\u002fnKStVptHvP3JiyE2w0e8\u002f\u002fZplRrrR7z+I0wI\u002fxNHvPxMMoDfO0e8\u002fnkQ9MNjR7z8pfdoo4tHvP7S1dyHs0e8\u002fyiayEgDS7z9VX08LCtLvP+CX7AMU0u8\u002fa9CJ\u002fB3S7z\u002f2CCf1J9LvP4FBxO0x0u8\u002feq+FnJ\u002fS7z8F6CKVqdLvP5AgwI2z0u8\u002fG1ldhr3S7z+mkfp+x9LvP7wCNXDb0u8\u002fn\u002f+7LTXT7z8qOFkmP9PvP7Vw9h5J0+8\u002fQKmTF1PT7z\u002fL4TAQXdPvP+FSawFx0+8\u002fbIsI+nrT7z\u002f3w6XyhNPvP4L8QuuO0+8\u002fmG193KLT7z8jphrVrNPvP67et8220+8\u002fxE\u002fyvsrT7z9PiI+31NPvP9rALLDe0+8\u002fZfnJqOjT7z8Go6GSBtTvP5HbPosQ1O8\u002fSPZQZkLU7z\u002fTLu5eTNTvP+mfKFBg1O8\u002fdNjFSGrU7z\u002f\u002fEGNBdNTvP4pJADp+1O8\u002fFYKdMojU7z8r89cjnNTvP7UrdRym1O8\u002fQGQSFbDU7z\u002fLnK8NutTvP+EN6v7N1O8\u002fbEaH99fU7z+Ct8Ho69TvPw3wXuH11O8\u002fI2GZ0gnV7z+umTbLE9XvPznS08Md1e8\u002fxApxvCfV7z\u002fw7OWeT9XvP3slg5dZ1e8\u002fBl4gkGPV7z+Rlr2IbdXvPzJAlXKL1e8\u002fvXgya5XV7z9Isc9jn9XvP9PpbFyp1e8\u002fXiIKVbPV7z\u002fpWqdNvdXvP3STREbH1e8\u002fK65WIfnV7z9BH5ESDdbvP1eQywMh1u8\u002f4sho\u002fCrW7z\u002f4OaPtPtbvP4NyQOZI1u8\u002fr1S1yHDW7z\u002fFxe+5hNbvP1D+jLKO1u8\u002ffOABlbbW7z8HGZ+NwNbvP5JRPIbK1u8\u002fHYrZftTW7z++M7Fo8tbvP0lsTmH81u8\u002f1KTrWQbX7z\u002fqFSZLGtfvP3VOw0Mk1+8\u002fAIdgPC7X7z+Lv\u002f00ONfvPxb4mi1C1+8\u002foTA4JkzX7z8sadUeVtfvP7ehchdg1+8\u002fQtoPEGrX7z\u002fyYuOZCdjvP32bgJIT2O8\u002fkwy7gyfY7z8eRVh8MdjvP6l99XQ72O8\u002f69CkSHfY7z+MenwyldjvPxezGSuf2O8\u002fouu2I6nY7z8tJFQcs9jvP\u002fqvoOj42O8\u002fheg94QLZ7z8QIdvZDNnvPzwDULw02e8\u002fxzvttD7Z7z9SdIqtSNnvP92sJ6ZS2e8\u002faOXEnlzZ7z\u002fzHWKXZtnvP35W\u002f49w2e8\u002flMc5gYTZ7z\u002fdZ6ajr9rvP2igQ5y52u8\u002f89jglMPa7z9+EX6NzdrvPx+7VXfr2u8\u002fNSyQaP\u002fa7z\u002fAZC1hCdvvP0udylkT2+8\u002f1tVnUh3b7z\u002fsRqJDMdvvP3d\u002fPzw72+8\u002fo2G0HmPb7z8umlEXbdvvP7nS7g932+8\u002fz0MpAYvb7z\u002fltGPyntvvP3DtAOuo2+8\u002f+yWe47Lb7z8nCBPG2tvvP7JAsL7k2+8\u002fPXlNt+7b7z\u002fIseqv+NvvPwoFmoM03O8\u002flT03fD7c7z8gdtR0SNzvP6uucW1S3O8\u002fPjTMtEvd7z\u002fJbGmtVd3vP1SlBqZf3e8\u002f392jnmnd7z+Ah3uIh93vPwvAGIGR3e8\u002fITFTcqXd7z+safBqr93vP8LaKlzD3e8\u002fTRPIVM3d7z\u002fuvJ8+693vP3n1PDf13e8\u002fBC7aL\u002f\u002fd7z+PZncoCd7vPxqfFCET3u8\u002fMBBPEife7z+7SOwKMd7vP9G5JvxE3u8\u002fXPLD9E7e7z9yY\u002f7lYt7vP\u002f2bm95s3u8\u002fnkVzyIre7z8pfhDBlN7vP7S2rbme3u8\u002fyifoqrLe7z9VYIWjvN7vP+CYIpzG3u8\u002fa9G\u002flNDe7z\u002f1CV2N2t7vP4BC+oXk3u8\u002fC3uXfu7e7z+WszR3+N7vPyHs0W8C3+8\u002frCRvaAzf7z9NzkZSKt\u002fvP9gG5Eo03+8\u002fYz+BQz7f7z\u002fudx48SN\u002fvP3mwuzRS3+8\u002fBOlYLVzf7z+JSjbSMOHvPxSD08o64e8\u002fn7tww0Th7z8q9A28TuHvP7Usq7RY4e8\u002fQGVIrWLh7z\u002fLneWlbOHvP1bWgp524e8\u002fDfGUeajh7z+YKTJysuHvPyNiz2q84e8\u002frppsY8bh7z850wlc0OHvP8QLp1Ta4e8\u002fT0RETeTh7z\u002fafOFF7uHvP2W1fj744e8\u002f8O0bNwLi7z97JrkvDOLvP5GX8yAg4u8\u002fHNCQGSri7z+nCC4SNOLvPzJBywo+4u8\u002fvXloA0ji7z9eI0DtZeLvP+lb3eVv4u8\u002fdJR63nni7z\u002f\u002fzBfXg+LvP4oFtc+N4u8\u002fFT5SyJfi7z+gdu\u002fAoeLvPyuvjLmr4u8\u002ftucpsrXi7z\u
512002fiyZ6U3eLvP20CPI3n4u8\u002f+DrZhfHi7z+Dc3Z+++LvPw6sE3cF4+8\u002fmeSwbw\u002fj7z+vVetgI+PvPzqOiFkt4+8\u002fxcYlUjfj7z9Q\u002f8JKQePvP9s3YENL4+8\u002f8aiaNF\u002fj7z984TctaePvPwca1SVz4+8\u002fklJyHn3j7z8diw8Xh+PvP6jDrA+R4+8\u002fM\u002fxJCJvj7z++NOcApePvP0lthPmu4+8\u002f1KUh8rjj7z9f3r7qwuPvP+oWXOPM4+8\u002fdU\u002f529bj7z8AiJbU4OPvP4vAM83q4+8\u002fFfnQxfTj7z8ragu3COTvP7aiqK8S5O8\u002fzBPjoCbk7z9XTICZMOTvP+KEHZI65O8\u002fbb26ikTk7z\u002f49VeDTuTvPw5nknRi5O8\u002fmZ8vbWzk7z8k2MxlduTvP68Qal6A5O8\u002fxYGkT5Tk7z9QukFInuTvP9vy3kCo5O8\u002fZit8ObLk7z98nLYqxuTvPwfVUyPQ5O8\u002fqH4rDe7k7z8zt8gF+OTvP77vZf4B5e8\u002f1GCg7xXl7z9fmT3oH+XvP+rR2uAp5e8\u002fdQp42TPl7z8AQxXSPeXvP4t7sspH5e8\u002fFrRPw1Hl7z+h7Oy7W+XvPywlirRl5e8\u002ft10nrW\u002fl7z9ClsSleeXvP254OYih5e8\u002f+bDWgKvl7z+E6XN5teXvPw8iEXK\u002f5e8\u002fmlquasnl7z8lk0tj0+XvP7DL6Fvd5e8\u002fOwSGVOfl7z\u002fGPCNN8eXvP1F1wEX75e8\u002f3K1dPgXm7z9n5vo2D+bvP\u002fIemC8Z5u8\u002ffVc1KCPm7z8IkNIgLebvP5PIbxk35u8\u002fqTmqCkvm7z80ckcDVebvP7+q5Pte5u8\u002fSuOB9Gjm7z+MNjHIpObvPxdvzsCu5u8\u002foqdrubjm7z8t4AiywubvP0NRQ6PW5u8\u002fzongm+Dm7z9Zwn2U6ubvP+T6Go305u8\u002fbzO4hf7m7z\u002f6a1V+COfvP4Wk8nYS5+8\u002fEN2Pbxzn7z+bFS1oJufvPyZOymAw5+8\u002fsYZnWTrn7z\u002fH96FKTufvP2iheTRs5+8\u002f89kWLXbn7z9+ErQlgOfvP5SD7haU5+8\u002fqvQoCKjn7z81LcYAsufvP8BlY\u002fm75+8\u002fS54A8sXn7z\u002fW1p3qz+fvP2EPO+PZ5+8\u002fjfGvxQHo7z\u002fPRF+ZPejvP1p9\u002fJFH6O8\u002fcO42g1vo7z\u002f7JtR7ZejvP4ZfcXRv6O8\u002fnNCrZYPo7z8nCUlejejvP7JB5laX6O8\u002fPXqDT6Ho7z\u002fIsiBIq+jvP1PrvUC16O8\u002f3iNbOb\u002fo7z9pXPgxyejvP\u002fSUlSrT6O8\u002ff80yI93o7z8KBtAb5+jvP5U+bRTx6O8\u002fIHcKDfvo7z+rr6cFBenvPzXoRP4O6e8\u002fox1ptHLp7z8uVgatfOnvP7mOo6WG6e8\u002fRMdAnpDp7z\u002fP\u002f92WmunvP1o4e4+k6e8\u002fNqPD+2vq7z\u002fB22D0dervP7cZ3EJ\u002f8+8\u002fWMOzLJ3z7z9uNO4dsfPvP\u002flsixa78+8\u002fhKUoD8Xz7z\u002fcaRLUFPTvP\u002fLaTMUo9O8\u002ffRPqvTL07z8ITIe2PPTvP5OEJK9G9O8\u002fHr3Bp1D07z+p9V6gWvTvPzQu\u002fJhk9O8\u002fdoGrbKD07z8BukhlqvTvP\u002fonChQY9e8\u002fhWCnDCL17z+b0eH9NfXvPyYKf\u002fY\u002f9e8\u002fsUIc70n17z88e7nnU\u002fXvP8ezVuBd9e8\u002fUuzz2Gf17z\u002fdJJHRcfXvP2hdLsp79e8\u002ffs5ou4\u002f17z8JBwa0mfXvP5Q\u002fo6yj9e8\u002fH3hApa317z+qsN2dt\u002fXvPzXpepbB9e8\u002f1pJSgN\u002f17z9hy+946fXvP+wDjXHz9e8\u002fdzwqav317z8CdcdiB\u002fbvP42tZFsR9u8\u002fGOYBVBv27z+jHp9MJfbvP0TIdjZD9u8\u002fzwAUL0327z9aObEnV\u002fbvP+VxTiBh9u8\u002fcKrrGGv27z8RVMMCifbvP5yMYPuS9u8\u002fJ8X985z27z+y\u002fZrspvbvPz02OOWw9u8\u002fyG7V3br27z9Tp3LWxPbvP97fD8\u002fO9u8\u002faRitx9j27z9\u002fiee47PbvPwrChLH29u8\u002flfohqgD37z8gM7+iCvfvP6trXJsU9+8\u002fwdyWjCj37z9MFTSFMvfvP2KGbnZG9+8\u002f7b4Lb1D37z9496hnWvfvPwMwRmBk9+8\u002fjmjjWG737z8ZoYBRePfvPy8Su0KM9+8\u002fukpYO5b37z9Fg\u002fUzoPfvP1v0LyW09+8\u002fcWVqFsj37z\u002f8nQcP0vfvP4fWpAfc9+8\u002fEg9CAOb37z+dR9\u002f47\u002ffvPyiAfPH59+8\u002fs7gZ6gP47z8+8bbiDfjvP8kpVNsX+O8\u002fVGLx0yH47z\u002ffmo7MK\u002fjvP2rTK8U1+O8\u002f9QvJvT\u002f47z+ARGa2SfjvPwt9A69T+O8\u002flbWgp1347z8g7j2gZ\u002fjvP6sm25hx+O8\u002fNl94kXv47z\u002fBlxWKhfjvP0zQsoKP+O8\u002f1whQe5n47z+klJxH3\u002fjvPy\u002fNOUDp+O8\u002fRT50Mf347z9br64iEfnvP+bnSxsb+e8\u002fyeTS2HT57z9UHXDRfvnvP99VDcqI+e8\u002fao6qwpL57z+A\u002f+SzpvnvPws4gqyw+e8\u002flnAfpbr57z8hqbydxPnvP6zhWZbO+e8\u002fNxr3jtj57z\u002fCUpSH4vnvP4\u002fe4FMo+u8\u002fGhd+TDL67z+lTxtFPPrvPzCIuD1G+u8\u002fu8BVNlD67z9G+fIuWvrvP1xqLSBu+u8\u002f56LKGHj67z\u002f9EwUKjPrvPxOFP\u002fuf+u8\u002fnr3c86n67z8p9nnss\u002frvP7QuF+W9+u8\u002fP2e03cf67z\u002fKn1HW0frvP+AQjMfl+u8\u002fa0kpwO\u002f67z\u002f2gca4+frvP4G6Y7ED++8\u002fDPMAqg377z+XK56iF\u002fvvPyJkO5sh++8\u002frZzYkyv77z841XWMNfvvP8MNE4U\u002f++8\u002fMUM3O6P77z+8e9QzrfvvP0e0cSy3++8\u002fc5bmDt\u002f77z\u002f+zoMH6fvvP4kHIQDz++8\u002fFEC++Pz77z+feFvxBvzvPyqx+OkQ\u002fO8\u002ftemV4hr87z9AIjPbJPzvP8ta0NMu\u002fO8\u002fbASovUz87z\u002f3PEW2VvzvP4J14q5g\u002fO8\u002fDa5\u002fp2r87z+Y5hygdPzvPyMfuph+\u002fO8\u002frldXkYj87z85kPSJkvzvP8TIkYKc\u002fO8\u002fTwEve6b87z\u002faOcxzsPzvP2VyaWy6\u002fO8\u002f8KoGZcT87z9746NdzvzvPwYcQVbY\u002fO8\u002fkVTeTuL87z8cjXtH7PzvP6fFGED2\u002fO8\u002fMv61OAD97z+9NlMxCv3vP0hv8CkU\u002fe8\u002f06eNIh797z9e4CobKP3vP+kYyBMy\u002fe8\u002f\u002f4kCBUb97z+Kwp\u002f9T\u002f3vPxX7PPZZ\u002fe8\u002foDPa7mP97z8rbHfnbf3vP7WkFOB3\u002fe8\u002fQN2x2IH97z\u002fLFU\u002fRi\u002f3vP1ZO7MmV\u002fe8\u002f4YaJwp\u002f97z9svya7qf3vP\u002ff3w7Oz\u002fe8\u002fgjBhrL397z8Naf6kx\u002f3vP5ihm53R\u002fe8\u002fI9o4ltv97z+uEtaO5f3vPzlLc4fv\u002fe8\u002f2vRKcQ3+7z9lLehpF\u002f7vP\u002fBlhWIh\u002fu8\u002fe54iWyv+7z8G179TNf7vP5EPXUw\u002f\u002fu8\u002fHEj6REn+7z+ngJc9U\u002f7vPzK5NDZd\u002fu8\u002fvfHRLmf+7z9IKm8ncf7vP9NiDCB7\u002fu8\u002f6dNGEY\u002f+7z90DOQJmf7vP\u002f9EgQKj\u002fu8\u002fin0e+6z+7z8Vtrvztv7vPysn9uTK\u002fu8\u002ftl+T3dT+7z9BmDDW3v7vP8zQzc7o\u002fu8\u002fVwlrx\u002fL+7z\u002fiQQjA\u002fP7vP216pbgG\u002f+8\u002f+LJCsRD\u002f7z+D69+pGv\u002fvPw4kfaIk\u002f+8\u002fmVwamy7\u002f7z8klbeTOP\u002fvP6\u002fNVIxC\u002f+8\u002fOgbyhEz\u002f7z\u002fFPo99Vv\u002fvP1B3LHZg\u002f+8\u002f26\u002fJbmr\u002f7z9m6GZndP\u002fvP\u002fEgBGB+\u002f+8\u002ffFmhWIj\u002f7z8Hkj5Rkv\u002fvP5LK20mc\u002f+8\u002fHQN5Qqb\u002f7z+oOxY7sP\u002fvPzN0szO6\u002f+8\u002fvqxQLMT\u002f7z9J5e0kzv\u002fvP9Qdix3Y\u002f+8\u002fX1YoFuL\u002f7z\u002fqjsUO7P\u002fvP3XHYgf2\u002f+8\u002fAAAAAAAA8D8="},"type":"scatter"}], {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"xaxis":{"title":{"text":"Value k for LIMIT clause"},"type":"log","range":[0,6],"showgrid":true,"gridwidth":0.5,"gridcolor":"lightgray","showline":true,"linewidth":1,"linecolor":"black","showspikes":true,"spikemode":"across","spikesnap":"cursor","spikethickness":1,"spikedash":"solid","spikecolor":"black"},"yaxis":{"title":{"text":"CDF"},"minor":{"ticklen":4,"showgrid":true},"tickformat":".0%","range":[0,1],"showgrid":true,"gridwidth":0.5,"gridcolor":"lightgray","showline":true,"linewidth":1,"linecolor":"black","minallowed":0,"maxallowed":1}
512,"margin":{"l":40,"r":40,"t":40,"b":40},"width":700,"height":250,"showlegend":false,"paper_bgcolor":"white","plot_bgcolor":"white","hovermode":"x"}, {"responsive": true} ) }; </script>
512 </div> 513</div> 514 515 516 517<h2>Related Links</h2> 518<ul> 519 <li>The blog series "<a href="https://www.snowflake.com/en/blog/super-fast-top-k-queries/" rel="external nofollow noopener" target="_blank">Say Hello to Superfast TopâK Queries in Snowflake</a>", "<a href="https://www.snowflake.com/en/blog/continued-investments-in-price-performance-and-faster-top-k-queries/" rel="external nofollow noopener" target="_blank">Continued Investments in Price Performance and Faster TopâK Queries</a>", and "<a href="https://www.snowflake.com/en/engineering-blog/optimizing-top-k-aggregation-snowflake/" rel="external nofollow noopener" target="_blank">Reimagining TopâK Aggregation Optimization at Snowflake</a>" focuses on optimizations regarding pruning capabilities of TopâK queries in Snowflake.</li> 520 <li>The blog post "<a href="https://www.snowflake.com/en/engineering-blog/iceberg-data-pruning/" rel="external nofollow noopener" target="_blank">Pruning for Iceberg: 90% of an Iceberg Is Underwater</a>" elaborates on pruning in Snowflake on Apache Iceberg tables.</li> 521</ul> 522 523 524<h2>Follow-Up Work and Scientific Discourse</h2> 525No follow-up work has been published yet. Please reach out to the main author of this paper if you think your work should be included here. 526 527 </article> 528 529 530 <div id="cite" class="mt-5"> 531 <h2>Cite this Paper</h2> 532 533 <div class="language-bibtex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">@inproceedings</span><span class="p">{</span><span class="nl">Zimmerer2025Pruning</span><span class="p">,</span> 534 <span class="na">title</span> <span class="p">=</span> <span class="s">{Pruning in Snowflake: Working Smarter, Not Harder}</span><span class="p">,</span> 535 <span class="na">author</span> <span class="p">=</span> <span class="s">{Zimmerer, Andreas and Dam, Damien and Kossmann, Jan and Waack, Juliane and Oukid, Ismail and Kipf, Andreas}</span><span class="p">,</span> 536 <span class="na">editor</span> <span class="p">=</span> <span class="s">{Volker Markl and Joe Hellerstein and Azza Abouzied}</span><span class="p">,</span> 537 <span class="na">booktitle</span> <span class="p">=</span> <span class="s">{Companion of the 2025 International Conference on Management of Data ({SIGMOD}-Companion '25), June 22--27, 2025, Berlin, Germany}</span><span class="p">,</span> 538 <span class="na">publisher</span> <span class="p">=</span> <span class="s">{{ACM}}</span><span class="p">,</span> 539 <span class="na">year</span> <span class="p">=</span> <span class="s">{2025}</span><span class="p">,</span> 540 <span class="na">url</span> <span class="p">=</span> <span class="s">{https://doi.org/10.1145/3722212.3724447}</span><span class="p">,</span> 541 <span class="na">doi</span> <span class="p">=</span> <span class="s">{10.1145/3722212.3724447}</span><span class="p">,</span> 542<span class="p">}</span> 543</code></pre></div></div> 544 545 </div> 546 547 548 549 550 551</div> 552 553 554 </div> 555 556 <!-- Footer --> 557 558 559 560 <footer class="sticky-bottom mt-5" role="contentinfo"> 561 562 563 <div class="container"> 564 565 © Copyright 2025 566 Andi 567 568 Zimmerer. 569 570 571 Last updated: May 05, 2025. 572 573 574 </div> 575 </footer> 576 577 578 579 <!-- JavaScripts --> 580 <!-- jQuery -->
581<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
581 582 583<!-- Bootsrap & MDB scripts -->
584<script src="/assets/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 584
584
585<script src="https://cdn.jsdelivr.net/npm/[email protected]/js/mdb.min.js" integrity="sha256-NdbiivsvWt7VYCt6hYNT3h/th9vSTL4EDWeGs5SN3DA=" crossorigin="anonymous"></script>
585 586 587 588 <!-- Masonry & imagesLoaded --> 589
589<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/masonry.pkgd.min.js" integrity="sha256-Nn1q/fx0H7SNLZMQ5Hw5JLaTRZp0yILA/FRexe19VdI=" crossorigin="anonymous"></script>
589 590
590<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/imagesloaded.pkgd.min.js" integrity="sha256-htrLFfZJ6v5udOG+3kNLINIKh2gvoKqwEhHYfTTMICc=" crossorigin="anonymous"></script>
590 591
591<script defer src="/assets/js/masonry.js?a0db7e5d5c70cc3252b3138b0c91dcaf" type="text/javascript"></script>
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 <!-- Medium Zoom JS --> 616
616<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/medium-zoom.min.js" integrity="sha256-ZgMyDAIYDYGxbcpJcfUnYwNevG/xi9OHKaR/8GK+jWc=" crossorigin="anonymous"></script>
616 617
617<script defer src="/assets/js/zoom.js?85ddb88934d28b74e78031fd54cf8308"></script>
617 618 619 620 621 622 623 624<!-- Load Common JS -->
625<script src="/assets/js/no_defer.js?2781658a0a2b13ed609542042a859126"></script>
vendor: 1 bytes, line 625
625
626<script defer src="/assets/js/common.js?e0514a05c5c95ac1a93a8dfd5249b92e"></script>
vendor: 1 bytes, line 626
626
627<script defer src="/assets/js/copy_code.js?c8a01c11a92744d44b093fc3bda915df" type="text/javascript"></script>
627 628 629<!-- Jupyter Open External Links New Tab -->
630<script defer src="/assets/js/jupyter_new_tab.js?d9f17b6adc2311cbabd747f4538bb15f"></script>
630 631 632<!-- Badges --> 633 634
634<script async src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
634 635 636 637
637<script async src="https://badge.dimensions.ai/badge.js"></script>
637 638 639 640 641 <!-- MathJax --> 642
642<script defer type="text/javascript" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/[email protected]/es5/tex-mml-chtml.js" integrity="sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=" crossorigin="anonymous"></script>
642 643 644
644<script src="/assets/js/mathjax-setup.js?a5bb4e6a542c546dd929b24b8b236dfd"></script>
644 645
645<script defer src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6" crossorigin="anonymous"></script>
645 646 647 648 649 650 651 652 653 654 655 656 <!-- Scrolling Progress Bar --> 657
657<script defer src="/assets/js/progress-bar.js?2f30e0e6801ea8f5036fa66e1ab0a71a" type="text/javascript"></script>
657 658 659 660 661 662 663 664 665 <!-- Back to Top --> 666
666<script src="/assets/js/vanilla-back-to-top.min.js?f40d453793ff4f64e238e420181a1d17"></script>
666 667
667<script> 668 addBackToTop(); 669 </script>
669 670 671 672 673 <!-- Search --> 674
674<script type="module" src="/assets/js/search/ninja-keys.min.js?a3446f084dcaecc5f75aa1757d087dcf"></script>
674 675 <ninja-keys hidebreadcrumbs noautoloadmdicons placeholder="Type to start searching"></ninja-keys> 676
676<script src="/assets/js/search-setup.js?6c304f7b1992d4b60f7a07956e52f04a"></script>
676 677
677<script src="/assets/js/search-data.js"></script>
677 678
678<script src="/assets/js/shortcut-key.js?6f508d74becd347268a7f822bca7309d"></script>
678 679 680 681 682 683 </body> 684</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.