From 80e9555cda723a7c5f5ca61e6fa8beb353432ea8 Mon Sep 17 00:00:00 2001 From: pieter Date: Sun, 31 Oct 2021 08:14:56 +0200 Subject: [PATCH] added hash partitioning docs --- sqlg-doc/docs/2.1.4/.gitignore | 1 + sqlg-doc/docs/2.1.4/asciidoctor-default.css | 2119 +++++ sqlg-doc/docs/2.1.4/flask.css | 597 ++ sqlg-doc/docs/2.1.4/img/bullet.png | Bin 0 -> 1045 bytes .../2.1.4/img/github/PNG/GitHub-Mark-32px.png | Bin 0 -> 1714 bytes .../img/github/PNG/GitHub-Mark-Light-32px.png | Bin 0 -> 1571 bytes sqlg-doc/docs/2.1.4/img/github/SVG/law.svg | 12 + .../docs/2.1.4/img/github/SVG/mark-github.svg | 1 + sqlg-doc/docs/2.1.4/img/hr.gif | Bin 0 -> 1121 bytes sqlg-doc/docs/2.1.4/img/nav-bg.gif | Bin 0 -> 1238 bytes sqlg-doc/docs/2.1.4/img/sqlg/E_created.png | Bin 0 -> 7157 bytes sqlg-doc/docs/2.1.4/img/sqlg/E_knows.png | Bin 0 -> 5527 bytes .../2.1.4/img/sqlg/V_Person_name_index.png | Bin 0 -> 42696 bytes sqlg-doc/docs/2.1.4/img/sqlg/V_person.png | Bin 0 -> 6492 bytes sqlg-doc/docs/2.1.4/img/sqlg/V_software.png | Bin 0 -> 4276 bytes .../2.1.4/img/sqlg/bulkAddEdgesMemory.png | Bin 0 -> 30705 bytes sqlg-doc/docs/2.1.4/img/sqlg/continent.png | Bin 0 -> 19587 bytes sqlg-doc/docs/2.1.4/img/sqlg/edges.png | Bin 0 -> 10337 bytes sqlg-doc/docs/2.1.4/img/sqlg/fleet.png | Bin 0 -> 19025 bytes .../2.1.4/img/sqlg/normalBatchModeMemory.png | Bin 0 -> 45551 bytes .../img/sqlg/postgresql_composite_index.png | Bin 0 -> 40337 bytes sqlg-doc/docs/2.1.4/img/sqlg/public.png | Bin 0 -> 17900 bytes sqlg-doc/docs/2.1.4/img/sqlg/schemas.png | Bin 0 -> 13824 bytes .../docs/2.1.4/img/sqlg/sqlg_topology.png | Bin 0 -> 16423 bytes .../docs/2.1.4/img/sqlg/sqlg_topology_uml.png | Bin 0 -> 54177 bytes .../sqlg/streamBatchModeBulkEdgeMemory.png | Bin 0 -> 31339 bytes .../streamWithLockAndEdgeCreationMemory.png | Bin 0 -> 39196 bytes .../img/sqlg/streamingBatchModeMemory.png | Bin 0 -> 32376 bytes .../sqlg/streamingBatchModeWithLockMemory.png | Bin 0 -> 33546 bytes ...reamingWithLockBatchModeAndEdgesMemory.png | Bin 0 -> 50412 bytes .../sqlg/streamingWithLockBatchModeMemory.png | Bin 0 -> 31045 bytes .../docs/2.1.4/img/sqlg/tableDefinition.png | Bin 0 -> 32637 bytes .../img/sqlg/tinkerpop-classic-graph.xcf | Bin 0 -> 109386 bytes .../docs/2.1.4/img/sqlg/tinkerpop-classic.png | Bin 0 -> 5645 bytes .../2.1.4/img/sqlg/tinkerpop-classic1.dia | Bin 0 -> 1211 bytes .../2.1.4/img/sqlg/tinkerpop-classic1.png | Bin 0 -> 4382 bytes .../2.1.4/img/sqlg/tinkerpop-classic2-er.png | Bin 0 -> 4452 bytes .../2.1.4/img/sqlg/tinkerpop-classic2.dia | Bin 0 -> 1262 bytes .../2.1.4/img/sqlg/tinkerpop-modern-er.png | Bin 0 -> 39619 bytes .../2.1.4/img/sqlg/tinkerpop-modern-graph.png | Bin 0 -> 58732 bytes sqlg-doc/docs/2.1.4/img/sqlg/vertices.png | Bin 0 -> 19343 bytes .../2.1.4/img/uml/topology Class Diagram.png | Bin 0 -> 163990 bytes .../2.1.4/img/uml/topology Class Diagram.svg | 469 + sqlg-doc/docs/2.1.4/include/architecture.adoc | 127 + sqlg-doc/docs/2.1.4/include/batchMode.adoc | 257 + sqlg-doc/docs/2.1.4/include/dataTypes.adoc | 261 + .../docs/2.1.4/include/gettingStarted.adoc | 190 + .../2.1.4/include/gremlin/predicates.adoc | 199 + .../include/gremlin/strategy1/andStep.adoc | 82 + .../include/gremlin/strategy1/chooseStep.adoc | 72 + .../include/gremlin/strategy1/dropStep.adoc | 172 + .../include/gremlin/strategy1/graphStep.adoc | 71 + .../include/gremlin/strategy1/hasStep.adoc | 146 + .../include/gremlin/strategy1/limitStep.adoc | 61 + .../include/gremlin/strategy1/notStep.adoc | 3 + .../gremlin/strategy1/optionalStep.adoc | 103 + .../include/gremlin/strategy1/orderStep.adoc | 66 + .../include/gremlin/strategy1/rangeStep.adoc | 61 + .../gremlin/strategy1/reducing/countStep.adoc | 41 + .../strategy1/reducing/groupByCountStep.adoc | 121 + .../strategy1/reducing/groupByJoinStep.adoc | 69 + .../strategy1/reducing/groupByMaxStep.adoc | 135 + .../strategy1/reducing/groupByMeanStep.adoc | 50 + .../strategy1/reducing/groupByMinStep.adoc | 50 + .../strategy1/reducing/groupBySumStep.adoc | 50 + .../gremlin/strategy1/reducing/maxStep.adoc | 42 + .../gremlin/strategy1/reducing/meanStep.adoc | 42 + .../gremlin/strategy1/reducing/minStep.adoc | 42 + .../gremlin/strategy1/reducing/sumStep.adoc | 42 + .../gremlin/strategy1/reducingSteps.adoc | 0 .../include/gremlin/strategy1/repeatStep.adoc | 166 + .../include/gremlin/strategy1/vertexStep.adoc | 58 + .../include/gremlin/strategy2/andStep.adoc | 80 + .../include/gremlin/strategy2/chooseStep.adoc | 54 + .../include/gremlin/strategy2/localStep.adoc | 104 + .../include/gremlin/strategy2/notStep.adoc | 63 + .../gremlin/strategy2/optionalStep.adoc | 99 + .../include/gremlin/strategy2/orStep.adoc | 100 + .../include/gremlin/strategy2/repeatStep.adoc | 177 + .../include/gremlin/strategy2/vertexStep.adoc | 78 + .../include/gremlin/strategy2/whereStep.adoc | 64 + sqlg-doc/docs/2.1.4/include/indexes.adoc | 159 + sqlg-doc/docs/2.1.4/include/introduction.adoc | 11 + sqlg-doc/docs/2.1.4/include/license.adoc | 3 + sqlg-doc/docs/2.1.4/include/limitations.adoc | 3 + sqlg-doc/docs/2.1.4/include/multipleJvm.adoc | 19 + .../2.1.4/include/postgresqlPartitioning.adoc | 170 + sqlg-doc/docs/2.1.4/include/sqlgui.adoc | 86 + .../docs/2.1.4/include/supportedFeatures.adoc | 56 + sqlg-doc/docs/2.1.4/include/topology.adoc | 331 + sqlg-doc/docs/2.1.4/index.html | 7794 +++++++++++++++++ sqlg-doc/docs/2.1.4/sqlg.adoc | 181 + sqlg-doc/docs/2.1.4/tocbot.min.js | 1 + sqlg-doc/docs/2.1.4/volnitsky.css | 435 + .../java/org/umlg/sqlg/doc/AsciiDoctor.java | 2 +- 95 files changed, 16047 insertions(+), 1 deletion(-) create mode 100644 sqlg-doc/docs/2.1.4/.gitignore create mode 100644 sqlg-doc/docs/2.1.4/asciidoctor-default.css create mode 100644 sqlg-doc/docs/2.1.4/flask.css create mode 100644 sqlg-doc/docs/2.1.4/img/bullet.png create mode 100644 sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-32px.png create mode 100644 sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-Light-32px.png create mode 100644 sqlg-doc/docs/2.1.4/img/github/SVG/law.svg create mode 100644 sqlg-doc/docs/2.1.4/img/github/SVG/mark-github.svg create mode 100644 sqlg-doc/docs/2.1.4/img/hr.gif create mode 100644 sqlg-doc/docs/2.1.4/img/nav-bg.gif create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/E_created.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/E_knows.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/V_Person_name_index.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/V_person.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/V_software.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/bulkAddEdgesMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/continent.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/edges.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/fleet.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/normalBatchModeMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/postgresql_composite_index.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/public.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/schemas.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/sqlg_topology.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/sqlg_topology_uml.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamBatchModeBulkEdgeMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamWithLockAndEdgeCreationMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamingBatchModeMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamingBatchModeWithLockMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamingWithLockBatchModeAndEdgesMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/streamingWithLockBatchModeMemory.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tableDefinition.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic-graph.xcf create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.dia create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2-er.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2.dia create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-modern-er.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-modern-graph.png create mode 100644 sqlg-doc/docs/2.1.4/img/sqlg/vertices.png create mode 100644 sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.png create mode 100644 sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.svg create mode 100644 sqlg-doc/docs/2.1.4/include/architecture.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/batchMode.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/dataTypes.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gettingStarted.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/predicates.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/andStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/chooseStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/dropStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/graphStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/hasStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/limitStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/notStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/optionalStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/orderStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/rangeStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/countStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByCountStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByJoinStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMaxStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMeanStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMinStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupBySumStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/maxStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/meanStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/minStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/sumStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducingSteps.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/repeatStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy1/vertexStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/andStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/chooseStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/localStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/notStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/optionalStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/orStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/repeatStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/vertexStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/gremlin/strategy2/whereStep.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/indexes.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/introduction.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/license.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/limitations.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/multipleJvm.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/postgresqlPartitioning.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/sqlgui.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/supportedFeatures.adoc create mode 100644 sqlg-doc/docs/2.1.4/include/topology.adoc create mode 100644 sqlg-doc/docs/2.1.4/index.html create mode 100644 sqlg-doc/docs/2.1.4/sqlg.adoc create mode 100644 sqlg-doc/docs/2.1.4/tocbot.min.js create mode 100644 sqlg-doc/docs/2.1.4/volnitsky.css diff --git a/sqlg-doc/docs/2.1.4/.gitignore b/sqlg-doc/docs/2.1.4/.gitignore new file mode 100644 index 000000000..999ea03b0 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/.gitignore @@ -0,0 +1 @@ +apidocs/ diff --git a/sqlg-doc/docs/2.1.4/asciidoctor-default.css b/sqlg-doc/docs/2.1.4/asciidoctor-default.css new file mode 100644 index 000000000..4f0ba722c --- /dev/null +++ b/sqlg-doc/docs/2.1.4/asciidoctor-default.css @@ -0,0 +1,2119 @@ +/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment @import statement to use as custom stylesheet */ +/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block +} + +audio, video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100% +} + +a { + background: none +} + +a:focus { + outline: thin dotted +} + +a:active, a:hover { + outline: 0 +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, strong { + font-weight: bold +} + +dfn { + font-style: italic +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +mark { + background: #ff0; + color: #000 +} + +code, kbd, pre, samp { + font-family: monospace; + font-size: 1em +} + +pre { + white-space: pre-wrap +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019" +} + +small { + font-size: 80% +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +figure { + margin: 0 +} + +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: .35em .625em .75em +} + +legend { + border: 0; + padding: 0 +} + +button, input, select, textarea { + font-family: inherit; + font-size: 100%; + margin: 0 +} + +button, input { + line-height: normal +} + +button, select { + text-transform: none +} + +button, html input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer +} + +button[disabled], html input[disabled] { + cursor: default +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0 +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +*, *::before, *::after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +html, body { + font-size: 100% +} + +body { + background: #fff; + color: rgba(0, 0, 0, .8); + padding: 0; + margin: 0; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-weight: 400; + font-style: normal; + line-height: 1; + position: relative; + cursor: auto; + tab-size: 4; + word-wrap: anywhere; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased +} + +a:hover { + cursor: pointer +} + +img, object, embed { + max-width: 100%; + height: auto +} + +object, embed { + height: 100% +} + +img { + -ms-interpolation-mode: bicubic +} + +.left { + float: left !important +} + +.right { + float: right !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-justify { + text-align: justify !important +} + +.hide { + display: none +} + +img, object, svg { + display: inline-block; + vertical-align: middle +} + +textarea { + height: auto; + min-height: 50px +} + +select { + width: 100% +} + +.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + line-height: 1.45; + color: #7a2518; + font-weight: 400; + margin-top: 0; + margin-bottom: .25em +} + +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { + margin: 0; + padding: 0 +} + +a { + color: #2156a5; + text-decoration: underline; + line-height: inherit +} + +a:hover, a:focus { + color: #1d4b8f +} + +a img { + border: 0 +} + +p { + font-family: inherit; + font-weight: 400; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility +} + +p aside { + font-size: .875em; + line-height: 1.35; + font-style: italic +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-weight: 300; + font-style: normal; + color: #ba3925; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: .5em; + line-height: 1.0125em +} + +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #e99b8f; + line-height: 0 +} + +h1 { + font-size: 2.125em +} + +h2 { + font-size: 1.6875em +} + +h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.375em +} + +h4, h5 { + font-size: 1.125em +} + +h6 { + font-size: 1em +} + +hr { + border: solid #dddddf; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0 +} + +em, i { + font-style: italic; + line-height: inherit +} + +strong, b { + font-weight: bold; + line-height: inherit +} + +small { + font-size: 60%; + line-height: inherit +} + +code { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + font-weight: 400; + color: rgba(0, 0, 0, .9) +} + +ul, ol, dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit +} + +ul, ol { + margin-left: 1.5em +} + +ul li ul, ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit +} + +ul.square { + list-style-type: square +} + +ul.circle { + list-style-type: circle +} + +ul.disc { + list-style-type: disc +} + +ol li ul, ol li ol { + margin-left: 1.25em; + margin-bottom: 0 +} + +dl dt { + margin-bottom: .3125em; + font-weight: bold +} + +dl dd { + margin-bottom: 1.25em +} + +abbr, acronym { + text-transform: uppercase; + font-size: 90%; + color: rgba(0, 0, 0, .8); + border-bottom: 1px dotted #ddd; + cursor: help +} + +abbr { + text-transform: none +} + +blockquote { + margin: 0 0 1.25em; + padding: .5625em 1.25em 0 1.1875em; + border-left: 1px solid #ddd +} + +blockquote, blockquote p { + line-height: 1.6; + color: rgba(0, 0, 0, .85) +} + +@media screen and (min-width: 768px) { + h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.2 + } + + h1 { + font-size: 2.75em + } + + h2 { + font-size: 2.3125em + } + + h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.6875em + } + + h4 { + font-size: 1.4375em + } +} + +table { + background: #fff; + margin-bottom: 1.25em; + border: solid 1px #dedede; + word-wrap: normal +} + +table thead, table tfoot { + background: #f7f8f7 +} + +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { + padding: .5em .625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8); + text-align: left +} + +table tr th, table tr td { + padding: .5625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8) +} + +table tr.even, table tr.alt { + background: #f8f8f7 +} + +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { + line-height: 1.6 +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.2; + word-spacing: -.05em +} + +h1 strong, h2 strong, h3 strong, #toctitle strong, .sidebarblock > .content > .title strong, h4 strong, h5 strong, h6 strong { + font-weight: 400 +} + +.center { + margin-left: auto; + margin-right: auto +} + +.stretch { + width: 100% +} + +.clearfix::before, .clearfix::after, .float-group::before, .float-group::after { + content: " "; + display: table +} + +.clearfix::after, .float-group::after { + clear: both +} + +:not(pre).nobreak { + word-wrap: normal +} + +:not(pre).nowrap { + white-space: nowrap +} + +:not(pre).pre-wrap { + white-space: pre-wrap +} + +:not(pre):not([class^=L]) > code { + font-size: .9375em; + font-style: normal !important; + letter-spacing: 0; + padding: .1em .5ex; + word-spacing: -.15em; + background: #f7f7f8; + -webkit-border-radius: 4px; + border-radius: 4px; + line-height: 1.45; + text-rendering: optimizeSpeed +} + +pre { + color: rgba(0, 0, 0, .9); + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + line-height: 1.45; + text-rendering: optimizeSpeed +} + +pre code, pre pre { + color: inherit; + font-size: inherit; + line-height: inherit +} + +pre > code { + display: block +} + +pre.nowrap, pre.nowrap pre { + white-space: pre; + word-wrap: normal +} + +em em { + font-style: normal +} + +strong strong { + font-weight: 400 +} + +.keyseq { + color: rgba(51, 51, 51, .8) +} + +kbd { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + display: inline-block; + color: rgba(0, 0, 0, .8); + font-size: .65em; + line-height: 1.45; + background: #f7f7f7; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset; + margin: 0 .15em; + padding: .2em .5em; + vertical-align: middle; + position: relative; + top: -.1em; + white-space: nowrap +} + +.keyseq kbd:first-child { + margin-left: 0 +} + +.keyseq kbd:last-child { + margin-right: 0 +} + +.menuseq, .menuref { + color: #000 +} + +.menuseq b:not(.caret), .menuref { + font-weight: inherit +} + +.menuseq { + word-spacing: -.02em +} + +.menuseq b.caret { + font-size: 1.25em; + line-height: .8 +} + +.menuseq i.caret { + font-weight: bold; + text-align: center; + width: .45em +} + +b.button::before, b.button::after { + position: relative; + top: -1px; + font-weight: 400 +} + +b.button::before { + content: "["; + padding: 0 3px 0 2px +} + +b.button::after { + content: "]"; + padding: 0 2px 0 3px +} + +p a > code:hover { + color: rgba(0, 0, 0, .9) +} + +#header, #content, #footnotes, #footer { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; + position: relative; + padding-left: .9375em; + padding-right: .9375em +} + +#header::before, #header::after, #content::before, #content::after, #footnotes::before, #footnotes::after, #footer::before, #footer::after { + content: " "; + display: table +} + +#header::after, #content::after, #footnotes::after, #footer::after { + clear: both +} + +#content { + margin-top: 1.25em +} + +#content::before { + content: none +} + +#header > h1:first-child { + color: rgba(0, 0, 0, .85); + margin-top: 2.25rem; + margin-bottom: 0 +} + +#header > h1:first-child + #toc { + margin-top: 8px; + border-top: 1px solid #dddddf +} + +#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { + border-bottom: 1px solid #dddddf; + padding-bottom: 8px +} + +#header .details { + border-bottom: 1px solid #dddddf; + line-height: 1.45; + padding-top: .25em; + padding-bottom: .25em; + padding-left: .25em; + color: rgba(0, 0, 0, .6); + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap +} + +#header .details span:first-child { + margin-left: -.125em +} + +#header .details span.email a { + color: rgba(0, 0, 0, .85) +} + +#header .details br { + display: none +} + +#header .details br + span::before { + content: "\00a0\2013\00a0" +} + +#header .details br + span.author::before { + content: "\00a0\22c5\00a0"; + color: rgba(0, 0, 0, .85) +} + +#header .details br + span#revremark::before { + content: "\00a0|\00a0" +} + +#header #revnumber { + text-transform: capitalize +} + +#header #revnumber::after { + content: "\00a0" +} + +#content > h1:first-child:not([class]) { + color: rgba(0, 0, 0, .85); + border-bottom: 1px solid #dddddf; + padding-bottom: 8px; + margin-top: 0; + padding-top: 1rem; + margin-bottom: 1.25rem +} + +#toc { + border-bottom: 1px solid #e7e7e9; + padding-bottom: .5em +} + +#toc > ul { + margin-left: .125em +} + +#toc ul.sectlevel0 > li > a { + font-style: italic +} + +#toc ul.sectlevel0 ul.sectlevel1 { + margin: .5em 0 +} + +#toc ul { + font-family: "Open Sans", "DejaVu Sans", sans-serif; + list-style-type: none +} + +#toc li { + line-height: 1.3334; + margin-top: .3334em; + list-style: none; +} + +#toc a { + text-decoration: none +} + +#toc a:active { + text-decoration: underline +} + +#toctitle { + color: #7a2518; + font-size: 1.2em +} + +@media screen and (min-width: 768px) { + #toctitle { + font-size: 1.375em + } + + body.toc2 { + padding-left: 15em; + padding-right: 0 + } + + #toc.toc2 { + margin-top: 0 !important; + background: #f8f8f7; + position: fixed; + width: 15em; + left: 0; + top: 0; + border-right: 1px solid #e7e7e9; + border-top-width: 0 !important; + border-bottom-width: 0 !important; + z-index: 1000; + padding: 1.25em 1em; + height: 100%; + overflow: auto + } + + #toc.toc2 #toctitle { + margin-top: 0; + margin-bottom: .8rem; + font-size: 1.2em + } + + #toc.toc2 > ul { + font-size: .9em; + margin-bottom: 0 + } + + #toc.toc2 ul ul { + margin-left: 0; + padding-left: 1em + } + + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { + padding-left: 0; + margin-top: .5em; + margin-bottom: .5em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 15em + } + + body.toc2.toc-right #toc.toc2 { + border-right-width: 0; + border-left: 1px solid #e7e7e9; + left: auto; + right: 0 + } +} + +@media screen and (min-width: 1280px) { + body.toc2 { + padding-left: 20em; + padding-right: 0 + } + + #toc.toc2 { + width: 20em + } + + #toc.toc2 #toctitle { + font-size: 1.375em + } + + #toc.toc2 > ul { + font-size: .95em + } + + #toc.toc2 ul ul { + padding-left: 1.25em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 20em + } +} + +#content #toc { + border-style: solid; + border-width: 1px; + border-color: #e0e0dc; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px +} + +#content #toc > :first-child { + margin-top: 0 +} + +#content #toc > :last-child { + margin-bottom: 0 +} + +#footer { + max-width: none; + background: rgba(0, 0, 0, .8); + padding: 1.25em +} + +#footer-text { + color: rgba(255, 255, 255, .8); + line-height: 1.44 +} + +#content { + margin-bottom: .625em +} + +.sect1 { + padding-bottom: .625em +} + +@media screen and (min-width: 768px) { + #content { + margin-bottom: 1.25em + } + + .sect1 { + padding-bottom: 1.25em + } +} + +.sect1:last-child { + padding-bottom: 0 +} + +.sect1 + .sect1 { + border-top: 1px solid #e7e7e9 +} + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { + position: absolute; + z-index: 1001; + width: 1.5ex; + margin-left: -1.5ex; + display: block; + text-decoration: none !important; + visibility: hidden; + text-align: center; + font-weight: 400 +} + +#content h1 > a.anchor::before, h2 > a.anchor::before, h3 > a.anchor::before, #toctitle > a.anchor::before, .sidebarblock > .content > .title > a.anchor::before, h4 > a.anchor::before, h5 > a.anchor::before, h6 > a.anchor::before { + content: "\00A7"; + font-size: .85em; + display: block; + padding-top: .1em +} + +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { + visibility: visible +} + +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { + color: #ba3925; + text-decoration: none +} + +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { + color: #a53221 +} + +details, .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { + margin-bottom: 1.25em +} + +details > summary:first-of-type { + cursor: pointer; + display: list-item; + outline: none; + margin-bottom: .75em +} + +.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + text-rendering: optimizeLegibility; + text-align: left; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-size: 1rem; + font-style: italic +} + +table.tableblock.fit-content > caption.title { + white-space: nowrap; + width: 0 +} + +.paragraph.lead > p, #preamble > .sectionbody > [class="paragraph"]:first-of-type p { + font-size: 1.21875em; + line-height: 1.6; + color: rgba(0, 0, 0, .85) +} + +table.tableblock #preamble > .sectionbody > [class="paragraph"]:first-of-type p { + font-size: inherit +} + +.admonitionblock > table { + border-collapse: separate; + border: 0; + background: none; + width: 100% +} + +.admonitionblock > table td.icon { + text-align: center; + width: 80px +} + +.admonitionblock > table td.icon img { + max-width: none +} + +.admonitionblock > table td.icon .title { + font-weight: bold; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + text-transform: uppercase +} + +.admonitionblock > table td.content { + padding-left: 1.125em; + padding-right: 1.25em; + border-left: 1px solid #dddddf; + color: rgba(0, 0, 0, .6); + word-wrap: anywhere +} + +.admonitionblock > table td.content > :last-child > :last-child { + margin-bottom: 0 +} + +.exampleblock > .content { + border-style: solid; + border-width: 1px; + border-color: #e6e6e6; + margin-bottom: 1.25em; + padding: 1.25em; + background: #fff; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.exampleblock > .content > :first-child { + margin-top: 0 +} + +.exampleblock > .content > :last-child { + margin-bottom: 0 +} + +.sidebarblock { + border-style: solid; + border-width: 1px; + border-color: #dbdbd6; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f3f3f2; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.sidebarblock > :first-child { + margin-top: 0 +} + +.sidebarblock > :last-child { + margin-bottom: 0 +} + +.sidebarblock > .content > .title { + color: #7a2518; + margin-top: 0; + text-align: center +} + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { + margin-bottom: 0 +} + +.literalblock pre, .listingblock > .content > pre { + -webkit-border-radius: 4px; + border-radius: 4px; + overflow-x: auto; + padding: 1em; + font-size: .8125em +} + +@media screen and (min-width: 768px) { + .literalblock pre, .listingblock > .content > pre { + font-size: .90625em + } +} + +@media screen and (min-width: 1280px) { + .literalblock pre, .listingblock > .content > pre { + font-size: 1em + } +} + +.literalblock pre, .listingblock > .content > pre:not(.highlight), .listingblock > .content > pre[class="highlight"], .listingblock > .content > pre[class^="highlight "] { + background: #f7f7f8 +} + +.literalblock.output pre { + color: #f7f7f8; + background: rgba(0, 0, 0, .9) +} + +.listingblock > .content { + position: relative +} + +.listingblock code[data-lang]::before { + display: none; + content: attr(data-lang); + position: absolute; + font-size: .75em; + top: .425rem; + right: .5rem; + line-height: 1; + text-transform: uppercase; + color: inherit; + opacity: .5 +} + +.listingblock:hover code[data-lang]::before { + display: block +} + +.listingblock.terminal pre .command::before { + content: attr(data-prompt); + padding-right: .5em; + color: inherit; + opacity: .5 +} + +.listingblock.terminal pre .command:not([data-prompt])::before { + content: "$" +} + +.listingblock pre.highlightjs { + padding: 0 +} + +.listingblock pre.highlightjs > code { + padding: 1em; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.listingblock pre.prettyprint { + border-width: 0 +} + +.prettyprint { + background: #f7f7f8 +} + +pre.prettyprint .linenums { + line-height: 1.45; + margin-left: 2em +} + +pre.prettyprint li { + background: none; + list-style-type: inherit; + padding-left: 0 +} + +pre.prettyprint li code[data-lang]::before { + opacity: 1 +} + +pre.prettyprint li:not(:first-child) code[data-lang]::before { + display: none +} + +table.linenotable { + border-collapse: separate; + border: 0; + margin-bottom: 0; + background: none +} + +table.linenotable td[class] { + color: inherit; + vertical-align: top; + padding: 0; + line-height: inherit; + white-space: normal +} + +table.linenotable td.code { + padding-left: .75em +} + +table.linenotable td.linenos { + border-right: 1px solid currentColor; + opacity: .35; + padding-right: .5em +} + +pre.pygments .lineno { + border-right: 1px solid currentColor; + opacity: .35; + display: inline-block; + margin-right: .75em +} + +pre.pygments .lineno::before { + content: ""; + margin-right: -.125em +} + +.quoteblock { + margin: 0 1em 1.25em 1.5em; + display: table +} + +.quoteblock:not(.excerpt) > .title { + margin-left: -1.5em; + margin-bottom: .75em +} + +.quoteblock blockquote, .quoteblock p { + color: rgba(0, 0, 0, .85); + font-size: 1.15rem; + line-height: 1.75; + word-spacing: .1em; + letter-spacing: 0; + font-style: italic; + text-align: justify +} + +.quoteblock blockquote { + margin: 0; + padding: 0; + border: 0 +} + +.quoteblock blockquote::before { + content: "\201c"; + float: left; + font-size: 2.75em; + font-weight: bold; + line-height: .6em; + margin-left: -.6em; + color: #7a2518; + text-shadow: 0 1px 2px rgba(0, 0, 0, .1) +} + +.quoteblock blockquote > .paragraph:last-child p { + margin-bottom: 0 +} + +.quoteblock .attribution { + margin-top: .75em; + margin-right: .5ex; + text-align: right +} + +.verseblock { + margin: 0 1em 1.25em +} + +.verseblock pre { + font-family: "Open Sans", "DejaVu Sans", sans; + font-size: 1.15rem; + color: rgba(0, 0, 0, .85); + font-weight: 300; + text-rendering: optimizeLegibility +} + +.verseblock pre strong { + font-weight: 400 +} + +.verseblock .attribution { + margin-top: 1.25rem; + margin-left: .5ex +} + +.quoteblock .attribution, .verseblock .attribution { + font-size: .9375em; + line-height: 1.45; + font-style: italic +} + +.quoteblock .attribution br, .verseblock .attribution br { + display: none +} + +.quoteblock .attribution cite, .verseblock .attribution cite { + display: block; + letter-spacing: -.025em; + color: rgba(0, 0, 0, .6) +} + +.quoteblock.abstract blockquote::before, .quoteblock.excerpt blockquote::before, .quoteblock .quoteblock blockquote::before { + display: none +} + +.quoteblock.abstract blockquote, .quoteblock.abstract p, .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { + line-height: 1.6; + word-spacing: 0 +} + +.quoteblock.abstract { + margin: 0 1em 1.25em; + display: block +} + +.quoteblock.abstract > .title { + margin: 0 0 .375em; + font-size: 1.15em; + text-align: center +} + +.quoteblock.excerpt > blockquote, .quoteblock .quoteblock { + padding: 0 0 .25em 1em; + border-left: .25em solid #dddddf +} + +.quoteblock.excerpt, .quoteblock .quoteblock { + margin-left: 0 +} + +.quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { + color: inherit; + font-size: 1.0625rem +} + +.quoteblock.excerpt .attribution, .quoteblock .quoteblock .attribution { + color: inherit; + font-size: .85rem; + text-align: left; + margin-right: 0 +} + +p.tableblock:last-child { + margin-bottom: 0 +} + +td.tableblock > .content { + margin-bottom: 1.25em; + word-wrap: anywhere +} + +td.tableblock > .content > :last-child { + margin-bottom: -1.25em +} + +table.tableblock, th.tableblock, td.tableblock { + border: 0 solid #dedede +} + +table.grid-all > * > tr > * { + border-width: 1px +} + +table.grid-cols > * > tr > * { + border-width: 0 1px +} + +table.grid-rows > * > tr > * { + border-width: 1px 0 +} + +table.frame-all { + border-width: 1px +} + +table.frame-ends { + border-width: 1px 0 +} + +table.frame-sides { + border-width: 0 1px +} + +table.frame-none > colgroup + * > :first-child > *, table.frame-sides > colgroup + * > :first-child > * { + border-top-width: 0 +} + +table.frame-none > :last-child > :last-child > *, table.frame-sides > :last-child > :last-child > * { + border-bottom-width: 0 +} + +table.frame-none > * > tr > :first-child, table.frame-ends > * > tr > :first-child { + border-left-width: 0 +} + +table.frame-none > * > tr > :last-child, table.frame-ends > * > tr > :last-child { + border-right-width: 0 +} + +table.stripes-all tr, table.stripes-odd tr:nth-of-type(odd), table.stripes-even tr:nth-of-type(even), table.stripes-hover tr:hover { + background: #f8f8f7 +} + +th.halign-left, td.halign-left { + text-align: left +} + +th.halign-right, td.halign-right { + text-align: right +} + +th.halign-center, td.halign-center { + text-align: center +} + +th.valign-top, td.valign-top { + vertical-align: top +} + +th.valign-bottom, td.valign-bottom { + vertical-align: bottom +} + +th.valign-middle, td.valign-middle { + vertical-align: middle +} + +table thead th, table tfoot th { + font-weight: bold +} + +tbody tr th { + background: #f7f8f7 +} + +tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { + color: rgba(0, 0, 0, .8); + font-weight: bold +} + +p.tableblock > code:only-child { + background: none; + padding: 0 +} + +p.tableblock { + font-size: 1em +} + +ol { + margin-left: 1.75em +} + +ul li ol { + margin-left: 1.5em +} + +dl dd { + margin-left: 1.125em +} + +dl dd:last-child, dl dd:last-child > :last-child { + margin-bottom: 0 +} + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { + margin-bottom: .625em +} + +ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { + list-style-type: none +} + +ul.no-bullet, ol.no-bullet, ol.unnumbered { + margin-left: .625em +} + +ul.unstyled, ol.unstyled { + margin-left: 0 +} + +ul.checklist { + margin-left: .625em +} + +ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { + width: 1.25em; + font-size: .8em; + position: relative; + bottom: .125em +} + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + margin-right: .25em +} + +ul.inline { + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap; + list-style: none; + margin: 0 0 .625em -1.25em +} + +ul.inline > li { + margin-left: 1.25em +} + +.unstyled dl dt { + font-weight: 400; + font-style: normal +} + +ol.arabic { + list-style-type: decimal +} + +ol.decimal { + list-style-type: decimal-leading-zero +} + +ol.loweralpha { + list-style-type: lower-alpha +} + +ol.upperalpha { + list-style-type: upper-alpha +} + +ol.lowerroman { + list-style-type: lower-roman +} + +ol.upperroman { + list-style-type: upper-roman +} + +ol.lowergreek { + list-style-type: lower-greek +} + +.hdlist > table, .colist > table { + border: 0; + background: none +} + +.hdlist > table > tbody > tr, .colist > table > tbody > tr { + background: none +} + +td.hdlist1, td.hdlist2 { + vertical-align: top; + padding: 0 .625em +} + +td.hdlist1 { + font-weight: bold; + padding-bottom: 1.25em +} + +td.hdlist2 { + word-wrap: anywhere +} + +.literalblock + .colist, .listingblock + .colist { + margin-top: -.5em +} + +.colist td:not([class]):first-child { + padding: .4em .75em 0; + line-height: 1; + vertical-align: top +} + +.colist td:not([class]):first-child img { + max-width: none +} + +.colist td:not([class]):last-child { + padding: .25em 0 +} + +.thumb, .th { + line-height: 0; + display: inline-block; + border: solid 4px #fff; + -webkit-box-shadow: 0 0 0 1px #ddd; + box-shadow: 0 0 0 1px #ddd +} + +.imageblock.left { + margin: .25em .625em 1.25em 0 +} + +.imageblock.right { + margin: .25em 0 1.25em .625em +} + +.imageblock > .title { + margin-bottom: 0 +} + +.imageblock.thumb, .imageblock.th { + border-width: 6px +} + +.imageblock.thumb > .title, .imageblock.th > .title { + padding: 0 .125em +} + +.image.left, .image.right { + margin-top: .25em; + margin-bottom: .25em; + display: inline-block; + line-height: 0 +} + +.image.left { + margin-right: .625em +} + +.image.right { + margin-left: .625em +} + +a.image { + text-decoration: none; + display: inline-block +} + +a.image object { + pointer-events: none +} + +sup.footnote, sup.footnoteref { + font-size: .875em; + position: static; + vertical-align: super +} + +sup.footnote a, sup.footnoteref a { + text-decoration: none +} + +sup.footnote a:active, sup.footnoteref a:active { + text-decoration: underline +} + +#footnotes { + padding-top: .75em; + padding-bottom: .75em; + margin-bottom: .625em +} + +#footnotes hr { + width: 20%; + min-width: 6.25em; + margin: -.25em 0 .75em; + border-width: 1px 0 0 +} + +#footnotes .footnote { + padding: 0 .375em 0 .225em; + line-height: 1.3334; + font-size: .875em; + margin-left: 1.2em; + margin-bottom: .2em +} + +#footnotes .footnote a:first-of-type { + font-weight: bold; + text-decoration: none; + margin-left: -1.05em +} + +#footnotes .footnote:last-of-type { + margin-bottom: 0 +} + +#content #footnotes { + margin-top: -.625em; + margin-bottom: 0; + padding: .75em 0 +} + +.gist .file-data > table { + border: 0; + background: #fff; + width: 100%; + margin-bottom: 0 +} + +.gist .file-data > table td.line-data { + width: 99% +} + +div.unbreakable { + page-break-inside: avoid +} + +.big { + font-size: larger +} + +.small { + font-size: smaller +} + +.underline { + text-decoration: underline +} + +.overline { + text-decoration: overline +} + +.line-through { + text-decoration: line-through +} + +.aqua { + color: #00bfbf +} + +.aqua-background { + background: #00fafa +} + +.black { + color: #000 +} + +.black-background { + background: #000 +} + +.blue { + color: #0000bf +} + +.blue-background { + background: #0000fa +} + +.fuchsia { + color: #bf00bf +} + +.fuchsia-background { + background: #fa00fa +} + +.gray { + color: #606060 +} + +.gray-background { + background: #7d7d7d +} + +.green { + color: #006000 +} + +.green-background { + background: #007d00 +} + +.lime { + color: #00bf00 +} + +.lime-background { + background: #00fa00 +} + +.maroon { + color: #600000 +} + +.maroon-background { + background: #7d0000 +} + +.navy { + color: #000060 +} + +.navy-background { + background: #00007d +} + +.olive { + color: #606000 +} + +.olive-background { + background: #7d7d00 +} + +.purple { + color: #600060 +} + +.purple-background { + background: #7d007d +} + +.red { + color: #bf0000 +} + +.red-background { + background: #fa0000 +} + +.silver { + color: #909090 +} + +.silver-background { + background: #bcbcbc +} + +.teal { + color: #006060 +} + +.teal-background { + background: #007d7d +} + +.white { + color: #bfbfbf +} + +.white-background { + background: #fafafa +} + +.yellow { + color: #bfbf00 +} + +.yellow-background { + background: #fafa00 +} + +span.icon > .fa { + cursor: default +} + +a span.icon > .fa { + cursor: inherit +} + +.admonitionblock td.icon [class^="fa icon-"] { + font-size: 2.5em; + text-shadow: 1px 1px 2px rgba(0, 0, 0, .5); + cursor: default +} + +.admonitionblock td.icon .icon-note::before { + content: "\f05a"; + color: #19407c +} + +.admonitionblock td.icon .icon-tip::before { + content: "\f0eb"; + text-shadow: 1px 1px 2px rgba(155, 155, 0, .8); + color: #111 +} + +.admonitionblock td.icon .icon-warning::before { + content: "\f071"; + color: #bf6900 +} + +.admonitionblock td.icon .icon-caution::before { + content: "\f06d"; + color: #bf3400 +} + +.admonitionblock td.icon .icon-important::before { + content: "\f06a"; + color: #bf0000 +} + +.conum[data-value] { + display: inline-block; + color: #fff !important; + background: rgba(0, 0, 0, .8); + -webkit-border-radius: 50%; + border-radius: 50%; + text-align: center; + font-size: .75em; + width: 1.67em; + height: 1.67em; + line-height: 1.67em; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-style: normal; + font-weight: bold +} + +.conum[data-value] * { + color: #fff !important +} + +.conum[data-value] + b { + display: none +} + +.conum[data-value]::after { + content: attr(data-value) +} + +pre .conum[data-value] { + position: relative; + top: -.125em +} + +b.conum * { + color: inherit !important +} + +.conum:not([data-value]):empty { + display: none +} + +dt, th.tableblock, td.content, div.footnote { + text-rendering: optimizeLegibility +} + +h1, h2, p, td.content, span.alt { + letter-spacing: -.01em +} + +p strong, td.content strong, div.footnote strong { + letter-spacing: -.005em +} + +p, blockquote, dt, td.content, span.alt { + font-size: 1.0625rem +} + +p { + margin-bottom: 1.25rem +} + +.sidebarblock p, .sidebarblock dt, .sidebarblock td.content, p.tableblock { + font-size: 1em +} + +.exampleblock > .content { + background: #fffef7; + border-color: #e0e0dc; + -webkit-box-shadow: 0 1px 4px #e0e0dc; + box-shadow: 0 1px 4px #e0e0dc +} + +.print-only { + display: none !important +} + +@page { + margin: 1.25cm .75cm +} + +@media print { + * { + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important + } + + html { + font-size: 80% + } + + a { + color: inherit !important; + text-decoration: underline !important + } + + a.bare, a[href^="#"], a[href^="mailto:"] { + text-decoration: none !important + } + + a[href^="http:"]:not(.bare)::after, a[href^="https:"]:not(.bare)::after { + content: "(" attr(href) ")"; + display: inline-block; + font-size: .875em; + padding-left: .25em + } + + abbr[title]::after { + content: " (" attr(title) ")" + } + + pre, blockquote, tr, img, object, svg { + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + svg { + max-width: 100% + } + + p, blockquote, dt, td.content { + font-size: 1em; + orphans: 3; + widows: 3 + } + + h2, h3, #toctitle, .sidebarblock > .content > .title { + page-break-after: avoid + } + + #header, #content, #footnotes, #footer { + max-width: none + } + + #toc, .sidebarblock, .exampleblock > .content { + background: none !important + } + + #toc { + border-bottom: 1px solid #dddddf !important; + padding-bottom: 0 !important + } + + body.book #header { + text-align: center + } + + body.book #header > h1:first-child { + border: 0 !important; + margin: 2.5em 0 1em + } + + body.book #header .details { + border: 0 !important; + display: block; + padding: 0 !important + } + + body.book #header .details span:first-child { + margin-left: 0 !important + } + + body.book #header .details br { + display: block + } + + body.book #header .details br + span::before { + content: none !important + } + + body.book #toc { + border: 0 !important; + text-align: left !important; + padding: 0 !important; + margin: 0 !important + } + + body.book #toc, body.book #preamble, body.book h1.sect0, body.book .sect1 > h2 { + page-break-before: always + } + + .listingblock code[data-lang]::before { + display: block + } + + #footer { + padding: 0 .9375em + } + + .hide-on-print { + display: none !important + } + + .print-only { + display: block !important + } + + .hide-for-print { + display: none !important + } + + .show-for-print { + display: inherit !important + } +} + +@media print, amzn-kf8 { + #header > h1:first-child { + margin-top: 1.25rem + } + + .sect1 { + padding: 0 !important + } + + .sect1 + .sect1 { + border: 0 + } + + #footer { + background: none + } + + #footer-text { + color: rgba(0, 0, 0, .6); + font-size: .9em + } +} + +@media amzn-kf8 { + #header, #content, #footnotes, #footer { + padding: 0 + } +} \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/flask.css b/sqlg-doc/docs/2.1.4/flask.css new file mode 100644 index 000000000..03abe3b46 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/flask.css @@ -0,0 +1,597 @@ +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ + +/* Default font. */ +body { + font-family: Georgia,serif; +} + +/* Title font. */ +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Arial,Helvetica,sans-serif; +} + +body { + margin: 1em 5% 1em 5%; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: fuchsia; +} + +em { + font-style: italic; + color: navy; +} + +strong { + font-weight: bold; + color: #083194; +} + +h1, h2, h3, h4, h5, h6 { + color: #527bbd; + margin-top: 1.2em; + margin-bottom: 0.5em; + line-height: 1.3; +} + +h1, h2, h3 { + border-bottom: 2px solid silver; +} +h2 { + padding-top: 0.5em; +} +h3 { + float: left; +} +h3 + * { + clear: left; +} +h5 { + font-size: 1.0em; +} + +div.sectionbody { + margin-left: 0; +} + +hr { + border: 1px solid silver; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} +ul > li { color: #aaa; } +ul > li > * { color: black; } + +pre { + padding: 0; + margin: 0; +} + +#author { + color: #527bbd; + font-weight: bold; + font-size: 1.1em; +} +#email { +} +#revnumber, #revdate, #revremark { +} + +#footer { + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} +#footer-text { + float: left; + padding-bottom: 0.5em; +} +#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +#preamble { + margin-top: 1.5em; + margin-bottom: 1.5em; +} +div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.admonitionblock { + margin-top: 2.0em; + margin-bottom: 2.0em; + margin-right: 10%; + color: #606060; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + color: #527bbd; + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + background: #ffffee; + border: 1px solid #dddddd; + border-left: 4px solid #f0f0f0; + padding: 0.5em; +} + +div.listingblock > div.content { + border: 1px solid #dddddd; + border-left: 5px solid #f0f0f0; + background: #f8f8f8; + padding: 0.5em; +} + +div.quoteblock, div.verseblock { + padding-left: 1.0em; + margin-left: 1.0em; + margin-right: 10%; + border-left: 5px solid #f0f0f0; + color: #777777; +} + +div.quoteblock > div.attribution { + padding-top: 0.5em; + text-align: right; +} + +div.verseblock > pre.content { + font-family: inherit; + font-size: inherit; +} +div.verseblock > div.attribution { + padding-top: 0.75em; + text-align: left; +} +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #527bbd; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 3px solid #dddddd; +} + +div.exampleblock > div.content { + border-left: 3px solid #dddddd; + padding-left: 0.5em; +} + +div.imageblock div.content { padding-left: 0; } +span.image img { border-style: none; } +a.image:visited { color: white; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; + color: navy; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +ol.arabic { + list-style-type: decimal; +} +ol.loweralpha { + list-style-type: lower-alpha; +} +ol.upperalpha { + list-style-type: upper-alpha; +} +ol.lowerroman { + list-style-type: lower-roman; +} +ol.upperroman { + list-style-type: upper-roman; +} + +div.compact ul, div.compact ol, +div.compact p, div.compact p, +div.compact div, div.compact div { + margin-top: 0.1em; + margin-bottom: 0.1em; +} + +tfoot { + font-weight: bold; +} +td > div.verse { + white-space: pre; +} + +div.hdlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hdlist tr { + padding-bottom: 15px; +} +dt.hdlist1.strong, td.hdlist1.strong { + font-weight: bold; +} +td.hdlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; + color: navy; +} +td.hdlist2 { + vertical-align: top; +} +div.hdlist.compact tr { + margin: 0; + padding-bottom: 0; +} + +.comment { + background: yellow; +} + +.footnote, .footnoteref { + font-size: 0.8em; +} + +span.footnote, span.footnoteref { + vertical-align: super; +} + +#footnotes { + margin: 20px 0 20px 0; + padding: 7px 0 0 0; +} + +#footnotes div.footnote { + margin: 0 0 5px 0; +} + +#footnotes hr { + border: none; + border-top: 1px solid silver; + height: 1px; + text-align: left; + margin-left: 0; + width: 20%; + min-width: 100px; +} + +div.colist td { + padding-right: 0.5em; + padding-bottom: 0.3em; + vertical-align: top; +} +div.colist td img { + margin-top: 0.3em; +} + +@media print { + #footer-badges { display: none; } +} + +#toc { + margin-bottom: 2.5em; +} + +#toctitle { + color: #527bbd; + font-size: 1.1em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { + margin-top: 0; + margin-bottom: 0; +} +div.toclevel2 { + margin-left: 2em; + font-size: 0.9em; +} +div.toclevel3 { + margin-left: 4em; + font-size: 0.9em; +} +div.toclevel4 { + margin-left: 6em; + font-size: 0.9em; +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } + + +/* + * xhtml11 specific + * + * */ + +tt { + font-family: monospace; + font-size: inherit; + color: navy; +} + +div.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.tableblock > table { + border: 3px solid #527bbd; +} +thead, p.table.header { + font-weight: bold; + color: #527bbd; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overriden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; +} + + +/* + * html5 specific + * + * */ + +.monospaced { + font-family: monospace; + font-size: inherit; + color: navy; +} + +table.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +thead, p.tableblock.header { + font-weight: bold; + color: #527bbd; +} +p.tableblock { + margin-top: 0; +} +table.tableblock { + border-width: 3px; + border-spacing: 0px; + border-style: solid; + border-color: #527bbd; + border-collapse: collapse; +} +th.tableblock, td.tableblock { + border-width: 1px; + padding: 4px; + border-style: solid; + border-color: #527bbd; +} + +table.tableblock.frame-topbot { + border-left-style: hidden; + border-right-style: hidden; +} +table.tableblock.frame-sides { + border-top-style: hidden; + border-bottom-style: hidden; +} +table.tableblock.frame-none { + border-style: hidden; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} +th.tableblock.halign-right, td.tableblock.halign-right { + text-align: right; +} + +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; +} +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; +} + + +/* + * manpage specific + * + * */ + +body.manpage h1 { + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 2px solid silver; + border-bottom: 2px solid silver; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; +} + +@media print { + body.manpage div#toc { display: none; } +} + + +/* + * Theme specific overrides of the preceding (asciidoc.css) CSS. + * + */ +body { + font-family: Garamond, Georgia, serif; + font-size: 17px; + color: #3E4349; + line-height: 1.3em; +} +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Garmond, Georgia, serif; + font-weight: normal; + border-bottom-width: 0; + color: #3E4349; +} +div.title, caption.title { color: #596673; font-weight: bold; } +h1 { font-size: 240%; } +h2 { font-size: 180%; } +h3 { font-size: 150%; } +h4 { font-size: 130%; } +h5 { font-size: 115%; } +h6 { font-size: 100%; } +#header h1 { margin-top: 0; } +#toc { + color: #444444; + line-height: 1.5; + padding-top: 1.5em; +} +#toctitle { + font-size: 20px; +} +#toc a { + border-bottom: 1px dotted #999999; + color: #444444 !important; + text-decoration: none !important; +} +#toc a:hover { + border-bottom: 1px solid #6D4100; + color: #6D4100 !important; + text-decoration: none !important; +} +div.toclevel1 { margin-top: 0.2em; font-size: 16px; } +div.toclevel2 { margin-top: 0.15em; font-size: 14px; } +em, dt, td.hdlist1 { color: black; } +strong { color: #3E4349; } +a { color: #004B6B; text-decoration: none; border-bottom: 1px dotted #004B6B; } +a:visited { color: #615FA0; border-bottom: 1px dotted #615FA0; } +a:hover { color: #6D4100; border-bottom: 1px solid #6D4100; } +div.tableblock > table, table.tableblock { border: 3px solid #E8E8E8; } +th.tableblock, td.tableblock { border: 1px solid #E8E8E8; } +ul > li > * { color: #3E4349; } +pre, tt, .monospaced { font-family: Consolas,Menlo,'Deja Vu Sans Mono','Bitstream Vera Sans Mono',monospace; } +tt, .monospaced { font-size: 0.9em; color: black; +} +div.exampleblock > div.content, div.sidebarblock > div.content, div.listingblock > div.content { border-width: 0 0 0 3px; border-color: #E8E8E8; } +div.verseblock { border-left-width: 0; margin-left: 3em; } +div.quoteblock { border-left-width: 3px; margin-left: 0; margin-right: 0;} +div.admonitionblock td.content { border-left: 3px solid #E8E8E8; } diff --git a/sqlg-doc/docs/2.1.4/img/bullet.png b/sqlg-doc/docs/2.1.4/img/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..22ea54375ac8492b3c51cf6da0bfba787030e6d9 GIT binary patch literal 1045 zcmaJ=O-K}B7@ibMElse)x>0N3oSw5?98V->HIYF>5iUK zA`Lu5bm#{vC?X;w=x7lgyL9T*sXTTmFGV2OH|y@!L7T&T@AvXP&-=VT-;Kifxt{J| zH$f0R`J7b5r*C(49>o8{Pv7?AV*q8#Xu_I8HN}BMO0y~uVDSuTK#Y?R@n{4n4cmZ4dWW)fkR5n>5}VL{^~aW+Sr5{lATBNx7jWECM>py^tzM%5ye zkkmXh_8)PP86bocU)lJ`1N64~}H(jKdD$GkFi8&};*Mu=C6N$&UXgrpPv22!2 zrMWC0iDfx95#duQsfm>=b0v`+8^ydqi(wJ{`h8Vaq*?K`q0Gt?%>6K|7Cp}KZ=#S zlqz|jE8f;-HrN>f2WBg4$)%0t#jaI36bgN8`@Nj}IiRsO(?g)Qee+lH&GBcsu2Wkl zFCBT&_xy3&YHDb`?e40)*7fb$>q7tSN4El%;X-14`Lx|}Z~o~0K!1sNa^}RTSBEYK xuLp8pMev~G*qx4^U<$GJkL{hEhf4vXZ<2_8$_Xo1dk6i8n$M0)FVmCDe*jLcM%4fS literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-32px.png b/sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-32px.png new file mode 100644 index 0000000000000000000000000000000000000000..8b25551a97921681334176ee143b41510a117d86 GIT binary patch literal 1714 zcmaJ?X;2eq7*4oFu!ne{XxAht2qc?8LXr|_LPCfTpaBK7K$c{I0Ld=NLIOeuC;@2) zZ$K%a)k+m-s0>xHmKxL%0V&0TRzzznhgyqrIC$F)0{WwLXLrBvd*^wc_uSc%h%m9E z{W5z3f#4_!7RvAyFh6!S_*<8qJ%KOIm?#E|L=rJQq=gB5C6WLG5;c?r%V0>EmEH#X z5eSwPRa6WXBMs#$5H%GtW2go-in9p>zW@UYDNNWc^XOXZQ? z1QjEV00I#$3^1wQUJ8&-2UsjB-G|9y(LDhMNN3PM{APL4eYi{(m*ERcUnJa{R+-3^ z34^A6;U^v`8N*O6ji%S@sd{fJqD`XFIUJ5zgTe5^5nj414F(y!G&=H(f)Lgzv?>%+ zAsWD}2qhpH7>|TU`X&W6IxDNuO_vET7|j5oG&&VDr!)hUO8+0KR?nh!m<)a!?|%yG zqOwq!CWCcIhE{<$E|F|@g>nP6FoYr6C<8>D?ID9%&5J(4oSbR1I^byW*g@__U z4QsF&uJSEcFeleM3~ChjEQGbHOjsGDMbyAl(p=Ttv9RaVo8~I#js@@Y9C^_2U})yn zzSHU%6FxuY?d;&65MyR({^lU*3$z$ZllDb(o&<7d;A_`h2U+3~BJ2Hv`{W}KEU801#cv_B|9Cm!ynR{S`AMsSn z;7E=B;mb!wx$L;S>yGXG^6=&WlQn9$s?&L%Y1D8TI^MlKB1DqsEng$>f4=xYWBoPI z_S1p!sJ#d2?YI4kPA{k}Eby?F=f-J9zIc`YDl^pzjVm~9ebE?Hn?t0Nx+la|D0MB; z9)2xv1G>a1|A9kQ>~DV<=X3-4yC&n!m8-3K#P z{X@0zRuQsy$+N ziSCoLJU{Z$nQy4A4Y5UJ07$5FA~qL2%Q+cLaqDU?Lz3?=BC5;Nk6BbTmmceEaM>-Z zi>O&-dSE=%ex;vcvCOk{*JQ5^_4M z4lW7%l9IqY(z7pV(?I@@8=KPFO82)O{VDI18-*d-k$YmI^XiuPs_LuFw<^ZcD}yP5 c*NrbeloN*74g`U%%F6r~k%+>C^#XapzmV0H-2eap literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-Light-32px.png b/sqlg-doc/docs/2.1.4/img/github/PNG/GitHub-Mark-Light-32px.png new file mode 100644 index 0000000000000000000000000000000000000000..628da97c70890c73e59204f5b140c4e67671e92d GIT binary patch literal 1571 zcmaJ>c~BE~6izDPQq)#Nu*KOf(n^(VHY9;fiINM65``pc+9*v(mL$bwfCjbc%v9V{8r9iX|O%>Nr%pLD2qT{mty}c=LVleeamv znz3SOSm@kP8jThvOOq(56Yzh*fz(booe!uZij=BJC6+_lbvQ~B8nA2>kXdv_RDtRY z`5QXWWEySCe6vbTs^#f?J!WC*{1~RgVx!nJTJjQyO{dRANgx|FnymtGbD9%JmCh9^y)##j7{Dcqfn*1ta$rG89pJF6w-S7Z037$rr|y0;1Onp_ zGFJdT6Q!1C0AdVB0WOmpuV=AgAQ550Tn+-mivTtYPJmz*#75#_n9oV%!#rSOfmAfy zki%C~=fTp1{O#BLpJ|0jj#m6#|LRWit-vq3PE1z9ZqyvET4sX$-Icqy7t z<=aq5ff86AuBZBu6EjJsYWM0uejufWFTwPA7Su}0Bm$7KFb!q{Um_8~A{LUG#1l(l zSehUda@kU8LIRg9fkk2tZ;~ss5~R+mM<==F7hLHpxqLB>>PQS%Vc7b~?q!%T5+h8Q z4G=4Nzyi5WZ?^gkasJ{?Xhm`JC#WG6$1K2jb@=9&D3EgD#3UhGh#*21rJjulVXjCF zvp76q62jt0zzMG5C7DlfMgPl%C^3+~wf|}Lq=}jz|MmIcQjh1Ok6NjD$Em^Iv26D> z8tt_TnM9~^Tt8mflRGPOrrX|HtT3gG4LEuuk{g2Rn}QgJIa?gZo))!!=o_l9bvD%A zZ`aHajl8#~u?!4f7F#*b*->A=R2L)6!>saz?h>#wTXT-I(XmQ zx{84skS>k=i~i`(6k4C7;Zpfx%dCPVjPayMf8pugtGM=~s=Id1l#8MZJ1-73wV#Q3 zR3>v3%}jbQs1f_Z0xo;%=LILlA+nTpKI4ha%xWW}uqHrNao~&T4AY6m`P$_n-6h*g zhoX+e4n%~gl_lhe#s+AMb7d{5WzvYTa%6Q~si@@4{;s(0zU|H&P3fE+t{7X`S#Cj@ zC#vd}^4pcBD*77Ny5=j$h8EL2_t$O38$SQiJ6fPjJMimypr~MB2(&P0aI|h}$64<0 z>_~duqNjaT=DM^6+N{&B_lED;F2wrl?!4Lk*2((x!fmrcsw+=cI^qttuZ9C}-m~5E z-ryYVpL%^xR#&(0YI5hz<(}F7-p)?FPcyJO-zVO>%9ZDXJH8pnY;GJYFDQ>vd#j_* zRrd}L(r=!g+1#nQwsO?kpS`Qq8`NxE+Zy{gf7*_7J*U2V_|NpLo{iasj7VCg_V9&| ShohtYzipXxh2)4xTk + + + law + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/img/github/SVG/mark-github.svg b/sqlg-doc/docs/2.1.4/img/github/SVG/mark-github.svg new file mode 100644 index 000000000..af1bfa1f9 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/img/github/SVG/mark-github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/img/hr.gif b/sqlg-doc/docs/2.1.4/img/hr.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdb4168de55a60c4d84ea1f5cb2dcbea7009c746 GIT binary patch literal 1121 zcmZ?wbhEHbWMyDxSj51fqO1Z0sw%3Aii)bLs?N^N3}B%6pF6@gK*1%kBoRp4*jE%J zCTFLXC?ut(XXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a zsv@@_H?<^Dp&~aYuh^=>Rw*$hKPlA;$OZ}PD=C1Llw{i~If5hKW)J z8<-g?n3?DqniyD`Sn4Pk85kPq8ye{wnCluESecqz85k-+ffCTRqLehNAQv~NT|l0# zQbtKhft9{~d3m{Bxv^e;QM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>OF1ees}+TSP$$Sz2y8{{ffi_eM3D1ke6TzeSPsO&CP|Y zE-nd5MYtEM!Nnn!1*!T$sm1xFMaii^<;ozd3ap%qQWHz^i$e1Ab6}wukda@KU!0L& zpx_*As%NO+o0y!L2ND76@b$Iw%quQQ%u7!7bg@+enxU7OnPO#O;%w<+?&@e}YU*le z=xXTbWaMgTZ0c%cXl`uj=;#8|>yn>bnwy$e0@Is<(CdU#FDNnO765H_NiE7OOHFYr z%Fk5*d)g`!w_7Z5ng`XJg4->YIQ8lS9itD5TBN9k2?5g&hzU=)Kn^_Vr{)3Edl4{U zGyebg_s{QNKYx7x_Vvr>Pai+LfA{vy>sK#dJb(7|$>T>4AKbrp_s;EGH*Z|OcJ<2T zOBXMkKX>-b=~E|996xsS$l*f=5A5H!chBx!J9li~wsp(qO&d3?U$=J6>QyUOEMK;C z$>K!|7tEhGch2ltGiOYnHg(G6NfRgZ_x1L4cXf8Ox3#u3H#IiY*VWckS5;P&mz9GzJE102GaYNdN!< literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/nav-bg.gif b/sqlg-doc/docs/2.1.4/img/nav-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..474396561daa9bebc874426b013e976333fe0153 GIT binary patch literal 1238 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/E_knows.png b/sqlg-doc/docs/2.1.4/img/sqlg/E_knows.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed879837a229d2cf6f120d049fc0618f8e2be09 GIT binary patch literal 5527 zcmaJ_XIK;6whkYkfJ#viuuw#*^eQMNiXgog>75{<*ML;1BE5Hl(h?w)VCWDvMo>Vc z6M9jQ5_&J;j_2Ha&b{ZyohQ%Cp3F0QueIl0YrXG^)74g?xpMmo2n3>0Q&rLjfyfBJ z*n{dX;4Jb{C=R%g`zWdzQc+P&&g;wpx3_$iO?(YJAigkLZ%2@myN8>jkdM8$qocde z3lHB-a;yRf#K^Cv^u#crfH>`J!ti{SV(Te2e~>8y*>&9)Rf=9nMxjdr?b+xOM2L%J zof%{4>f&Ilk&;2mWxG6snvN%6dzM+kD+l9?j;AU~9bnWO9C2)!ofqG(y~M1xapWxiEWNx+%O4~|0T zORVc@#=(5dlY`gr=vbc{GoHe@VRK z3Nsi}E7M0Be)AW}dAr9wAV%$c`+jsZHaaG0Zo42ruItB->&nW}31FpsUScwsq^f0! z3kdT~XB)P2a?18w>*R>?lqpC^@L*+OK@eGJoz}ESbO7@CqQps=HTXD#^G>Ru3S0UUmL?-ghxa~Y;DzDWfm4a zx^`RJtU|l+hIDyFMaXX7BMRA)p1oowpOz`4LB(}NO)ag(h4Stq2?K*6lz9{Uk>5!} zzk&x8YKB=AFmC(GB_I$lW^b1*Y}vcKtN2up3dGToqb)u<8b4U3aTGk$ zoywWP#`|ry35j%G9lkFg^m6OCy{;~mhKA<0{~V#gNh4c0^xRKGT6)ZRNTH^-Hk%l> zHTOy_oo8ZlQs4YwV|u8eBDO&yY-8%-a8`v5T-c(y__;{GRfk-*py}S(u@51Hfx!u7 zjV6MCj(HM3n>%GeJF>*(khOf|H( zPfbjSi;9MyjC57h*4EPP`{?QxV=#`&%9r|@9ny_Wj`Fb=vb41R9YNUnwKWO<^_wlZ z)`GLgdL{3YSsqS}kH2tq94JwNX~mR`0ee>^ z-+dSuJ#j9;&;KSqJ|s9e^xWv26wegW=`pLo%UkjL_Y0&U)ZV_tmU3`tXtdTE?6>-U zZx2Ht5Hzv`vxr#e$n&lw*8Q!m6#363D#`xDiQR)q5$zi_R_FU)5-Jc zNdZoW8gwO6rKBudeZ4+}zY11>LoCF%x3^)NGm{-bI(~lpB`TPn ztdJ*eA_4-Z$II|vvha)yO{)63x-(+ayY_a5JZhENTZ#`-($g7Yae8w61F)8smV2qq zL9lFticnksi}rT*%N((E?0(+fP@~Ax!%f~OF0Nj2X=&?5*OfSiE=SqfW-m_gMQ=D6 zInr87Q&Z{Q!1?LL`OzYBIBOGoG4uKJ&$*9Jqf$1eEzu1POu}agt!npDfBs}?Y-m{A zExZXHi*hd2Gd2A>@43Fdj<5!zM}{S7J)kkVu5Jqe{|&~%)9o(y;Nal={7b<4>yVhP?E5cD~z)QOy`B5Tj zapBFID{)Gn=G2~A+PJ&B+uAzY+uK7R#+H_-=15g8=m=>C>f+MZ*S8|@dXR!$j*mNP zD%?|W@<{&_z4w9JhOT=a1$6l$;#_vzDR4m^H2iB)!WZEbCF zF+Dr`xuKyF)n&TmKW=&Nd;?wy4}a_E=m@N~Qwa0-AN}I;*!rfT&`cdiaT{u8U`JKBgv?^Tm8eD0kNgC`cPlTA_l+2slIijed zKNZTtUgPbcZMu8~;@s}PbuSVUsDpw|@$s1j1%uY~aa=q+FMD%L6jePvsW1aQJsNyB zLXYMzl34F(G+-w#vJ{Ty$Q4zA{R}?S1Y?^JiDYC?9pSx*)yKiX5lZ)Rr8lj!MXVpe zHZ0WD(Uq~PIyw?kQolT98XIf%%z;wCo2hPZuhR7;DNDVqzFsJ{_@R-=W#yb_FRwC( zLZHwSJaZ3_M5Ce;EjrKQzZc5(=Sy3Ukml#-qobn%7jZzozkJMo=T5%Q@*6~?9Zgqe zTAHhyn}pN%sqSt*S{1ExFWBKVs-gt;i}}xS3=2Rd#`CsJZ*dx1#7%?F?R9jmYke<5| zZb^rp38=-Srs@ro$jHcgvUvxjI~~3b-jaYA8yOL2vHb)>?!@@QJ>4=^Rn;5}bYu*u z3e+^L58bE6)95pq!K`utclr505eR|A31)WTzI=hp1JywQ@_Qyp+&d*IL(_OVS`W~R`M zD*#(it+3nn_NHAi%YI*p4?tB5y1Kfu$?@4&fvaJ~ZlZ|^_Gg8^iPJrUgW|lrW1piW zUixYV2DVuB>$v>-$)camP1hQ;F9NHdBs+EqWt5VVAE;y12O8@L1`k0M1>gY z=~-D>ZT$K*y&dvH3xO|=H@VLcqe5BXg^TIs)?kW_qHe-qXlQBGw5`7SC;MK4)(hL6 z3w?e`dGq55pUGx8?QJo;pRccT5;mfR2P6A8Kp^TOu~EBe9R_UF!Na>;Q8z@gvzxP(y{w+c~$WXk&M|-^JB6gSa@iwNO+#esr_^`imdn(}}BEBl){{a>~xal$6Kkz4M-ScFzjI7pF^o z`9N-IbPxGOk3Ts%@ml<{6L1!CdH{d4uK|HT)V>M?h8VtvPpD|>==Ai1J8V8GQmDLr zh~IjKnI4Vz@)Ol8Iq;P6J$?rr=t@UNlL%v5n1Kf;UKW~EUS3{ti6Pf(ouJTGpXHjf zvxcY?241Vnp7infbRMl2FA)7-zt%T2#3!;YE-bto&pU%Fs^cg!m-dlw{x-Z#jtCTf zr>~B?GXkM&bhDtK9_p^HtgL+fT9mE-zL-~5u3lXQAOJd(VK-hp*sfrd8m?{+ zlImABRCfy~sa*f~AfYGR_I7S&#(Oz17^?$UfNe|(3khYqRjBP4DiaM#)c&fd)Es8= z5Hr$3YRMb*3TAe>h9YMQN>X?M6l&$EmR0K$^w30?(dtGtdUXKTVMN0pL&M*qdqZ7q5kBdNg! zq4LW67-YpCw{rSKMtT_KlzCh_xuajwp=lqGm8t*f zniU%}Y-O;ld?|I|0LWuuq~m)U8a>MK3jN*PIr2e`F*JkA`(Fo3Sy)+nzI_8Sz6S)t zgXLu;mvJ3Gy~-q*;b@GU$mRQak6+nQ=ndZP)#JI<)yn3`K}xsDX6l>esiwnKt#99c z92`VfR;o8nPQ+7SEGZw=l?Y4$&)AgNZ-BRdSYUFI|3^R^&M9oIV8{K-Lllu zJn26eE3$(iUr(S@qYa4*BNflGk+3_0`#?Jo~U!GNqML{uOj8}z50Q@OWCU`kn+sTOMW5s z>*xnGtTJ2jz|c6IY=WJ9JjOwhv!BiI3LtnawQEPZRP~>B_X^&B$j&U?g2BiLyQBSE zcdr=Rfl}qWsWeNh?By9UpPYCly+f{C-mk@NjPu`l;Naa-sHhkdcH(U3>DgUl*@ijs z6jVUWf0T?!`jNkAXZb~)`YxLC)+^^>YYHZ{O7<>5OU2M&Zi2!?{voS^ytM92PJ=+A zSD-b{`J(fjWzr3f03=&SxlxaNmNac_?oM|62+Dc(#a2DnZ>jf|hK5g>bVqxVqO`~| z1xS=a#+n-RL1EYq1Uh)jL=LJ;uHT$?n{4#kUclSct2(1SWiS2RezaFyJV(8lxR#fe zc9oKrr8)TcjVjl|cEHDvIPj5;#aN9cVI!L)R++8UB@=w43a~t7Wo~%?9WV*EwdI*t z=(sBq$s0jIj%jXhm*cQq(gB|<-7tpRU)jIGuYjR&o@^vuzdjFq!TP4AS|pOt;`3a8 z@J%h&3h$5IOV;afee^gql(aD&lqF=oKqQ7Ne(B2;FsMek%>;>rFA4K?=Go7&DBCSm zpPiin4|@ADt*gjTXfJ!ni{Gkj$z8v^kAp*j$DckI!!C`5B}) zM_Xv0BEe>^IRG%EtgH-3zm|=z$gHIJL{nQ^J#1*G>)~JFQ|-se@Y$Yhy9?6!Xl;Kn zR>OA>5fejUJ~<{QCueW>ZZ-sl$T~%I-9+Gr2ZM+nls5_$3NMIFcf=*Ij%}PErMuTm z%*`1TM^UE`KzRXdG?^V-PO$cmcvoM)J%L%fBkkTAbXcPo5?f`Il8Xe&@W4{v1#ESA zMasn(5DSIG4bU~f=<;$NS=lxK@z)d)jH*&CB^b=U>?XChpI@Ou$RlVye{;DOvwW}# z6Fb~Lk+#-+4c@=9qf!81c}yO7Yb^k3Me;1@ znnS{>;}993pI6uJ7^BRLOil5N5Ak@dci3VfIXU0c16DvyEqS-p)YPP=UZ0=0WgRu| zz&Qww&ZO}^+ZPtE{0L=)qhP=X9LpsT=u|hJ3^X2V_AiXD zY`lcIyB|f6gKpk7axwmM`wa7q$(Ygp@A6cy9DPXP!;+l|wrUt95ETU?|L9qW{m(pI zA7I5Evz?h485!^}GeIW0TjIXN2|qxk5Iu~)jE{!3dH;fHYkxo9&w-A;oxJDPl!4}h&192_+? zH00t&*&J~Aegg=?`T03)eY`09@F{dPPbHa6$lASoail0BLW1vB@23nXorH_vbZ3aH zsOZ-5?lPdQ0j}s8mcR4By*J}r6LrDF$cS5i`a7eymj(?#4xV}MY*137GO$huq6mLw zwhm~R)m3$>`~3WA>Sg2<)GxyFB@>*^rRz;BOif#0n=o>UJ*PGiP_bo#BgEL)n1`!( zeFEd6{_VLY2H71j8kSy|vo?U!BB|a2QPWFcnj0G*h>N!ay{566=^X*QcsH;&0(>%@ z^l|+B{QjFWK!wdpL#Gkh$ikV#wg{HM;oxut$O$wW&3W(MGaB2`>LY-h z6E?1bUNDnmWcc|PzGVv3)J!*^(L6dul7Ty=*b7qIdEd92lP4ZNOJ{3i)?sc?DE*aa zAdG=T1X8 zT=WkgJ)-!#{q$G1%##5olg%Um7ew1)CKr!f**Ep_vmPD4PDjl@7neyAgbb8GDFL50GBOGb46G+cDBSI4=8-w2GSu5=t~A(ZF;4A7c>P?RB<-A?zxy+TK#!=t>w!RZ hbpNhq|IbwC;KQgOfzQb%xj<_bq^7K`RHJAU@n6UK@t*(y literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/V_Person_name_index.png b/sqlg-doc/docs/2.1.4/img/sqlg/V_Person_name_index.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb31a3a6d35175b731b9f18ebccf81ee03b5c85 GIT binary patch literal 42696 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 z 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 CIpU=N literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/V_person.png b/sqlg-doc/docs/2.1.4/img/sqlg/V_person.png new file mode 100644 index 0000000000000000000000000000000000000000..1702afd520c6b723c23b693951d98515e0909799 GIT binary patch literal 6492 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 tjW(#eT045TL<#RUjI8WGSvwrUG{1vD$RH9T zf{HF_dyVcMisN;Uk819Rbwo~{whCHlzu_k-eGlnR_~?(W4!MWw$E>Tx22$U+7T59aFdwO#b; z#RM@#ke(|pUtO(6C%x6tR!~sT((+vYta30@MYr93;lkT|J!s8Pw-#4aRD?^XeAIPw zbCYV_U7CfoP4~yxFl$4b9{v_|4?fh78$v#Vxnn&^tJej?O zXG>i#tWho>=j?~6r*H=eI$*`3g8SD~z{9F0wP%0-)+<-l_Bifbe0;dHtsz2wJlA=2 zoVBbW=J(>QI8M~Cnyz;&9ygn>cii2tStP0Iw;$%a4A;4%Xe~8Vd*`$_CF_0j#~kcY zyzIMJqq@e%`!?jacSr5$=`x##-jBDx4x8LVmII@4oy#^hHgq0Nk|HA`m5UwsXR00_ z4j)No+o_W@?asF37uwG!b(*~&AM}ibFp6}C(zrI$owa3Uqv`uUeE0zVz5p&{?m{y+ zGYeYSXoV-eyV)(%VweO=Tn4t%#{Hw!Y3mKCg%u*UbDw&JVXumgCvMgH53S!3g3=Z% z8k{m|oWCb0X%PH=e;VlT|8=udZ2fDW9Yyowbd9ynnns(Fiq^BG)o6b0I=gk}rqlF( zhF^Os%{NLqI;1|Nk5}DFN=n^P#NoUFv-=ObI*)FPo|j6BiUBWXXJ>bJc9cssP1#db zN;R*qH#41`oy88$SHjF_d0Bx%)JD z=LOg9WgC>du)phca&l5-J}HyT+-bqCzhfr=W_J6H}(Oo6_3Xsi7%sq!`0b6A}l-5fSPgR(e<-_rEmpyv+QP*DTi(dYB z#&#!M4of;YWVYA$(VcqCBTWzUa%x0EaTv}gLU43zXxyZknW)D$R zRAgmi0|$^lp33y`;eL0b#CDVd~mv6PwL*^40>TzP*hY8W@|j~MP5sb?+Yt}zW&ih zs`bJAugjw1Qn&l_Npo}ax;9K_@1s_DRJeA!vIe`u#>`=yuK91Lhf`8hvA4s7S>Tv_L(6PFRn3@WxNfAFm-Y@0^0^!>fgpFi z-LL7k!b5;PXnuT+E2XzTsh=3PXuGFL1V+$0jBo zR!JX!sFy5%)Aai?b+?S}t@=Z^)p1hma>l$2Dujo{9g-4bvHU~Hz1k{Yj8!Vkg9eoNBcxx58OOrIx$PkF8p z+P4K9m!-?wL$GJ6Y_xHHetzL^o37f?`HA#j_{m|`)zv{X8C0&~XCL1J*d={93Jwem zgb==XLF#cN7(mi4&jMpjbkh|Y-m0q#u;qBQyF}UC&iZufVRh(D>oyjw8w;+$@_%?VdpCS&ak6BcE_DD%h~GpL-gIzq~2TE!Cq%M zq@AAU&-YYg-LLN-0LqxLrs!3nLh!=ZOKKKU*ez#9QZWP6IUny%q3-Svy`8~KlB7gQO9LDaBt5dQq*72IH=Bk6UpyrLc`j&=B#IEb%+3+!tYo3=k4 z{>j@gY9*j;gx2wmWQocdFc=tm)?UB7uOd zt*xg05GuzUgp7yh_U?2z`WO9s470Ti_X8#ZlwtnIyFar0T5@tnIi&ZW#*367+OF%L zZx4Q<`zRNub35+rj2A;mr*pF%4E%7~pUKZ~+ZmO5`(Z5vj8Zhm_WESq>DT=L%dp2@ zd3Vs13r@|o?%zfG6_#E>NJv=P{NM&LuDnjOAG#hd^I{WGkskrsO;;VjZQ(W+0uX zrl@EKV9B~sPNVkWWz%INU_$`&Xw|x#w)0Y5jCR_C(YxofnwlN}GG}mDFPyCRr>3Mp z9Gsn1-pgre4Hgr40O;#ad{bOlsMh3houBDNI6kcFZtHX~r>3Ojc(l|CD|QYZ@kYC$ zw!Yr&c%`$f`GFgvmIyYk(&c#N`gC&QTb_=}VW|3Ps7CjU+G%i7S*CM%c`KX7c?^gE|HIYl<8AY!IV+(zNS6UM(fj;J+C(SA-VdkC z?ZK|5AD)Qn7Z;RoPr2rg43FjJP1JqYY1!G?Ifs)yZWbOMK07nh z*4L3O96V=rnZ{+`Hd_Y3v~u_z*s2-8XLLP9_s{n#hZ$6V_$1YT!04LF`;dCja4M5J zXw04pLX7Bo5-_Zq=KKAV{Ztdn#>d zxgYVIrHgr_AmzU~o8k@p@VnbRp2LPp!`?VRcT;cEJFw~|f9Hsy6LB8-liulyv;*k6 z1PmN7sz-pKB^osc05EJhiIy?nos9^CJS>$+FVW!LlzS5Geb;VQW#^CaG-zqwAbCz$ z!6oIe0=s>H^3#0zX zOKJ{gYpkc_$0sMlzq<5NCv7>@1B49u3V0%f3!G}~i^3N@Cqc*U(9ALZrss?-lWH?+={ubv%x}A1}S1 zsLu5CG!P!{=i@2>{@VASt7zJG{t!d7Z%5?-6iCba{v2FUv*_i%!h`iRn=oDZCd}>5 z)#Eupjb!=nf6C;i#%MiFRK)lz{eRRlBH}l8poN}LJ*Mp`)-Xi+{_m9Z|DGQH=SH!k zd_JEN8MJOXuw`>g9}^Q3fucw znpoFuRLhyNy;A7m{g>vx>WMj3WHjgRZ$aL<5^=Gtze>_QY1`_)IG$A9r#zZrGRnT& z{{SJooz^J+?a6s9y!|J8o-gdaE#GI<6{8AbsKt<{1=Wi&*EWybk55}7v!MFr%26R-Wzy`JzHB{iP&*yjPH(oUc*A0MY%dy2E5z|2 z2^wIB4dl$Z7Rgq#_hlQsx;FH;ur{*3$KhhJIU%q%yin$P1)~J>pJ(WzzJ=1gt{mk; z5Y(?@>6m*iA8pAfNc#n~Bt>BgYb1 z>wIavaPr;K-%fhrTy96XJ8T30dNvf$)6v+6P#7n#pR3l3!5|PO@?h7o7(7zQG>KQ& z^hKd1@+r~Zvwvh%hf8E7XOyQe#Ilo#-7gv7eP7LXEz92W&jX50cJP3_qq(-ffN%-23|od5k7C&x4*a~Puewp{z)>yopdSYRvu@;r&03ryAr7y?}>0+TO=esp*hIl>2ggb!>( zd48fje7JS_(2%)T_S$mz^nrF5jz_8cSPPWJ}x_KLPM`iqh}4( zI$wu44AQcSUd-P7?MLlgexRD zdeWcUWw>8`_U}S4j9H|8vhb+<9p39vB{9IeRf<+4%j#e%@e>PNn*3lBW{z?7C%}0L z{TDyPVV&PL&80ukMi~Ci7fyBWa0lyaXQJQtjr06QcguIrB$M|gjL`37j87@lEA6am zKXZjJ!g4Ro&)5t`Yy9o&+W;^;yiM@pxx!*0w{={tn$_cnI--qG_=6P~D-uA`{Dq_9 zP|E2X&aGMWQ2vahGxU=2kx3km$V>9z0h-Vt>~&Zqa$&@f9Cl#>%q3+WHLjl=l6*2s zL_FiA7Y^NbH=)Bx8;2}I8Ah%0JrnDD#RKk$z85w_!+-c{$CkEQUO2aS`E4V2m?9^; z+RfxJc12~CBX&|wBzO3{wW(NGJVL5RTh4UWn}|MIw_+4bDHkX1V~TyL8uV?2EYM$$ z_wfcdMH?Q{+rlb3y%5BqqIdI|G4W;gsr>h8G0f!N@}ut$_;aQ0kfU=Q+rIH0E~6HP z18vp^VYSKuUAvIotfif<&Ecg~PlT&4O#E?Adm&w@JD=nG)K510D#(90wa)y4TG%Acv$r91AY1fC6(QOBXAb0BNZ{ zhZohUuh!^x4ic%nf&z>#@SB3sh-WH{kgegfCU*f@1O8cISUsD_%$9lAF$cN$XyN3^ zHqXdIdGmF;Zd(V{8GjMmt?E^3UkkpbaR$A{3;Ej@^ez?N{dtpew;>fjQBhvOA7sg? z6Q>dFmwdW|hkgejiB}cgA)J|fJ+CMm|?;6L`0dxmw>?n!or`% zVVyx62KlbMyU^&)VL3B4H`id$9ToY4qpMovg3= zUrMqV%YWXyq&$WYU(^s>oxO`e_~=`hlznMV9&93}$ z>Yc|4!Mk}vO(#spm7jq^%gGX4pDGB1(B=f8qN0wfzc2knEHI-&%ReWPRzHCSx0;sks6 zKhS38SID6WVx7pmUntxrfftnKWFBZ^Dp0BGH3XvY7a)4x_q#gHXQNV1zve%&&R7W6 zOopcmAC6MHr!v#HrSdXK!EcRQI6x8 zSMTlU!9J05s;h8ceim&QBI_=-x_KxZ6NPL7`JR2A`}*CBHyDz`)>~%*8Y%V+xcNE@ znn#|4b;Z%U!zMEp)DiLTw(Ylu6Nj39MhhZl7Jl|m82>chKAZG#?NmFAO(TPHJPC`7 z_Ojn@j-Qh#O6Pt@1qhb1;mz4v+f`r_?VVmv01^ts44|ic?iV(sQ3Z)d2f*YBrO8mO zv6=_hXsW5z0VNG&i~Z@wAYM2SWp7@vTLAe6=zm#3f$Gms@@uw9fWxiD%XXpAn6h$k zs3>-UA&1(83Z*t9>55+o@(KL$FQE(?}aZay9 zd^9esh@1;hJw0)pw6VU{%`>lt=jtpPcV4+ zxQXZZ2~RLhBR*q^tgG{cgwLwo;cX%zbf&HetMT4%Q5M&$}1iEaG8A&0c8 zb~$i;Z{VKKfnvcCuS~jWnnHC(r)uPM%$7^AYlj15A4}Iy6mF@Un#QrBf;^D&bnA)$ z!tz1#lJiC{2zpzirf1@1BHw!>@*FT}1K;jD6VcabA32#(qCZr#3ydKJQRL-*jFC=_ zbXaTC*A0skt|$BNW+n6s#y~!Dh9F98(m-JCJ7H<}fCrH6^redy#_nEft5E7vH7K{A z99@3XZb2*bOb|&d=xNZe^`9<-{Zatqv*G>qI&+((KL$l>GY$uh0*#my2BRXsCH5c| zC=Ns3m9^^;!`4HIOMxK4t>aKv10@3S_G@=1TI1|#&1}L0ce82z7g^zFGUy9=9 zE57_X^g4=*6!FcP36>yyRPS2LlYWU{Ia}(b>hXOl28v??)+PZ<%$WyGe-{0BMnrMK z1X$02^pNla*ci)n#$zLW=ivlaC18{cS?uGraoOHhh=r~?OCN)e1l0OU$|5Y+Ut(nH zhZD7SeC>37beJ<^2!SUNK9EjO79PtpP}S8=ox78rnuYwBQ}831L|OAgiy;yM?2sy$ zkqQZfN<0czOj|6k#Ro{ho!Y>ZPM(O98gydWh&xWB*dI2A9xsm(ld0x%Sj zm%>P5Cr1}h7-3D+IBD;)_?D2*NaFYRx1Zxee2irAD)LA5k)8-5gZQ#I$w54XtkWx>H^`HDh`NSBd z1Ht^3?V)`HL@A%#sF0wHsNQx17}pKZG@W_@>z=O}F7p0)+71UX8mAE5A5f@o)= z8C1{<4$(eO!%pbW!b1baHT_Pchto*FU4SnL?E-4H8Qu@B@x4FI#*2V7@3dT2rB56$ zR#~*|CT3$}gH&72I&F<)ztN~Za)P)uHUYPCz3=m@Dw7D(AsL8tQtE;2leP}PdTu6R z1Z);yC80c;RjFTsiWRsYz-M9}CyTjSrfO=t%iegJ$%%=Hv9YWBho~qtK?HS$*K~Bi zU(~IcC3V}%4hjm|{*y08tYYPcJJCgzuFGndq;OYTe3GGT^2O}e-=ErMQ>9-vFCIE@N0abz1IGg7w5fNfaKaWj zcMJ9MX%b)0w%3%MS5j$;>^Wzk7(Fx0pbKax!vE=>r^v=h8eso#FTj7I92l6a?Chng z??i<_xxTv4DsGi*~e^XZnGl4V2cR2@YTSQ!TYkhQOz((Y7H2}jL z{U!wktc=eI2_4V>3=}WzzgP`L4f=E}aot|5=DQHo(t8t2px*P(r|@Sk_){R7;|d5( zrt3!X3+o13;4eZVL~{m>SG}vIEktv`Y8J(V3ei)kYkzUwV6n}ae8EJ!9KRM5LWC92 zE6hy_w(80L1Ge2NWi+pTl{)Z$|G$|x>i<6TVuH+DfB&$H#qS$y*U;!}*Lzf&{%|4d z;plCUPp`kZm?>W4%b$)e;JoZ_K)mP@n?>}J_y2v+h5H4aXI4bGpF7xQgKBPhHwpIp z^6%gGKusSiCOy6J)9>yOfHRJ1s+>Dkt)9JS5&1j}N7=nFEt6G{Wvqubv39 z#S=R+aiI*NIlT|_uU{4hnj}CacBawYS#cHEtoRI?oDRq|{QTbY^-xWjz>wY8FQ0#n zDF{mj&r4|&m(2>&PeGz^)c48?qHU6AOtIM}h8|zo;UQ`Bh?d0kxpDD-@0=S}GXIUk z!@ln!o;4Knl}Kpepu!9P1YL{hT$q?oKO%M{JN@(<{{k$$OkQ91LdmnENU=%po8;GF zpMbYigqOFt#T4>i0p1U?&tdg4ID0uF-*MAUG{7#m;j9a6Pgr?c zy)`G`all?iF}TnXAdoznNYSQGzT*>fuK($Z z{i}@9Zv~v)&cEy=4dt^x4aQyT8)R}s!vb1;kWOjo*+0Xw1izGHRK8FZ!~@+nW3u>a zoFBWoorLRyV~oMP)8tyGmTS)HAOd4~E&>3Q3IpRJ^Fm6rsHLJm%rB; z82M4+r+41)GpwU!n@hh`j!w-|7ETCLc17Yllk2wKdc@_d69T3uCbX&$UFO; zvL2}dk)##zAR_T(Vj`<@0(QyH&Ar7hU}k|1u71N4;GT-T*iwz78G!>L=BxlK}oV0+k|bQy01kE0p4if*%fW3 z+==O_Brh6mJ1!b^2CtM63Koo1gZIlF!>J$!0y_5_2xD)|s2)u^X0IOfe?Su6L|_ez zOx`ArA{aYkDaAcpEazk4%lBx8%LH*ENL_B0kT-<@rZKn9;sPnJ$9~PkfO-0Dwz@j+eMW?pq-6$l3UB?+LHl=7vXGvNUW_rQ%xJ$>~;Z$je3tnmj;**K(N3cq1X@^N1IvlVKzCIdYb{GWP?*W)SD@yt zx2*$uUr~;M4j((~qe69!-)ICDEED-rZ@aZ{M1p7yoIs%bZACn_F|#FVsH-of4a2MvEky!@O;zvx#^KXxrJ1$` z-VyZ)KOfg`Ml6Ml0y{vOJ$Y}zY@9J^g}mN^**50%x#P(m^UWB3Ui52 zLi=F##)rZ`p%@$Lrz`6Y4!u%1HOTI90WAa&XMxCQ;q^9^!V|}jP1?{SiLJif|IAEC zOg=WmLB8U5?&uakhYuMtZ7pPL(*A!vNoWX_AVjG^mc5%74$=u1*`rz-MD9P&xz$F2 z;Mensml=kPIk5y6>g;N(E=IamB1hmYRL>+LWQO~J4f>_K}?~h~)YgAh-??cYqJRKd+ z`##gDSyYcDZ2U1wD8q;JlEePBF%9#Gg!0p<5g~4O`f_N`X~R@Sse>tHwBj}D8E2tX1ID;V!4i55wPOw^A0}H9O zCeR;JT2fL{Sa^JUPfSeghcT8y_rJ54=wqTM@>y;W0}DYr*Wi4ZNl*X2r688XkL((1 zZH@d%o6pqDmI<=1zWCYI6Cs%c0;^yPlv<*7)AdUl8nHOP*|G8QbWqU;RZH;o%W40_ zt+D(K;Ro-Q=w8E<+k2V()2-h*pkiiaZ5_=Q&?=xbkLX7>ia5#03e92)3rT;C9zH)K zf8`=2Q{l#vcE;U!O*!A6i&mfq^0lEoD_V82W!Cs}kTo-~-$b|!}ZlL`LRFU6+1)tMr zCA4IJ@i=W<`8={~DzQKY(9cuQkyBMula!bk^a5N1y0#h(y3zbwk1l4dPrJU6L&jkSzRo_M0_Havhp8w|mW51Y!YHJDIL? z#)jQKaMauR-)h!^mcGDP??}t#wav{kjT(juBVhA1cmmy#LqyMHSN#+JzO?gf>MV-x zWN(`USr9`qx4Z0F7Ird*+t({2HeP7>)(sPgG+|(U)5Z?#)+tQSM3{0k|9ty%6-Ckq z5tPAMWf&i8&14OR5VDZ$@@KFC86%zC+Izy;vb!Q%rz{X|`D|_l!9=u{ZP%cbkM{N5 z%nOE}Y-Bc$A{7Gq7F7`Z2smK7Ak)OUJDy_Or%*`MHuNbe8pdN8N-^iQ`NRS$F9UmC zpDMnhXXj$AXS-W4Kb2%MNf)#u__v9@np{UL!;^@Xr2o{5-^bYA2F+vV#Xae`tTFq&m;L}A~9=@4+B zcp63zdWXNw(m?fKJ%ezyBAuJ1GqvGGIiLrG_+uq0t|Zt?nQgw>*OB+wMtV&|!gceV zMG{R|;BPr7`4zm04-}&~Gz^sl45uZO;J2?ouHQq9BkhtD+ic2|y$9C5OUK#q#Sn7F zUbm4b((dn+b%|hfaO!?^4RlL&qbJI)e{IJ0G7=isgRW!i$4#J&?9nC(spoId1>n&W zEZjR%!>o5bmmTP5&<8C!l1nJl4mcILl~vGifZ|kRXK< zqx=o`UJ)(_cQBNa7J>mns5w)`97%aq|93obbeIkiN(n zFkv!;_p4|SAML$MFPnmi;GD@aU%x*QqH)xSa+SXZXyx(({l%emez8LGOm-u%DsR_F zGGl0-jq=g@k-@Ep2;a(QGStatJ$F0Ab&aBODzN$f@W8r{L{ng680Vi(fg3fZ9R4BM zS6ZSLX72?&j9lV3rm!EkO9&yZ^!g?2ENhJaq)faU7q}qM${^pl#h?psq+up?d_{7Q zTz0#Of}cD+XYtd}n43h}nUuIw;nbL<;2R}ZkfUfnE|YZ)a4__~&6z705B2K_r4kkLy@1@cum->0)62uc$?m=3zlQW#6LwS}b>@TaHbq<${OkGrY3 z?X$g5D(lB2==x-R3{9>ij72b}dBBuls#vm`IR#V*)AeW}JR_wByZ|-B2rN^pE&Nna zo{&J3oBBdq*q$vXh4*h#cGPGZNPt;rA#rMjRHrBw^Gl-<1=ZwyNxgD|bwf^el%5Gm zpPG3}sEm*g%tC00|6=e}Lc0R-Ga601I{9B&bG+{=&?YERJGcs?Zyh$1=VIT`udtlu z+%SZ`3e^G6S6|0L}vxt0biL94J#09ULtHJNVo{Ih*oPJcSC_}09B&_YsH{%7dz zvrtGy6$K>2emHXh3RA@R&q`tjckHts4kbJ)=XpbfD;@_G>65(@OV?<&7o_~1SUjD$ zThx$25?ob;mC<|>WHGp}?*eoF&@mL!S=vR}Ik!vX|6zeP$dhzL6YCJl6CH&NMIbd% zAbcyYWSM;tv-$ap%;0l=o!3p`D^Z1PkC9T)F+MDXeOVvNk;G#0=azQ7^HnrIauoK4 zj?xd#Vf~@Kxp3lUd+*wAb)gi!+poRJRFfO!^NoO;7uv_8F^I`{6clx!^jhi)sPX8= z|N1~OeQP5-Q>~!FKj~0 zfoXk3brk+OL8Q{pWJ-H$NpK2nP=umoRZo=UW@|6gn62Iry_%nC@~c?Jjl%zZYIOLi zgchk~10Lepq4Zt5#@_D>bw1l!gAxYU_4W?k2YcX+CB{zXz@oNzuo#I9<)A|0KR{&EMvQNh|*reC?& zabPsJQ^()CP0lo9Nf#IP(0(+gt3%*#f2!bfT9PkTQAN3H=Eiu*)3jvy?;Rs{hB{`y zL>6mQfXG=8Osc@LwVmDt?1#+_VeS^nV02uKtYY6WS5WEQ*=r?iJ@>)8^qI{x=V#9x zCAC|u6@fSoJ>VNOM?9L02YP$f(e!V_`@F1yZP}ni?slnc?!KBImc*V@O~#Aj5Aj_Ta-p7Zn)%erREA$58EX6rr)$m1W&jr~XlOrP;#$QISN2oKc?D$FCb zd!agJEPMyIz943V%cq!PQR$82N=pv&WGS6U@ zwief`0x6iKI<(dE_ZJrO50estl#JE_Rt{2LYM$?iL|-*jvoX7Qv@IN5rL-29p6^^Z znezEJq!7w*ryYC>gb_%jnsYG|^b3~DZNs#NDqSdn0#N%r=YYGdidktw3Z*mX8C%rc zj}z7sR(xq!ngN^XE)9N->VRcZihC>@`!W%stFPe$T0cMA?wKCmG)O*ipJh zpvme8z-FOyMQ&`1bht!fc5Gcu?tTZ2warwlThS@hrF%^#qDh zWNjG|LyahqB@0DjQDOxJNnO^Oe2I2gs5=A65G|` zSlB@&C0xoKwY9F+O};*urxyRIPlO+-deP#fFW)>w%TEgaolA z+89q$m3v`E^y69<7}4}INN12OA!8=NT#;lA{>y?5se7{~d3~qMxmD~FDkNocQFL?# z-VG}A=^lh{T@vjc{V)d}mbo*k=3f2+3HTw^Z==e)jX_rS2`{% z#{*Gl|7ak?RPAHvhxXM#vphDbPy11H5_h)!{+LbL7^*FRS}l0zV9@x~vSyy$e1aZg-EiD>I?Qj)oUB};&Sp9Dv-S;9cxMIZ z2j@Ac&B@DyYXR0i8Zq}zqkg;vG=Z{76%~~-%{u1Tdd?3Fm}^WajI9I>2*b;|zr|nY z3q_z>@hZqHm{+xsriJpH(qMWrqRKutE)pJ}cSaVono+gP?kbGb%LAxLDlu0?P=05#@$^{*kp?i9u zfgUtif)a#Rb8}9PFovIs)Bo0taC255++9T0t*K5$`4W#Z+Lmy5G^)1^69RIQo2{>m zg(F;j!wQNpBVOjW3fQkIRpdo~JJL8_>Gr5L6xM!MI*a%}q8rmbYVKD9jTQY`ix zYxhy)0A}I{7KzyQEIJ%lSJz2R`^Z*ZjQ77S*kKBai+OJMD#OFVhPXC~ipO`(-3&A+ z+!>Rly_y%d9lSu#B@ppZ?l}IfF+H@+PTP=#NU5mbhywX9#Q*H##3H)DZDjFIiE(Vm z*}zBLu?80Ix{R)clzlhRWwkK5iHk%1U^vFWQB(yN|FtW5y3GppHIh73Ovz_P#sg=B zwiI)-?gYso?%}SkE>HyL10CDo{Tw#PulXT1bkJ=7w+lh!+~z+m2%vQSWWTgWIyyQ^ zB{4LD+CS*A0Qw&5IrZ>2{!pAK*rl>(^3KG~-)DQVWFk;AJelph=4Mjv{fCjYcP8?! zHMp?we@ozQpQ7(=7jh zrRyxXf(<6T0e!BIpi$+!MvWC{p80RhqvF3ckKq5c=5gPt1*%8?2Z_(&3{8JhS+x!e z5tc>viORdNz4}?r3Vq~UEgC6uohe4h1GT21K{+f=_k&(4{O!C!j%<~8{j3J0N9+Ew zGbu71^3HNk@^%X6c6uAPlKu^sx~<1XX~8hPL{G)fDVY0J+nZP;Qzr8OdMV_Vo0(aN z%S=j}yU}?y)F-ojdA~V`p_;mzhmfazekYBQn!5BcRr367U(Hy!ke$&dQ%jj`=Z;|} z%w!MG25g^eLvzV)7H%#og!uI-mag)g>luclr0mUdfxFUD@7dH+3sJcNy5! z$>yE(E|C3ei~MWSj?1uQA^4w@7rFH`IL3|7D;L>QOVcx)_s?`mdhvJMwF?gGlyn}w zhx!N~p@OeRinN@lICD=c`MfzBH*Y9AgTL?LZzg19;5XuV|Cl}A%4Ub;Z$9_3mHFB! zg-zZn*0r_t^+E0Z;?Bv|xv%QOgwYj$cg0(JwnZm5`LHe)SmFNVwz~in7k?{7&_Dv# zjwaKi;>QmgQ1XLRR952uFIGoU?f=2%u$UsB;G&9w5o-0X6|+zyg_ zZyaoZ^6TJlgC%m-sU4s!HDXr9f88tVbrKKN74)|%HKM;ULVYh{%+iE*Ucu1iYKKz6M7WoW_>S*flgVAgjxsZ0tde(mwe8WEFo1MW=qsiZjzaAQ)q?pe zfZSis#c&Tcu7Qf)II4Z2F7ps%_I9#TM_&{@F$`dbTF>g8kX8BIYm*a*AgZzd?V{dOI5N8zi-LbE|VNo4p5)tClL*_V{#pYoOQ(xzUHY) zV3M($a%;Q$6#sCnP@;lY+r1e=X{gF|X03Y~J{`w@SKOI2>JhOj%`6+Bfn&GI026^v zC@3(Z+d{vfOOEw`Q*#6R78{CyQkq2F7wSk<7T=Uo3JZ#~#s-DF7o5gavr(^K9SLVp zxiU!4xSOWlP}yN*O!D%0PJTpUiF_T(8lut&_gS}m+n3?kqbqyGa(n$nKEZ<`rEQX8 z2%{}aDcsP;hxj&RF3!$miGW9&AhMmy#NVoHs-)BK>CRb)SvX7h{abZ2G zuYX1+U=`u<_%&=4u`d@0EORa!i|-;8)GuKw%L`h0bd`_5P?j92QCro~cVgAS;cQDS z5{CJ&8*2xuaFN23SoU7Gn$*2@-2FN;yV?keV2MCP=){}8hxVb5Y;nvouCXfM3fm9Fr*C&)g*dBAVK!(DON(QR_bC(Wfp{iu=8*nU1J~{0^CVy4@N+8B{6k=2? z8ygo*6I?_@?OJA8H`=-58Lwb9GeenOgTC3G`- zoF2aAJ4;aOltGPb;I>X7mc2Z1p`hvF{PUiB35gpS*I*S%q1>y%eCeBm-YZ*q_|p{g zKO1|gGb@&T*|RWm36gCNwZ32MU@#e8bzIqwunS~g_WD56kB8b1ydu*_rLFjqNb~YC zDQt*tTh(*VoQLrT5^w%s@w1p>AAAL`>*GB_b>CwYjB1w)_Hgk z54J1li4Wr8y%9ps=%M~BV|}Jpu+?K6hbDWu1Drq2Sc&zk`~FogGt=Mf zNRH5BiIrRl#;j3z7I6g3w`>k+*KG`XS>d$K%(6dls<4(0cP)h(PJ`*fjqP4XU0Sw| zk~|O;+oux)YfkLeDHqvU0D_Us-M0;|A4X2=zeM(dsZS0LOEXofm}O*2KCd3h>Vw*h@?X@}RN-gra(Gd|I8oGZ+d--l^Ufb!Kl!Cz?720^)R*e zB9RXj)HXX^$yOs+R&~FKAh1SOTi|J2c@>11!*5Koi{D|$);Kl(ivfwYN+-n=V$6#5Lw6PDXauIOz(fX6Zk+kiefL@eB?bieizEm zEc)k~?5kIkaQC8P{tk=^em#_fJ2k}kLj`u>OKAXV(t$ao4^f{p6iZ(Ryl7l4Jv~9lW0@4(sF1ynttakx=^dOs%t$(IPTy{Y)+Y&cWQHf13m$D>gsaVF5>XFu z$Uq4w#oBr$KW~xJ;+76+*pMp-H1Of`N4>J%^NgmTSLVCGeP9gNq45p0aK3|AN>@RW zh$JHN>PqTr$NfQZ9>HG5DN)RbEf_)MCY1PvMCS;{?T!$lFjy~|`fCtdYr3CCHiXV> zZ4$*OfxDv@iDKyB}r{SMAX4Dr568w`mn8xSssnS%U<3!fIDov7kP&V%0!IlHknYQy!I)f^YB-b#gkOv=Zd)$)~z zmMfKN>)$%vuP=vf_~};l)=4}=KuETzHe-NSPx?D`n)tK9(j^t$NPN7pJ*;>;`ELnF zuUz1w5+>J|`^46$)00DoOWs{LW)6^|5Pa$`0%70G`${UltHP3~RQk&3XZTqwsFH)x9j9w6C63;G3n4iWuP1{hor3+hed#aa=8EW@Ko5xlB;iP zT_hNd+Yea$CZT5Q{k8KyU@W3glsVjhDbOeEL~jW z-TBZf)`P2}UGHB%<-D=bXqA??no0d+5cNm*Jag1T2zOgu1;eh5HYo0CtqEfFv_nll zPHY`=cwMXC7Q4M>;k3V#2qmf)LN{$5KxY!Lw|q{(TZr;?ol#DBr^bwcno0i_p&Lh* zQSRc}NlU{_`M?5dTPeJHI$3DE%jV;uLzKYsk_X*lOIz$F6gfH+BzTV-lE0BV?dzX| zNkGO?F9LZVw3HI2{fGY%owx{St#ma-$a)RmXd8?n(zLkO!kGt2O1jS&2vgbp}c zpuCo2XcaO*o&7A+GnQ)~iB!cgE<*A2HLiPYFkquIu++kk?f!`+z{g#^qsTAE$BLgB}}OG9qw>cCNp_ zAIx5SpkC;l{7&8{%~GQUhA%X1tsdqt_*6Hm4DZt~@yyEh_ooN~0#(gu5~qUv@0B>wyheGbLc9DprB^^YGsyTif98qj z1z&_`8MRfA&>MN~T?cV4g?o*G<6Cl#>Rsas%oMGcn%TD=moLI2R2Cij)KiqTt1#M; z4^p)+zcLo?%ft#tN4~kAJIefUeuo+T>4V=OUfJ$dne)2z?c5W^o7Uu02r0JgL3X^5 zmA%7l(677dAys--OIpDXk4Fb^S!y#<>(CL|NZx!~S|$?;KW~UD8;6+qUrlA{QVqel zpBJcyU}4!jBk95^bJ=JK=^O9%dO(Qk$HQv%;MYZ2{M*A$oXNLi526X!#p6Vk!;hns zkW7C#O=)$xuE&mByLjbxpXYTIq%`HW8NQc8y2;H zS*oa}i6IpCrKDNLQy;bviQ8@xtt=}l$@{ZSs|*_mmO7bhd%+HwKhn_i zd9!nqd+VbUYbZ=ZV<>H9l2xV>yoj1xWG@N7eI)+Tp0(yVsVcYNk!y5PK^wjG&ZEQ=d7 zF+4we9-`>hx>!c6@#y?RBa$43N#=Wj9aah$n#x=zOF@b@#@-Vj!5Vo|>BfSi-ai>WlcQ$A*<<3>_{-*mS?wGt zbmBKAS?zJ{T%Phf-s-SZ(Poe99R25T#79F76`O zE5}z@8pn++rxOg&2$aVk^rN!S)s684i)K!iPzY^HDXId2!!Ok`c-0&7=G_N#*+}5 zY)6J2ZOafv&Ljk@s_hLF5XeBE{VI~OQ9h8%5N7KahN=0|adIl8nPF7CW#-IFB*SDW z4EY?3_Phx#9-r`OVRLYtI!k6dnGs@QRVHFPY*hSEfo7Ys!}H6DoSfm9*~g{Q6X=sD z5$V?KHXg$2tM0ze5=KKT@hamy%(r>09~d;bL#wT1n`{pjjZ3o*pCsBv^+{b}pM^t5 zX83xR=!ODMjrXSVvU&4fg>Xn%T4h3Sw*9y72XYsNW`DZ)q?@f&@YY?+J!h0!jD#RP zU%hiJZ-3ZfXl&D86d7C0_H{p5U@CpiR0Oeb-2%r^!TE>06e)`l(?YpVBWOv{4i)G$ z2CT2%yx^F>l_Gh9Xc$P9rIz!lz5yW^t7qK?`4%@yD~5z7Z2N8|7^JBRo=e_3L^N08 zTe5ke@ZSj_LeJqxDB7}VqqHAj#IuHhKWf$&ng>%p>pe^?d~!3bQ6huenttx=eS=ip z!4ekU2IEGsc8Y)$lU^(_VWTQD?JDjSj&?(dmNpLMY{&;rEh_!V0V{jA(-lM>FdR8f z#ka%B*IeI;X*y#Lc$-!j5VQ88;@ed_DAAK5Cefjz6S5HQVCM$q+nUzwf~08LLh4qM z;UrG>k7ko(J;4zLWM9%JRdOWmWzReyeC?D=BEpznLi*>^7vp^Z5d$!=&j8d?QB@Vk z-+I_X?lI@w3!>G>K~~@Md%b2=Y(`Cg04`yz4ZiaVQvH`s^OaI=&wIuE)>Ex4yoyr3 z5S>(59x_^oBbu4vdFwM>;0-DHCz00?C#R_lOnP|#_@%PuchzfjqdHZN&X1jW&0@m1 zCKrP8w#M=>@xtgE_U7X7fMHo5Ptt3z)X9Z5*h6V14GJ**-ly6+J66J(GY=*Y^V|Zz zu&Bv>Rn$yzEt}J6>3I4Mu>vtGf5So~_QL>Kp}M+yFr9xmOYDxr|Kc80I@ttvy8!86 z9^^8BAiZ}#@%vZ%696O&;h!V}+Qd(FAfO7w1p#)3iJKiB9=Z=1yy5KkqlGwXU6-Im8UHzTY|Ss4YW7 z0xOX`Ljp+c%!MB{bam0P%gguRybl)mYqridWqK#de$@Ih>(l?vSZsNE%7iK<(%U}r zq$lI9CLyhiJSE*H_4R5Yx z;hM)vy?>8z6lwS7{ru0h`_VkV<(M(pI4r2pH>h5+J)g`SPhUPJV@6s7k=1X#i$`b> ztzX}p8i~g=@7Tu4Fz%^&vbq&C&A%{Eq<*+FL*fcsw|&c}n?26z=0!rYv6V=eH8{JVS92z8+p^OPTZ^ssz_^vx zP%(5nkA~*9+~AwzAQle?`eFAu5^I4kn3R;1Fa2=?{o)#Uh2c<(dLEd*e3`HHV`9RB zFCCtcGB-EZ+1bgtzo*f#Lp;NH8lkmMz$$TfYj5>C#bfHk@spyXZFuSWlNtTkx`bHq`{Q z@!Fj-D_5nSE!742HWEI~qN24RdB#0>d_g$QzfMTpIX?hEgK+c}AiRO-L8O2V)6M;T zM%9zEGjgoZ#rOa+Ko*%985xrDA z+6We`%;`b$w|T$D9yzM6#_YQnW!W~IPodQP8qK`r^p165;% zBTHsB0`Hfo%7|wX#5YB7Ae1S0$l7rif^>VmAlznsgzUnbpg)wO&u3w6GnqPM-ad*{ zy;z1&z@5kEya9&o$Mz^f5AK&mtg;XrmbXkKby5i!md4-x7|;B1%NFZ6{`TJLoRRT} z!R&|HwEnM2~PB!V-Vdfyk1LSIaa9sx z84oL5T`-m$_}qDCyO63ByquE6XQev*WBFQ(-wJ(UcIM)4f_PJld?OkufIVzu$^Rqk zsJB>#jp|(b=UR{6g03or(>Cf+RbCsabp3<2HtW=)Ge6&8O32;4#BUyU&2gHw>*Vb?aB@2>=$s|bQ4IiFJPBTwJ1@O%_(iC08%9}gV`nGgy!JPx@&IiFY@WK7nt4`h_TJG$2-+9MfHb{$zq{qs-`U%C; zQB;UT`**%X2RkRBispq?w&#&ayxYt+tTG?+o30Qk`(|bRSh@K8&0xR3AS&`GKdmxN z-q(ptVhPc7g}Hp;`4nA{n1J`?cHi=|-A>r|(Iz$`U+VJo536a3m20c2k1SKjE*2p! z{(Pm)$F0AgqM!@7AhOfE34RET5ZQly{{kr*jxfr6Dx6&jqM`x5$`^x{k+JaeXC32e z(8M&10r~F5N}rvMO2p@?r5O@kf>?v0>#73M#>;blTZ>hjM!v9-CCdoS`FK__=u zoUqKbxR9u-JYxHG!brk)+#NuB23PG#5j=ec~6<@Gkx>ALvlf>Ve^V<;^70$_JYh;(M}eNYI58<7_d1vmy;! z7oz<8hzFeahq<2hEio~BpeZ1xzFHs4{;_L$biu3p@u&hhK~nY2k<{Z*m`q9v0`Ar` z)#-~eL?$c&72!!p&8)%qiobXUA;uH~Q{Xq^ai`Z!wENU9rOnxhk%sW^Dr5@ev02~y z(@TU+^LF7=K7HR1-mNH;UA*vXHiPcw^&JRh$t{>05)b6@X@fm-Q}Pm$VkGyG!=FWA zLPLVjp==BLH2kd-NUe=PnSvH+SO-VSZ-EFap+6l}&CBf8;B`6yM59_7y)(=9sB_jg zOr}jVoVQtxc)_w4t?i0C;h@`iblk!m;VbK(FEE2loyk31Z`7Ia@3HO6XM>?0vw`M| z>$#D5-X9y9GSaR;{xD9@Us_MGKorkR-f_aTXXi7a^D{?+K71@@u!<{N68dQDf~Mj6 ziM~k=_RL?;ztU5FKzo%C(~V{G^~HT$K~$2Ag^`z7Ud)_Fc&4(Kdths>0*97XDfS(; zg2YD-Lxs0-x5_dcb@$kyO)WM`#ONX=X+%=bJyMH`1N)fR1CPjXf!c^~0p?5*R~d`A z&~*ycY~Sdmotsq&0)&0)oTOL#!7i%~35#;6??`VMYYTy$!*`?~dRNM-^yogN{JTK* zva-bp5+v+!wkXW@d7eJrndkMoY)_8H^c}dlf<8(Mxmmyya( zsp>>%sCLrTtG+4IwiPXzpOEa{&GCpOJ$Q%ufOUGXuTH{ULsy{eg_Rw_Kf=qsSQ%MG``gd#-nuz!iye{T&%96%xoE*~l8d67 z(SHyt`|6ECn!(QroMcZ8(Z~r4@X4=z1FxIyJeaP~e{D@5dO9{gq+`eI?H-M3`17YB zRi~Z|di3%YOo(Ta?fm{=^^;cPxQds;6u%t!4RZ5Y-c#ls zB0{RY;b^$Tl$%kozL-wJ*~rV|+Pv`}k07<*(TcJs;Z`DgsWZElqT32Ls#QGLs1~+n z7#%e@lsY_^>vbTqo-2ijLYZ)bJo7i3T%nh^#~ z;u4+&?hBUCXLS#Wt9psOGV{`=-iwD+7L$h&SSU>8A#lH$5$%>^ZlVm+ z^^;a^EtwQzb3I1PVbYTHALuZV#ElHLd%IMHwII$R0s2K6*VOrH<|L11PpF8ESFKL! zd8RB1#At64alI|sx01AKGwZ<4(|BoqMHIHx065fT13?O<=VlFJWhTKRvkij(7z46{* zhLUa_-1Z~z&8qkv;G<3a=12{(B*fogZfAkA!kC3Bvab`E7K(C7xM~A@@ZOaj5izcOf4KNDF?Um%wfFW+1mpamEsz0 z4X5^8-%z`|uEg)~@u+kBO5G=yva7DbmS7tzMRGfC4!COd_wn|G8uFQfKT9JJ4CCE% zB}r>XkYYT_Z^X#ZzYn=f@E#hz3=9lCn3!CfAY6sopXfCe3(m%34v0}!$HrXmX34&w z`NjMzLaJ3?Zj0y8;&PImQ#EV!*2?z#q^J4L>Wm1#zn$gx{Sr2LyH_WiEmRNGe6L6Z z|M)Sydq8)8dby}!m9!cbE7^A$#N)p3D$TI0q`LiFW~04n-NMS{c{!P(;ctWhO+Hkp z{5!hgI@zLwpIrb7ZlQ&()I`#&qdLPdseo)e>mPMYEJEDQ}d!Nb@} z(QcCq$uX(r4IcU_NcYs`(3qM~3R_M~Q`g7=+oI-#&`hglo;~aAWoEKD1XguU+69)Y zd`oez9irzpK6eW~4c*;{5br4%Cbrq^E3H$%tU6$WP-Wjona*^^1hrmd`Ib`rX5P!+^S0982Y>#(Kpkd~_?0c!`*yKPn{e`=d(` z+1Vxe)IWKxpy_cjEruWkOX#R`q!eyH8yO4y z=7t4(Ji!FJ?D7C=a7vj<skK?j|OP_``uSe~y2CJ?4 zf}hGvrbOk9Ke~*v-VkzvrGxsS%7Vt)MA|TZ=T3VKR;qJCbet$#@T`Y1OK79^MO(1k zFKT)*{4}vW`H@lqTnK8_wFaG(f`Q&DT`4#XiG)6U!|hSaR~a<#=D63m;(=Fqe;Q?= zzSXSXSFN5Egmv`Me512*BvFigx-(gVMo6R%DW%? zSUY>lmk-~Cmkn$8u?06ahHQm~1d}=Mn#<1z1zP;HH*pm<8s1ILBt;ZUz?*;*<;An0 z%n_czM5UIrz^6entUNTfEl|*pdUuwacFn)~!q3B1zySsQNVG7^t;yXq77t_fO8di{ z%z8MTYH6BE>aMcBBwqkM(`B!M=jKzcWggA!+Wj&q+`v65x;A?lXH=XOY5d`VGe6WG zqDGnrnJ)LQTRlrr0#ixAS>r>Ri{OY>q%}0sWL91TK8#plIkM+pHf+4W(DOkEe1Fod z=6Hi`x^n0ly7%=jJzA4@-Mxhkf0HOnE6Mi96Md`bJ|a=c8v8hRNcC=x#US6F={OD*nv=lbocF>epMs)}$wdIF9Wj>-nb+5@P~TwtNK@dwR&V z2E7DEosw239jO+qiMC3rQ?#)-g;!hJ%TZO7q6;Qbi_lfbKpWn^+D14q_-Y)-n}f(f z0y+P&72{Q#nrIpe4z~umP72An?_;zstH{m~qGTo~Q52|8kVOdLq33I%wG0Z0#J9N> zIB`;I=xAL5{uRF(9Gl7B8<7zd9~!hR8eB@aCMG^M;E$`8sq*`Fj743qUol8EC8D+F z!5`-76Nw*hO2>ql@R6SkV<|l)U%l%f{rQ-$@u=iQZ{jmGOi35FSS%lIn?W8`*TT_O z3B1HpsR+9cJD9M}nqDXt`Ad!1v|2aC+t-3k2T~(n=P3x&yW+~!5gG_nZrK{y4Qfs;O*@b*0aw?LBH6j{pRH#4p zz-HCyEe*3pWHi!DqKCfZMk7~BeS~s5?9J-y_@^fGzvNAv0_|YAN?xzNdWgF~%=|x- z`=$?}&o+WhA+>ymt=;bjTzXy})c*97tB{I|ZeGNt5!&(JR)~nH;}&N|?;q_^ zruprqARkjpUIGIPYD9g+Q^9tMDpXXWKUZl4+;84vTRSoanv<-_lG|Vnny4bHQ_#N+ zxXdc03mP(waP}gF)EF#e8A9uxrkK#atNfgLmHpnn$_L;nlYZTi_|FhWTKHI$*zEJ1 zC9SQ_xbBmj2!|t;-y9PJV}JFmRipMU`y|1OiwZiO2nnI(A`|P&p9WtIh5 z77_9)4jaXA#V}sf*ECyMB!dMweDpn0)c9 z(gHvfu>X7m-^$gmEh;Z(w+R1OW!_6Ay*K01J28plqt6qhk^O;!rkE9Tz#Q%NfMVGiw%ve9|l&f6K<09zXKgq)U$+31SEx zNKP4}>Akz)H$UTCYyc5R8+*o#)jobhe`s%yJ+jg8NQ0^YyMgfaO=gRRTkTfZX@ zfB&`)Q*?F=PdM~J`5pcw@)|#$>JD6PT(OC114V?Rhe~bsy>~Zooxc4)=8|os44Os zwa?iAG!B?Mj9R>3>*>va1Ckcsiz5(pt;d!O=rUqAf5si^eZW2y0|NutwmS0QO&|O@ zU2(pJx3^=wPtBrKuojZ(8lE~db^MkgACKyK=IyO^6lMKJSI>?#)X)-mW!ZkU9hFa@ zoEAWL=UIEaZ?6LtHL|48yQ`^a3BkDjN9Bb~zo@3oU5atiWQh^Iw03mlfZ+IXpd^Xt zwM+zaQARhy=9cp4M^MlL{M%7G1O-+L3Cy~SFtUL(K@3}^Qi}O6y z#eqytE_>pKe#$@%okiH?FJ>mL$91e++k_LWnCHE%nAEpod$O@XR|^pOPnYXNp#XPO z6juPo81OpBmsC+vv9~Y#VgV!>urGj%FPttT^4P6dC9H4CDIfL3>*r#>-$>=+X~bKh zI`#=OBg)?LOl_B*T^nka^U#M++kSYO&&*wcQq> z*97||c_r@p(Hv1-UtJ-|;y~3HJS@W<8F9+LjWQMt>P1MjGXrJ`vZVw8X=P@vyoSXR z_9yMV8O9{rmw#mf@*yK6PPm&2p&yb<(E|Kp(4iF`&P8$fU5awd2x$X;NuY}Jmdqf_ zP>kvbKh-^(K2Cw!i!5uHTn(r(YLVTF!Po__LJ7ot@E-E#qec}51j)W~m!PwufH;XZ zG~om-`bXA{#RJYh2-ayDwD7-+(v6rB{(TtvY_7%4)BT|2?NGz@OA#dK8TS%88XRTz z6;X!&1R{}tmt$vl`>CygZ@-CR_i^{u%EJi1mcL&bt{NIfVo-n(?s6_t6deVn3M6FM zMlTSmP-u+=zj!=W6hfFBGPEdVuLr*(%{%-YXT`Pnc0}~cuNG0c_7s2n?tg0lv7c4) zrX-+%@4PNw{?>vzb`%0yss{XOxb*hf&Wib6D3Dr_=1QXC^1l`RpWYAKO~m|r8ynOp z1iAWqkgLGok41q;bn=pcMv9#%K(0Qr#27M}E7(Vb0z%EVoXM2M)X)&O#o<>AMpl#n z?>0NUvm2*~;@HY6dGJON6p2iRgbindNsM8U6>32=CZ%ThHALYEk0hS3-h;PaP!)*V z@JUb&P14XU+bty6{18bNd?5Bu;8;LcQEu&vzgPMS<)6LIBjb?;&=*|#H`%;l!Ah$z z(xIup7x*8Au(dbN&f~?G{QC^3O!xmj46*_v6Qz9LXc4}}UJo?egOH8w_iyp()iA+h zynBzG80~aG;n(@MIg6^1Ijz28qV)c!22o|noPGn{53m<_Er&A#Vb2;kwD>>gFecRL zi@ER1C@b7@KREx^!R8BTBn*%@0**Zay~_?9hXM*2KqssXM^g%)0(uG%jU>>Z1K>Q{ z&OHZ!4$Jhrv;k~-K!F3ZCJ+j7XU{g8N7C77dy*KgAVWpL)c;oDf3>Ercd`P&i1fdv zC5elg|2-*56ply15dPLIQxF~s1vqk}qYJ*yh>LqsGlPiD#K9rvdw$Rnj0Sie`JDv? zkHF+SB89WIzD`6$6#f4{sa#Bg6$&=j&aq! zMJ`qo5Ev{J-)>yMId>Bik^d=s+^i9xzkwG@%Esy{P#AqvnkqAp`^KdYKvoj5qo@R9 z7=L>sE`7AxHg5#H!16*JPmjOz6gx;+BTGF0;&}*;@ay#L_4G)Y=RmR_TtEQ6SpXGf zV`Wtm@^o@?0+2W$aoL6^cL6gD_zwwO;Jc}HUg-g}H?TgCAMgk(wQ5Mi0LvhF8j+rw zdDU|&U@8GeoMU4eN8owp0l7FwfKpn0uEpmJK+*vCtpm7Oj4-vP~t)kR0gNk}m%BtkU|DiRpb zy5AEkU~s9U1V99n(y;=RKuRaAZdhX(HDl)oJO`cASP^5iC7Mbrx422zc_m`VZ6eQ} z^6uas87?#YQ@~-)lSmcH&Oc%3KV==;@t(<>kAvU_#CBkay8;3Wko~Cofitin#k<8A zG9^KUR5FBQG_?ER1*v~#Z)f)fs0_e4JvN1axZ*=Db!CdfFlw=eVqECU3ffVbZk#SI-h+! zwv$lC{+Hvw%s>bL1rY-P{pCCuN3`$zcQ*lwv43v=)M-&1WE6UNHBR`Lk`PR;;&MwEp~z!XDf2RHuDCJwF`a}bVBG9lL{O`E4= zlUumw7OrpQmvwnHjrJFuB=mWersiPLcmbRu3qJcTz*hogYZNB~HK4BU8R&#FyY4N< z)CHNGPk!#60#dYcmS{_D?Zlc(hM0e5;_yeonw*@Rni@@q+%$^id?Y9m;2%LV1gEQ@ zjbWSAEW5qCo)~KulP;IiLSr=wE8131#{REDjc(&Q9b#z?Z%)vjn|ck#Wy1pUKzpvL zs%mb&0wiRFo&xN!6`;BT3ma^CZx^8q&|tt46x~GiLmF5sQegK2>6Iy8I_Sx3QWi_f zS_E=m+ywltJ*A|&78e0<`*rjDlC4fMwt9v>+1bA>x5PU!U#d?tHZwvoLVc1UwAnNC zla<>xZh@HekN7w;e}+Wh^s23|Cx%2pS{|ZgI&%T`Enb8lBoQz508#qAZuG&xJ=HW?Z*8`t1`T#+Kq{o z^=I|Vfu1PxZ8G!S7!pn_s+ zvCs6+bwV(2tBY7IF8qB;X|h-0EUEFVTVCg7>7xaZacmAw;5*1a_N2fwIDy1bWVko~ z^ZLtl$>bRS*TvUu?#*w2WD*$Grgu(Yu-x2bASxUh9E?)piO2Y-bVu{PAXB#3A*i~8 z0zT2xD+3MNCa8Xoab^CSRYtM6xRcU^PTh|FZ>jCQQ;*Bgs}rNsO7!*ufuQm<7JdC;qqBz=-79 zFbg-a!N*;(%h4Em=H+}C1;rA41(etecSHu@gIFXme*&SNWoHORp=#DGP*~NuZm5*$ zTmg|66wtNw1LWv|k>CGfz$AXf$J_gt|J@DfRyU{hZE)|IyZdLYNicp-j*lM$)z6?c zFY1?pfAEv&kO{EGfIh0Lrzbdf_2^(#s*clw$ByqO+(`(4ttLLZb>OE8NjV=VhU>-< zom@1WJXJsEqC}CD_|JEqD*`BHw8KjPsn^ppUZ@J>LR%kz$`G8sJIvPFfWd^A!}yPP zi|hLLxXd>|VRhpD1|(gBq}&)vVUSrUvQ-S+WMJC0`%$?BWQ7gj2Xt^=7yzQdd0-qZ zfAD*qyILF#RT5s1T=>hV)4%O_j5QMpN;CL@%N)S0p-Q){F<{^0Uu|a7s}9+?0C3Z) zii+Wt!>{TJg8ww$tpKJ7{yC?v0%fUqE&;VG~6W9sqieJq&ID@Yh zkh~XwcLvS^2b8ZUS-Ph`$HuBH2h)IECJy-_?E=5?rkhZU@xu7HroKKVG(SJjk_2*w zSs57_v)|IDI|Hqa{4berAusi&05KjE;X@a^x4@7<<=g>e*c~t@31p}gk8HWQP*`!2 zczb(;yFL>01FR|c=9ZkCrSroTILlky-n=LBVrJOy6mHHmHO;QC*JS|>kQD&`8(m&n zT3UWMi=qRomtVCunm}a*grfju4%}i-lV1iKkW`a`8#>zA*;!jx{@jfVlRnheK$L@b z>R2}#R#sckc|hxY1ICe$DupVASG{7l>gwvwAcdaed1W?8PX!MGM2BtpD_}?g5~!k4 zYn@Ne@nYTonw0eGB3^s|p-dnLIEs`<)_WU>P95y*3@c3$F80AJ4?LaZ*R9SX6${tv z{JV!Z|1+ej9wlAD`TwGnj64D>!BR9_PfmI*+0#~%+w-`?|b PpCJVq73p$G)1dzcI4=P$ literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/continent.png b/sqlg-doc/docs/2.1.4/img/sqlg/continent.png new file mode 100644 index 0000000000000000000000000000000000000000..f16b103d21cec4c5f1e805fb3014af4577061065 GIT binary patch literal 19587 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

-gyR6G4T)8w>h8|jUhO9*=J)cgzj_Kl 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 D+PtpL literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/edges.png b/sqlg-doc/docs/2.1.4/img/sqlg/edges.png new file mode 100644 index 0000000000000000000000000000000000000000..999ee9725c1324f459ee0c2de5174a5f02b1e9a2 GIT binary patch literal 10337 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

rbS%1rliHX@*TX#~7 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 aewVTK`NbXulfdMF$Ve!>DG@XH^nU>CzypB* literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/fleet.png b/sqlg-doc/docs/2.1.4/img/sqlg/fleet.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4a95a9c82a9811bc72dff45908abcffa260d47 GIT binary patch literal 19025 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 bf47jt2*oqOlK`F(g(4%N_@wml)0h7rJ4yRN literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/normalBatchModeMemory.png b/sqlg-doc/docs/2.1.4/img/sqlg/normalBatchModeMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..59a6a699041b21dff4bf3e4f71070c4ee998fb93 GIT binary patch literal 45551 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/postgresql_composite_index.png b/sqlg-doc/docs/2.1.4/img/sqlg/postgresql_composite_index.png new file mode 100644 index 0000000000000000000000000000000000000000..c64baecf1a12012061174e6933041aede5d824a1 GIT binary patch literal 40337 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/schemas.png b/sqlg-doc/docs/2.1.4/img/sqlg/schemas.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc4110bfbc36cd918cf36c375c4b27ccee56cc1 GIT binary patch literal 13824 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 QR)5eNX+^1G@Vig{3kp!%r~m)} literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/sqlg_topology_uml.png b/sqlg-doc/docs/2.1.4/img/sqlg/sqlg_topology_uml.png new file mode 100644 index 0000000000000000000000000000000000000000..392931ab9d1a36baa271e77a34108211f8d02205 GIT binary patch literal 54177 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�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 NR1`H7YUHiL{};L^eb@j1 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/streamWithLockAndEdgeCreationMemory.png b/sqlg-doc/docs/2.1.4/img/sqlg/streamWithLockAndEdgeCreationMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..4a86145cc670f0df232b2cba020eb9fb438164d8 GIT binary patch literal 39196 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≻Sl{SlojD_jcR2X?b7 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 Mc8>Tc4r)hm6x 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 G{Qm%J=Bh;i literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/streamingBatchModeWithLockMemory.png b/sqlg-doc/docs/2.1.4/img/sqlg/streamingBatchModeWithLockMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..fee50d014a500df9ebf817e71b6e6478bb74db63 GIT binary patch literal 33546 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/streamingWithLockBatchModeAndEdgesMemory.png b/sqlg-doc/docs/2.1.4/img/sqlg/streamingWithLockBatchModeAndEdgesMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcbf5ec6aa0e85e98579ae1800048b6c9d29d44 GIT binary patch literal 50412 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�_uTl(Vv&A>0GpW+wV7Z)MAXk3CW5jqJwk#j@ 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

|9T3}d~y^ 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tableDefinition.png b/sqlg-doc/docs/2.1.4/img/sqlg/tableDefinition.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab117a9531ca690129828ac5172dcb149847116 GIT binary patch literal 32637 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ⅆ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 a35-L2QuHmkiyQ*@_f|?#vRvFK;C}&z&s$#r literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic-graph.xcf b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic-graph.xcf new file mode 100644 index 0000000000000000000000000000000000000000..d3053ed8d053e1fe140292531c4ceba6ab002017 GIT binary patch literal 109386 zcmeEv2Vhmj(*K^@lic*)6I$q9nt&owRX~(tqs34p5Tpu0>-90lqyR);i<0ed+lJrRG z*rc%&($jh*(hW&MOqx7>>fk=NBn`jk-Xv=Q%83?!B1ZU)PMtQT$Dl#CqYS}m zIlT5?#R0)@5_?v&oCm&@;V~X~xSrl%NP%+t zq)kqnIw3WQ`(jXSf9a8bGuoT#Zv~UmXQ0jczXbfXPn&qxZ3r84+s9AsJJ<{7q>k=& z7vKiK@0v3G7REOMe168nAw2*$#pezgJGJ)^PkKYwIpgmh1{mMp@Zf~${qFYS=S&_m zU?5=RHRMgqxQ)xUNALdFux0RHs+=6N!Mu+bu+D+I%6=`4dt7D z96hyHAHXQbbR})_5big?=BNip-^zX45^#4hR2nVPM1~lHzo}xfP(_j$Ec%FB5Ka+O z5i?dy5b40AAvO(|36j5<2;6U{8>FZ4ERsw&nQk_9H{A+sXVZ-}H5gQ4cIb4J}B5Yx~D)vaq$x1YXwY-3bSOwxYSXZP>5 zfAg3a__zAkeB6B6ydQrH%tf{N&4uP7{8u1);0vVdHJXH4P0+u@w3>7+u4%(pNI6}M z#^0kzmw~!g*Yuh%I(G6)F|{$=6KT&5s2CugYF>+NeXw;0{BTd!(;?wWVhmUvAs z8DBMiV%%i>-1vp@JCS7EYW&K$#rU=HedCukW&ZZJ_mooe?e+FDj$6xLq56Gw`#Mde z2iy`68&E&s)_}x-h5@(Nq)G~i3}_S3Hy{Nuu{GZZC%i)Rfagr#hxp&OHNh#HW%H!b>FG&&)U>3jY17iC&P;o-rC>S8`GhDNtjjkk z;)hz?^gD#;b^&A7kF~gaX9%%wnh=rgYjKS+CWbqN_^dxAkrWR`2WV! zrq4!8re&m0c(93Y36sYqwW)p=kh6aa>BY5}F?quDqzRK#$EQu>{261%PD`6!Q$f!CYm^6b zZC37w;5u`g7L!L$(kDwsMELdV+4I*z+-D+Z^8BlrT%j*T-1G^PC#FrEk};)4YWnDD z(%t4B{6-*U?2ah%-X$s;TXP52RhJa1u`^ZR&V1cK)(jOTy8_*KJxbzplP*uM@O z2$;*Q{$~YHoj=SASJwrPz8yUYYubXezQcs{ZX^8K;@AD!c)$9Xa=eSF5#~gJptmTq z5XmVJqg{ol|AG(=Aau?1%8XAf$xeLaG-jq$cfzbi+{m#tNz1 z3L*6yhuyCm-L|OLN24wxJK>>jgk$hgj;I<#r{0e3V>Ci z5x}?%HcD&0S+o(#7WXbrVjQwhnDKns*n+4Y2*Maly$tV(wn90ly}?DkP7<{hvT-4~ z@eY?X>$sn2f*fU%sG>z6*)Ly1LG49(mUbBl78YAD|7$DC@G5PwQ4(9}s)A^FzUDGX z21&Ex!EG>;{2{WT!q^gA#3K=L`C@32QUT%qO-0Ajl3s!9|C?gxGszyfA+*tEml#m|{v;@U8xo!69 z?<>emitLinyvy>{i)Ts-cE9(^?2)~ig@`~=E}0}@Fxk64@=+-YxFA=$G}2T>t~j>w zjcEg#`l3=*MzhIiz(UFFLKpTT)fGLh@**Gp5o#o{&iE20baGXC%y4%k8%wAaYZA;er&DsNl7tg^;MiMe=9uG5#2tXf@i{ z*eVd!LAX=H&@mt*%^)&O-T0Gq6DpeDRcHqRD&#LQt$l~mZWLNi9hGPRte)$NL<+_6 zgLWSx@ZIKK`$0`dgc&V1Vq8J*^Z#fB7McudMw4Vxjfh1YVvOi?^KpyK9voS(WtZNA zM?5q=bKz^*Z-2b$>mTxunM?*OCQD3_O}h^qJ#GGyw?6yUS#tK$m9p}R$|{#zR`gHp z*6>YTRmQ5bI;!{m56@q|VcVVqMaNEG;7?;jpDD7QID{^$WoM2Y*t2uvNAKhqs_}$iz-*GHi@My+^_YUgUqf5Ky4HKh6{LCUqlwLYn^z*LGALP9_chUoQ zbZ?a$Vgk9yXqCx`1{kbTI0g%Y$%OBXHcCx(68CvrWSUP1wPmx$k&WvKCBz(%7?qd^ zJ`kb7yC|BHz_m9MS`bAE!fgvTpsF#HD3s6z8Y-n~Dp~l^Qlj$XrHC9=(=t^7w%0&t&1o{xLu;+r^Is=6Yrr9`_khNT`jha&}*QVBvJVb&r!QuzB(qT z^#;79OjLZ>R}mE&J^Dc1WGC`{PfS`f`mL8Ju}#~yZCYLUuP} zzHW$Nb_~Fa5KOnJ^u_I@O%nZ{NYm?eh?AiM-6pD3KgK&UvNSN6V(_3fGgVDVSUn<^ zbZpRvDut74>+BWaAtaLn88;k@>$v6_5Nes?h#9s>t{iRebe(R1xU&|1(uwA1nSPW5rY!C0&JT z3*x^I{)E5oR7{gGQGo#Bl?A48j2N(5Ozbgs$6wk=qP4gJ%$?L;yjQ$w_-EywBt5l8 z2Jy~mVF{xEB)R-xsk$G%0CUQ|c+KlFeY2j0oezj|QXJV)gO0`v(LDhlGZOM?^+N z$Hd0P$0sBvB_-Eu&@iQOlcvp@w`kd_RqNJm+O)N`mD;#kpDVADRq6~8*Nyg0oA}`U zLk9G|rF)kS?OHW&)+D7-gZjxy3Gs0;(NU2R;bEa6!NEa+0RjI0cDtYCXYlp&k$n9y z|Ijc6lk5g`R9xG3k?oRrES_{8BQ>P3WGo_8AGFmyZiyvG?p7MiG+*#iLRt@i+_X_v#*9EpC69d3`1^()&mF?jY!sL zd<-DWHUd1;2Fx9Nfj((!Cqjgp??xv9Wdo|p)EFt1<9L)X^Y|DO5_R)nOjxV5O^M-y zF@LclmCMus8D-09&Be*)K8XpKT(TtEfWktx6kEr`1<{&k{{os}x&?(-Ti~+T0BMt$cPg(GDTH zl21(~F_FV0F@RLXrGFStw?%_D{Pb_ay`2K+ilGgl#!&z8mrWt%IMzn|iItxagoy?N zhJW33?g!oAhG;8}u^n@1YkTQhtkEHvRuXE+gwu)t`V|tjxoKpcy-V zmw!3QTpwbt4>7+x#6Z&k>7@S&U?@eLmc%oAc8w8YO(TPObyG=XC5xHge3Ooyy;GZu z2HtaZme~84XhtuJI1-N??tM?iID=>?PDN9s$<&POi?)hID=vt;ox=H;klKuc4&>DM zlX!&>#kFyX3l=qW)qK-!bmfI4){mS@J%Tu2OjzW4n(;`-@;FRR`g}kiBJM;A`I}9* zl3A>Iw?r)d_^dE~A8ryIDxq}38}oPe7+8rt!ND}g(wJ5W=`TNa>+sE|9Cy+vm#=tq1EHYrFLTJ3GwqIvVC zO&X^(YE-{oa#B)a0wy-GnAu=z!!sL9Z2axMJ~peF)nb0S+CidbbY4^3RaefHIDh{3 ztIytF^X4lHGiOpOFu03#9d1^KNG{3O;J3r>?;j8l7!<_QFMa;S)31cY0W z(gv}t%TUI4wDIg2Dyd8pq+VSeuxYD+;>I&kgwj!JEK1W;hu?8a$L7hAApyP?i`fjd z4l8*isQW4;%w}~p4=|y^qf#=_5mpkS$15wYmS4Gi;dDvicbnhKed&pZ$K2JkUA+*a z@CP|S?N!O@q2iMltDsF#IFBT&sH}<3Xs)Z5&Ye73bnxeIHmzH}U{=~)JzB;2LFswa z;ujPVU$05a_BZzEJ7DO@2~+1TSdz7N!xuZg&p&p)0#h>^E7y!}k5)27oUw%^HSgT} zuF)BfJ^$w0pKks3r-EZ=%UA_e4-;ZmxEV~KO@E=lkfV9kz_GEc8Vzgt-)V|I7(?AF)QZwj|CcS!hD5~jEY z37Sz8G>qbkWU~7B2gP+5HYaP#Q6#^lxsVMqu&i|N$|+ravEO2rEaIvyG@)^)yB=Aw z=@=4KVC_Mbrw(pd<5`ldjQjf=+W6eg6Eg#;B*R$!;Lr=b^{bpudxM zKGie9GlJ9?l^th&cI=W01+N6v@Ukw!C<1E$v=%8Y8G5ZKRW!^E>FjhKTI!2Z^qugD zO5cxm%1Y^@yb08R)vcl|@P?OM&{es%w}S$`Xnj ze~IxtB?K?YlKkhcvVVepoA{SeW|vkZN-5ko`xW84Fw6Xn`eKvqU$>d9*8uupO|iW} z^tnwvt?OQ`KT*_EMD@oK&3TAY`{9KpF*&4O(#SuT$np%hrnj7c=3qfutSIK~M3W{FZJ9kh3LB?21r!kN zwJC?hzzruYKU4V6DkZPg3urmok)5@2Gj|%<4ylUyuP9(L-4wa_r%#f-1sv5Bi(Y^_ zZY-&?`I-WHKgeyEzXPmQr-Vr)&S{F{*KK$y>ipTR5noXBUX_y85j{7Oeij>CuZVK( zi18Bn9adE{TAwkM>`Q1ZZ}{q8a=ZHM8KM)5G+LO{f8S?~E9V{4Xz7ncSW43Vo{3`+ zd;Zz0H1CY2K3_t#;XUnO_l8TW?$q=9a`!YNsI~P+yN6VO^Jgg3^T>o)OMo82>`Y0Z zH4}b8I-z!k0s=XB+rhJ^;O|B282t|?w$kN!zQNY%q@9PgR1fqmRO@>2*oO1w493X& zm2lEe;xE)`l&ic)8fxQ7WT0c3JU6A~^PuaZd)lwaM&~+Ow_S!$l=A{TFa#Z5-fBXr zz+je-7LZ>};U#?^s4VR`N39Ys7f!6doF*kZ_a45+YEG7Q|HtV6*o~M-X1L< zy!3mKl$e;riLlL}(My($N+PESwWk@-?CNSFqa66q_m`IRrsTy)dG+?C-`nzk`sv60 zmEdKFz@ANt&?=UN$4{4p)pUzQN3~LcY0a3vG^Ic2O`xJji4LNJD=TPzb5^HZ3c9M& zl>2Hj8EC)T{Mgqc8zr1@TSmRny!kSkYhJ%ryh+qQiQ4xaJ8s;BH|f3`{<_$3PTv91 zKa+vZs+ULHaloCvTcb~3J>BPBqOCm#{mhlxxs|@$xJlYnu^Hs|dbiZ8Oh(mTm*ph4 z{z~2$0Olfo(h-V^J#>>&#RC@qAK=a6gAuDTsAF3Ay+C3jslqa{J*Ev++SN~1e-B(E zs**vqc1$LGn0OlV5SNDuL4v_a?J@Io4GMe)Be)!qpsLh{Tt;14z^}z>yTpYvC3gVocd}u!gi=fW4z6RMCyoKhn2&ZvJhhT zJVfMVd!Vp}D4TIg^uU!48v`Nt(6>pxOJ|g66h=P|&>pzbt58{P zX8b`xW26%K@me|K`18n_!@nj;{vG-=V{0;dzpEnU*IFv8Yj`jG;s;NbPkkJWI z<73^C?=%5Y%smb{%}$7#SfBg?9a4PmIqI|^PTif45TYibV@UxZh?pmeomLKa<|Blt zi5Eo$9w@dAYQQ)pdD3C0je)2+hde;=v&8`Zh^V=~tohF_YcMihU)KCdmNkD=+FW1O zTwm7w&&!%?rA^e{Ur3wwB-dTmNSRoy){!=Hnv_ebq`JgVTi ztxy{Y)d!)H)R|Np11YGL4#d6a1;Vo#fQ{);q9h5%)m4(=yj+6Db%Jg!85Yv89Cd%D zQjmcSq%X^xVOJ{|T0^zhk7zubG()B4Gw!uzt(Li7x}a9Qx(s<0gLoNgG^0=sVuhkF zdkjn2LIeiNR%kjpV|^^8(2X1n@&tqbdxC+UrX(Xkd(BV^ux?Q?Ji|R;6zX0DeS;;i zBp%f}2^|tF#o8UA@lHKd3@`Aq9qB*whJWQS zQ+h%~1S_Ep5}<~T7~#5qfYl$LG+9KG`hYJ~>`??o!nAN5Bg3pc0_yEpQWwS{G-Dka zO6td9I;@^6r4Uj-3-UY-ol^6}>s6>LraVHr0s<8Wo!God!mr?ICq5c$`qU9|s> zj_VO?@y4E~6G6VyE+Y1ASdlEZzx#dL!DzPUEoY&9-bgg%saz9mMIt_6MNA=gpC|ep zorL0u(wkt1P&*5?9#p6A*Ocsyo$R|`>`_h$=rbr{Q%&qyPu?kW={1`|K0hlkPbsM_ z`n-G!D{-1R8+&RqX|E`d~mK8rA?|Y1NStaF4$@-iX3mkb{OI=WTRd@SoG>-NRvIuj_+wM!d z`<8fNj6zFT4eqIAB~^|L2)b`UR<4wLKF5)ho0qe6=B*<7Jzc4!x1-`7(e;JAJcq8H zk+REjR%TC)i-QFZeH;lAakqVaHKP0-SF>|g&k1T@LUZGRR-v*9byQ`q87wy7xN?$+ zbhxwg7GmcJH0hAD-!udQ83QOM%wHsmSU|Z3AK3cFIow%q+5)ZEHcD_P(R%F7~>-;21FMt?xQh=U?3#G&Ne z;)iFOL&{dh49{as_FNCfz3egHyBH&9FE_RqQNn^2{6`qF93KH6m>H6_o7XaA>2EM(HM7>T<2!$HcD%oa;r?&2 z|b zuNC)-yS5xYU8N=z*?cKyBtYg>Qk)qd}tna{=tn-DPIMf<4CVlDV`a@+~`!kL8;(I6mi%T&fMr!4q;^<;#3On z31V(^y7LR3dE_u-3f>LyV19Zha4KWuf}c%&m>bcAqJV_>hdsz*Ux+o%S#shIphBI> z(O@s8ps>FOQ-Z4hhnVrYbo>)bN3i3HMZe9CcbSB5&xc=dJUOO?FhneuG9Q+z{J2FeL&|+FU`shby$Y@Wme?A8 z1TIvqQfQW!AF(YKp~{*Q)3Rg{rQ)R-uS|kO0%W3|0Hl?HRwG-Gh z(bWn5Uz%Uw86dvjMqny&8lYKx(JZb?eNu7O7ptLZr_VnLtF!u~wFNz3!3|`vsD~`i zgZ?-?fv^D<%@SsK2onr?s5JpaH6ZQErKn4phMR^h&(AxO37EicM@go%!AQO`w#YjPVq25!)V(q5FmSYPGPMwC-Yi2Osn7 z%_4|`#GBio**HJ;Wzdo zKqj;JGCc}8M9FNt+|eq9K>2T@);RpLJsYSOZ%u`ztN3UmH@t9t>yZ@3Z!q?yyP9Om zRv((&aMIZygZ*esaC;inIGw@`?p4i4UfRSxYcy{;y|0BK^hcP4i6JLSzqd=`juU6I zMgAjVc40Hot)%o|tdPPBO80bK&fib}bg+8$Kpwu)&10+o=${Ylh?IFv8E1mA0%Cb}>O@(j zeYfuX$YDo;_*&zYFg2kcholxkDxcrHQ_p>FOxwjsxVrMW9_x^Q zyPkhVV3YS|i1W1Ews~ihDYUL$mk&CG2E9F65G@t!^ZZ{Y&3_1IKPH~vdw(3x28FHq z)c+~$&cC7O&k9D7zB}lpZ-_qbO6yE2#=$a87N^b$n73?%=}vh$=WqNJ5{7<4aW4}L z>Mo#qdVWVQG$H_sny+Tu+o%VvvufIRIPj{Pj(lT!WZJ_SIL6DC0rQ$F=KW~PkJF}8 zcs{x%aQ`n#pn38K0+* zMF(2nMAP;pB9G-5_3eKCP~v>jx}?#9rZ`ixQ_Hj{lo(Zf)NcYhkqJVg!{211fEV(q z=%(aXY4EcJFKOE07f`_b^Q!!8T+4Mxb9TwQv;zh-pSFyh2>njjj=l|E!c+=Jc2GoI zjfIn)m$+etz@yck^8FZuDHRS~RG`KvGLREr06`=l7JnJb}-;6^aK;rZkRBT>b ztPt8!9jWc=UGMI1Nt>|$vE+fJns$C%%SB(TqqDOv(e&e5#jFOcU(m|$JFIE)0|)8j zZb=UuVFswleoA~xt8m0TKw5QpfTU6Q%%X*nGpSgdrhoz(Jih8|%2PBHAMuAkDiM3> zHJs@@yN6mam8efpkDse_@Ae&oAGq|L1N@zFE-+iUUbRJnN7T3O;{4`Ek=K2^;k?> zN7EN4h$=QHL|b0UU$Brae^gHX`Rdu>cN}u3!JzBMZJ?H_7rQQ}4>D>CaB(kVJma}A zlN&TNinhHc!b?G)gV$iQl@G$fP>S5xWnj}F_ACH0LJz`^f=2Pp$HjF-Jh>D3oPHQv z9PX>PUxkUGTa!1g-htLC>h?;+;Ar69mSV^{SiYlBokdIxAx4=XhUKp8O&zG>kZ6~c z3oESEZ0WUGj9-=IkQ|DzFQm34FEK4*1Fb6I6A;#U^vF@oN68}xSYCFR9WIF36qCW& z!l?L)XB@hDRz@zuHoTJ%aK}oAZja?7^4JOseo#WC`3@fjeCp=`Xf5Pu^TKQ$QUXHO zIDCOp%%igbv=VZ%c+&$ZQL%41{D4wSZB_wjEwu3tI|B8wZ2eJv$r~brA8fk*fcV1T z`uB)0oTx;#s|% zf3Nh4td%^ptJi;};L88U1=mC1Rgd7pnC%fFR0M|8PI-f8=~0H$AcWS3q1#bfXFMlnKNc7={V;xX$A5Qo^T3nD8<`qb&efW6fr z0FYhvEgK7TNC}TV?(_vpwajz+IU%~*iT(M&Kw{Nvcv43xmYzoeKywHg$41Uf(B)Tvy_npG8E3f}QR$hz$Gb^wC$-lSqg7{kaTjEQe zAm$Ny#aBN!)@r)=D&HbjLuA6(Oka4pmzoOkWWXt_nw6J(;3f1`+WnTadv}ELbQo3xnK>H|&EA8Gt}6_kC0du$I%2@6 zZJcaI)dOc)ZzL5iaIh@bSZ}EQdH-lMm((%^>LCS7V6MJMDnh`nKij6wgN2tmZwJ|6 z`vo_QI9uym!3JBfxkj(GA-oxh;}*k=z%4UX{D}<=iy~F37B|fkIJ_J4bIdGK%0X zgHlHg>|__l_Ruq_P|0{=s|;<@U&+bK%`xU&&CPjfToZGHLx_elNYAXiu`)MX%C60vK#@9t63{^1_)@otet@haa3jJElUy41mX*X!A5HJ10bUY zu&YuY=lwGg<&YPe!+fw$8s%{3%n`v7wt1o*%F3~92N(lWrEdPf#K7)J1q~&_&4PIoY7I4Ga_*I3vHq633jM?cc26VY{YU+kLSGkiV+rLK@K%* z7O=?u%<|loll}CB*-v^U@;e{W-kQl_sMkEbuz6(rmJ&bdL?(w!C#SSJ)?-d z{h@hJjq4jO40XvA9uaO{@=f8PB4d$MTv52=g$_ngDXYCaROek2-Ak{ zy~3GN)k<0#x%JS%SW<(bdYO%E1{L!$%WhRZZq^tHcOW2CwQ4U8%Wr@!H>3Uv6!OAV zF|I;5qUg8+;4-BlJh6fBU#2X7@h$*3&rp@7PXVCK$uyudqDX6jAQJl*g_vfrk&cQ^ z&_j5`)WaLRVf+8mu)2LMz3qlamU`$B6%M?)gVf#zkV-VcuRKqSFohWIHDbc%InzrF z=22HM&(qD9G&bYGM7*m3q>+F*I)D5Gg0t@gpk>u9F?}SGdMk%Wpsv*u$f|}(p4~Hr zgtbjaBj$~gL4_r!ovm~p!(fTCAi_BRXpsl=E<`;X%821#VGpSQI1~!HHn5+0(e71! z_NaL9W$Iy`DTb$(dUm8#FTMiCSLTlUcoGl0a^>PBKbQ?{5n3RhEiuCX6P%R?q@2T( z91N2rxIA)C5GND@pw?>)PVFMpSh#25Foyk)@biCZSlzyOZ~KxP>g{!tC{Ri7A%9uL zib)Buo@Of@yO9lc;zXu#3pnw5r~W2!`~#hOM(TghLCYu?7a($Vm zCGi?FJG_wXfIl1{W;3dyCO;##?h>&nND1vE(}ln9_&D>fts^|C8{p*4i}vC{RByP9nQWtaWk@<1GXcBpC%In?%XBc?%Z& z^d2t6duF42jB|*u_C2*=;r5*ak3pF+=rD4)js4h787%N5N;Ha7YwsB`^4=a|-PMUV z-FHIIvTMuG5hL&Gm0E}_{W;4|h9HWyh!>X#&arb9)FKP}TPeXT=9VBw3z4%8s2O8! z(S*tHLLpn=ZQ9lLPHuRj(a?y-H6BMHqVl;0_ny8GF6i-?D4N}P7&R8fn_KleSI8E4 z2C?B(L2n^`h(Kd*JY2dz8MnZcoc~CC_o^7~93UDNUMRv%Iey=l9!mKHFJR|ym`K3@ zkL_Y*$Xu_b9nd<&e;Caz#Yg82AU43$JptlAkd&yP;2VRLTkaV-;>Hn~Qe&34@JI}8 zLsL?e!zvU(>bcX@1apfk;vzpiat8$RH7;bJw(#0UT?OM+|8F2@deq~(#e%MXsPuqO zk45S|8qz&qwW1%4;WXum?vKD}@~WS<_kV@Hxb11K!@^z;#FV~M=E{cg$=Z$s*z9iY z{y{xpZu9iSUHwxp;H}oM*VYA2qbmOe2cCzWO{?Is?*t~?|9+E!q=ZcU^tOhi{v?i< zi7POD+_piiqc6-~Zw{JI^HPR=It;T*60Z=g>_BHGqU?)7`ENXe>o?kJ#mpDkB;5=suHfguV zkYVujX*1gEKF!L-l^58cO%bKr#LZ9bMH|N8{ZbL~A6C_`no^;-|Ksy9sKR2R*Kojg zTMUUQaB1eiF+fd2{slt-RH7~FyIm|J2)&5B#WnfojDr?YAV1#k&EIhml05xa7@i^j zrJa~9D(f55(?v2Jv)AS~9YOt@(~97Wr#l91BN!gh>-WP|bsX%KKB=0I4}L(L!uzS& z=<*}JpVCt?W!m(cX#PVe+;&K#C(meF!ONu0uQ%BFMSFTPT` zCE^SlTbBaI4a`Uf4Ns!%(^}Px#IT5w z)a5-e+34k(Us596lx;v)mAlJ#h~1i2)k}Pgl;v85&y+o-Ge%I?xA5K*BbKYSkKvij zc@Z7ry4MAM9F&d^jApQY^(VGzJ9YCIda4^i1HDx9U4#3Kx?Z5lO1I&2#JQuhDCSL= zDeluQi6_3f?}iR%FGoyV)+%l(e7`N-)Crf)^k_xziWlDLS&z!a__T53Mwg&@I9RKl z8-80Mjf3Nh&zD~w{fS10hxB?6MPAwUHPO~Vw=X00)MxC6O#S={Od3zX7!7@k_F)L3 z+)020#t^_v0+I?EVO=J4$#7|?1j0=iotqnBgl-)E!McnKxEEX1xS$~~R`i?m2K48y zs~@cS0eKt1%NxBOR)2Q(%A9QAu~Y&UPRX1pp--%KWIH5BTQ+9P6Zfsna+n-#_+hm4 z60FwDh>>rK(tUoZ3ByOV80AiFlMGd)&7md=V{;>J@zQ?>Zn6WVQ>w`5DdMJBNc$a)+Yh{*~jn>r?o@Zwj9oCe<0>^(p+SXfbu$#a|8a!JRg{c@0o!3SXF#w2L>eB-J~G ze+FwBld4bQ#~4oHn7bJ5uJ8b{*hbMY zmRXty@YyE=z&O6hDyu;ZG{n+e2O7Z=N(VwZF`y6etngIFzqYLFvP|EbNgX(goj=XO z;t|Ke*d@O<21*$SAA=9}&Fr|nK!rzfe`xSjLpQ9au%M8PSP%sOquqcrYlzq>Bcdr1 zgk#;?OyGyAwV#%wFY}}a5irN4t}4Svb_dU_4UP3T|L!@ex{DV z1(ExZ2p;|xzyK`5Tq4AxtiS`-dbh_K%jr!|#KR`TPE~&ZG5A6yu-g(a1+z_!h?1zLvN zOrzMteONdasNNiyok2AdVE1cpx4}Nko1U>1(9HP+8O%#B*J5SuDzJR}vOyAQKSP77 z7tbeuuHrDSNys(}=8fJ;GP)dEMZN)Ai2eFWKdueq%YZcrZFgNO{OhPjc$OaAQ&-0JHYf940EGZJ#2vBQfcK-*s1_ht&S=f0*1aQw-?AT?81ypWBs}8_#lQk4hG@?*SOREm3S&I<` zMAU*& zYl4ObuGLMSx<&(2<;d-OTc!uIsyE;KSCus{Xw@Sg%*s1_f%#K1=)*PN?tg_r{rPjvsGPOWL3HAHN7o-4&|k3VMzE*@ELvVygtkt5I_J5Jn=n@xfgPqA5ei=q;7Df6 zt4jI4ML~hrFew|Yv1vBt-zy%f;Zc9Jf=+eEmYJ7B)k>MZ4)k(ppl-1Sw@l2KFd7@{ z&mt7SLNgdNOm)*#U(6(;V9uscmng7j1dP;tf?0mTC)5EzU{8+oV;)qMO1~s#N?`i? z>3}L9K}<^unG-XPN0=L7^{)*dSjT~osm?)KRFl3KXn4%fNNL_=P1una?^wEaE7%W%ib8wawj=65d zW`Bd&41XUuJ%LBq00zJ(!d>VV98OfulKLsSDhwM{+Hv^G3gd|%W{8YZwN2c!2)F-# z5^{UtQecH1s9lZd5G)$h%}iL#$u|3@~?tp;;fZ zC!Fhf*7A@6zCu1mfWt7>^jvHU0SFlF1w!HMQ^!R2_W*K8ocGcgIYwl$;{y2Wg_8oS z1OAz9!}2^pWXx&+@Zh^J3;qt;qrg_HbpX3auk*wgr*Z7bt93xO+U90EOt|bu_Tv(b zd;v~ieQaGB9Gzeu*A-h#lB2V5S#H5Lm4j_$digbfD@%urW}m1xa@c$h9u=fiSTbq8 zBGdN?ZjH}tMV<==Lg#sJ8i<+g1?r9UTtXm6r+DurkUNWfzO?|Y!J$|y?ln;CvkvQk zoKzof7xgO-Hu9ARXinJ8B{~4pgzxj=RT9k!YEhyCvd#VuU!H*G1PWbOi{^y4D&|WT z(45G@c%kG(bA0bR%9k>rIWq&ho;s*QCZm7SkA>}4C?moKo} zZTRHI%}1UCQ?kW>C#xdhusayzj)`4(M|WTs-kosZcN9DIMmzi-g6=`(c03f^8-xr9 zuAl=OU1Iwte3o!SR^4`Jg;-v}74tV;>Zv#JGZfq z=kJgX`AmZm;wzQ$vJUOb)nip-Fv1&zwnWFuSo`z-c?Y50Mi$^PxqaK?WExi*o+K0D zqu|I8Z?EH{7+7Z@!6ZqMa5Ws;)1lrAV3w&HYV|n6^*3V1LtYE6Fd$UJ^T2Fos}$ID z;buki7UAQNYdzZ9z`b=50lWgMgIHyc06%Mu!C!LD4TC){baSncJ0M*w-xz&oYA)7I za`qBqKUmAaP%5NBAvt^;T8<;kp=8hY2j9B!B@}YNk8e&FUvRg}4qFdgRmLuU^Wgq4 z6nAN5p`A%6ZxN5bLOsip5*hM(g&8?X}!6;*v0L#iXeA+NkMfX56E zN-K55JJhUKG4RNG8j0eO>#Y|4sC6wy&ASUttA2)a;_OA1P&1Nv3)UR$#CW-x1!#4u zSckG4)8?oe1Uw$+ylC{n@K~KB(ovQ5)+j5icRAS^q1Rel<-oExD{onQ)G`kH85_7Q z?&Qa?Q;zNGifl(-)-Zz~bQW>qQZS5-i9$u_%&Z)bb7sWn-pbW)F1X)UU>Hso$8lgR)eQqF5f)|-k}N)cu_=MRHj@bQje#7M z<0CAvNEcFES%l4GHV4MS5C+vn4DPiIVmg8mlj&8c*y@Ld*h18}rhGgu+$TKBCrXa6 zhehHpOW71Yq>}g&_1Ez=pwfz%f?C_*=xe8lFA=i0dPTlUbPIdJG=#mo)X5Z7cZzhyTCpMu$s1gBQNioE&DizDDx=^{J!`DJ9q zqbV^-f_@Hty}CBwH>X_d*4Bp^uoiJVEbv;y(IB|o21i0_$c25YJ?8q<^Kzt)&cJ0g zyqw!(%BbZ?Y_3U#VerDcCb)(nop9w_cqem{mm!_-_giqt4C3=LBwYM%gdKbhKf=B5 z$Y{jY@FUXy2&2Vn<|Eaa;FOPKgxYIRTB$Q0OTBOF@*{Gc>K;;;A8|HkY8_64f8v5o zJ~5U${OIIULwl`(by6{AAAF+LVMwQ|XuHu5tJ{_78&{rL?{l^fH^Upk?HQI zJ&tpIaq>o&mOA#yY#n>iJhzrLu`41`7+mpg3#(yGl|A~7VA1DgO_iPf%9aRVJhC!b z#i5->wXBKslj9Lv&6+6SJkEun0I#G>;I-US5p_9JjmHV16LmN<0j2Z{ufv#eSP!c6 zq&i7(&Z*cp!B&SeRh*EzV&f%ewG@ozQ&wd#ORnY2D78vckDHhaYtu#O2bY%l1yu7U z#H9gU;Zo@GT{wqRD=XWA^b8_W6hyQH~KKPLh$wfuMm zJ0Et@d;LXR5P=1|q*b{JUV~$DOC5%Uhs>mqXoGJ+aI>4DgZ!-`HaMj&L$+z!Akb>F zMK^2wFK5W>!tx&#mJKLIgLB}gCZ$KDYZ+9Zw5H5*DS*^izQkUVRM=c1iHZFS!*H-n zQ>h+KxaEV!f;jq|!qMs+Bvz$v?0Bak-?6S@v#SBGL*alph-cmq-<&QFaWXEp*6<1$ zo0VLw=eYsFB`+9GkHjlr6}3*14+8bM~qa;z4L5xQK@ahF82;l%U4$+CY$y`*xCn7A}4Iz_%!dk}t zHk7)201!8PZ$pG`=q`z?zHzO)Dm1@S3N%G5njpq-;;lDkm*v=cGr=)9Hp=+!b1Xh= z_!z(p(^p*A0EA3l=NEQnc~@Hc1;O#_(YUn z2cb%4wACBWE6HoyRf92d2l(-yhSiDmvmX&%`}y>fZ-FxcoG!fT$t@(Gcd@;!9LM45 zdeunD7ZSxED_5L!z|d9UO^VZaflMEvyiZ)^LEZogP_;*qs?vj4qG0z~Rh+e$9gKnd z2fQ}XlWMrw?ZH+37vVsZIH05V!Zq!S5Sii$p*3rIV^g(7N^;j^wO%yMW!@Rdf7o9q zcnq7VDnZ3{UPO%5%EDcI1`lAnudy|4CfEpY2G5UIZ67{_2NpABGzlj9z&!i} z0&w29z8xdxBd`3CfZ4N|euQqoeU%7WUpjvRYYYX4ALKKYFwLH_vg&9Vxu(o;X;oE} z{3VeA1_#*XRnH0^@U|H@fxD<{Gw|VGsjtz5LnGN;=_*!-W4qGinZj&1`jpw{cDj4= zS!^m(=WM7F+%1mtcxI*p-M*z{|FWy1a_Oz4t!Yf_yHnHkL@meBv{pD+F^;Cpf~LCo zOFr1C&Yg`h#Wm^)wC%i4$j)ukU_|uMdAEm8Pu1h}D_W zXP~px1Fewl^2ApGYognL0Y10q^I3%=S@hq0IpT&Y>YN1w{>ikyTa~x~D?`0qWiS!0r3muA=of(xV->K5iI8889{2 za05Nv^8k%~l+xNb9}XazGZ61qU7k->rJaGdr5|^qR{2K<^uU4J!&~wE!tR%zqFslH zj(kC`c^}h`-9$O0nNsk-q9h(68n}slVl$0_U?65V z4h}}}j8R;L3uBkI$**zbFu3S;mmNNXSlrXbLv^Nji?rKsyYV*p_Rcn&wTo57(mvBC z^FKn=EA=MS5_N~)CF;`OCF;um0;1NciMj|x{p9ZuH9G49u*3{}d&NuD>HjEIcm5Aj zH7NV z8*~5Zk^C4Jy%vuwmP#$1`M`1?;}Ukw4ZWvgYs4vx19QC3KI}70wuJ_+u0_Cz()@T9 z)cTwO37`VDne-D{H3-GxH@!9i%p(2R9h9{?2dp^#TVi+2QjLJAr*ZVk+Gkv{IX%Z= zu8o!@yO>*xfaR#4Eqx_6-}Fj16s=)E>f03;5=wf*E*o#amYT~P^9)cJnbhYaM0-&l zBD%kZk+@j+nM6BL5sG_rZlW*ow=>QT_?g+yozgJc2R*+LdT#8q9Q3+#-OFKh&u`<0 znx0?7o?qqao}XWYr`nzmx`o}uR`}SyrPt+nzK{*R88Xv=Z(>zgO^5gPz2ucfLK~&SUJWmz&0&-&$0fgtft6O7fkx z-5)K6?8YRiy8C0`(`=~T{kYOriuy(WgWjvI5b+I)HCCfQ{K5Wj^S-8Db-n)sgGOLt!6!C7{SV@|HQftTP4DA&`v*_sNv`hx zMCd0Ttfv0>U-W(=?mDePSDy33QUPuZC#A=x%ag`orDB4quS)J&@j{fb4K%z%#@F~F zBwF2_H;@E&L9uTA6xx&+QN|7oiN2cvC4%n2a6d=N3U%OXo#6NIv_fZ>2V#YW1+@AZ zn@__kgO&SmlUTM5Hz?|E5*I*kp~{~?-Jw{qa`%O$bPrzN;@To;eRPM560A}=Rh)!T zOMQhnKdqoj1o| zw3Bd`1X|8d_{63Zz*~l%c)~rgh{I0VO)${IC9bFszH2M&d*XIZ*fzjhXUGqT zGND0V^FU=3&vGB}*CXtiwZmH9x&^gVDP0mbh)RPnuOwGTzWf<3I9fuVbt8aG+ec`) z(aH*wc0x8cYS^Hm)KG5Fs8J*eb(vMax3;#Ei1YRe=KHq(7H{g-wkvx9XM%BW?%K7mhQN;S>c)X=@XMR8D?`|yAhu<*7qKTK81}aFxE_>o z&njO%37>`8lYJ4#_r>NJ_=-www&sk(U1oy!Vc&rE1UF3rS{1_=%)cOnUg+*}g zIMz%>Vk>s4(F!OWd%3Ib_49#B1^yJXS2gi7V+$)77RIhMb0f^q-!ykO`tQ?k^`E9hGC(x9;ziLb^wWhao`|47WA#HV3K|>oJoBn@2|>G zK@MPI-^@&)6i9vQKJ@)39t>1@_MKwP@=HGeJ)z|4!my|MAxL{RX?q*}DyIIobVdC9 zTQOl!svHQVU*}PqtYIeTv*1vj;x3~-r0p^_fM2(I?HX6VCklT0Di1n;*fz=rH-GHA zZx@rIv*N(I!h(Xsko%zRXOFY>3^rV%={hPhFaj2z8w?JjfcsL0x zDDD{++Wmm;=CGu0 z4N5dIC1Z++xegs_jSTDj=ci9XkcVS-%2*!q)EWk z_#Bk!<|rm#-rGxP&(w<-I+=Qb807I&C{t)doqDkgxgi*FaB!%Y7>MC(Jy%77W_gzn z#Ke9O6>1X2qc99n=lSXy<48`H$J86a+Y+Cc?M%MxD*B~hJIFU2^NO2;e3*LKHRIRy zZ64~ypkN0=qmtox8O%WnasI>?z7Spehhg_HgeiCCH!hE^OjE1AN*8DwC^s=Y+TUys z4DQ@9IM8kmhzgHo%1vn=?`yHx6I(RBPPx|(+5aNSO~efGvd>i(NIvARCDK(`g^Hx7 zFzeuHqN1HmOZQ9vf9!n+d{o8u|J?1_P4B&j(0h?4ML|Kph9W!*Vh0pO5djqi6)7qx zSP-&F2u19I^5h9(Lq(*QbVvwQI!U(NGXL+HyQzft^!NJv^HFkV&&-{E=AQY^nRAk0 zqPj%Lgad#rlLniL^Ecf{;rEc^E=Uk=Cho!tj}HszFmbpN^Ffku^=sKlF4BTF0f$B& zh>sn&mWxDcYZ3t!k_;gs_)ai zxe}tMNKVS9B)a)x)Q`z{BND+;t$G-fTl|3ON0s9%kVG*sn5pviMsNUrKphr}(3tHA z!@4#O7ct!thQ_hVH^FunraZu0?w*W>XE1=iL5Oj$Mb7xX%jhx)h%Oi?^)57^N)Smc z&0iC@GLO$nG3%#iWLl~!G_~7R!)~~$OA1agQ2;){=tekx9Fc-UEu`zl)bFP1>VU8) z)B`>DJm={~+UJ&O{5{fsG{7d4b_yXyf`J=sk$W2BIUL1o$ z19LZ>Dyp}Wc&bX#7-3nZgG~IwbrYD&j+Nk!6v8p=kVCLlXFvv34PAk_%c_EOa8*jm zk7Vz%1CxS1p^-Q63+7lURtrT+gXDsJHQazhyP=C}9EdQ~8KGTy4tPh+ky#oj*YdMC zs6#o){prN4H(X@06wn6=x*D?!GLrI@jfO-v4h9h}W+hlHBGF0lz?o+f=tH2BC63*2 zxJi=JNfetX=%+zfrHR;CDB2Jjei=5~Pa_lc8?s!as@p{d*Yi_E+pU5otLKe0XJq3I zFhvCF9zoT-kkg5JqfXV+)>3cgzt!bXOC8=M^%j1jiL|#iNgctDH<9)>ILE84Z*6I# z;L7r1>Ypy6iVc<#O}U-JBwS6iMK*|{gHhRdM-x%g*-K1q(W+(FmPiq72uV)qnnFhR zLqoT5oGLMIWKUWwx^XY|aB!N2a}5^p1aF1D2lv>pz~E#nbgSt2qcbp-)X7I_=T%Zc zk-xe*^WRRB7rJ+t&Axw^V(PXQe9RoqhxOzMBVlYk)T4-Gn3eH6ZJK&kTDyPPRK6{fuSj0M(A1ho;QblT@{ii>;&0r*pN-6a+2ZEe zZ86^Xm>kx}K;ql9>h~31x*l~qHLCX~TsyHAcF`7mxn?L|dy4a4f8l(-lkeIHFRxuD z;EPqf4)ug0=*N}%B*2*}@&ghBGOpCpj6rxXPWPTzD2NhdDVl1+DpuY39A*k;BZyT8RpA2!KHNB$-s4f`ka5oDjse56ms%O9j_20ps{LHZB= zAobDAK=(I1rim(K%BaYzUMPoTdiRZ!IX3 zHVE-1oWBMNLU0PD4;bo;$Ik@jwFEQZ(E&9HaKj)F7p?03#u@QD1Y%Q`cm>sz0(!2f zBcz}Y9?W$*Y7!*lye-7^8XfxjUP;CEzrdwrR?|noPRrj8h~HL2AcarnXMM{@2_lCy zZi(5g<5nznn$cM7oc-ED3*8eY^<0v>6lb$I`S>gtJKIV#vs&+T=AaQyNZwxU1hd-E z-7bfX-M%PS5S3pcBH^&h8q7lOntPq;I!_;eadisku+feXW;IzAb84i%!(?-CE9p1f z9*VR1`T5C~WL!IGg%jYwnEU3;wa)d>jLKecMWuB(@Jfj59>WMg_34YMxd=92D8+FtGSq4)WSk(qP~r zsIVRjrGyGAd-Yk!3amdRQ?kxi%R-9jt|I)#Lq+v}%LxofctA}8@KE?HvKr`n0W4!@yYc~_*AYyiHyo-X5D&dtiqm{w0`QO_ z!u&m*=ldw&p~x_34EWU$z(YZS#rZgluT23S^7q^Bqtx(Fpx+yZ_TzxP9uLJzH|)cK zgAs4~c*w&1{ALuC;=WNKP0kt?3UaXLwgTk`U)8cu1dE!nu^|hk1V=Ywp*JqGkj~St ze-H~T|9e;{1m8(vj4Zkf1#0<6wl!-(ggW+7n!|Zduv(vctW^q(oYm(Z`>$m7td4uk zkC0(B%t9ac#N&Rx`0eAKObc#P2T}t1e&7ofHq{p|ek!T3!&Vy&UWv*Q*4TXML2$4$ zgx=Q?43T$|GKP2@S@XfUSm*%5X;^ z&~Z-Km7_$0f1o1}>{yLo(3z;mKuOY_)f}!k@v_c9ZYy)x-*VF}aBIC!P*@;a^c!vU z>-Z-qn#H|U(vW{LL*pCq&o7tx=O4>If5#_C3+I*z+9TtW$Ey?G0CH>Yq_!t7iCRA% z%hm5X(2OezKa_D2;fpeeD1+Hol$1n8>2KAKGBWjuO7*)q3Rn_wb!t~lq)n7# zrN2ge$u^N%ImHFx2mE=Fl#GKC!qtti-Hzn}alz#J75!ua0xtudhi;0Xqhnw4CBae0 zA|Dke9dD3*|F$^gkjeWRjy+Udn#o|w0Pt5ZVDjHk4t`4hUy}HRT|*|ZbQi$2bc6(@ zpM{XqpzM;i4}L0y9lRmXqVeFQ=bDfCIMX=!wvOmbXwP6Egt8FMj$l)P?x>HWhqxF^ zwt)vM$jPwk)CP;k9Pge=T`6?+3y@9H0 z;}M}sCn@+VYAs3HIZ`*$%Eb>Am!?9wcIZFq2Rr0;8s1+1Oz?-!P&nkg1xK{5yA4s1 zA@-=3o$%YaY={H*%v`TL_0*I*9nZW?q~%xB9dH9QW}em!+O6nLHWy$z@5ScJkpNmY zF_9pc$cRHIndW2P<7bRh&3X>nrR03{O1hejz>07(z6ULwr8DS~C<4oI0UA~#kjd*% z+M$rLEI?QZb1F~x`vLQhK-@xT!{`P8v*SasfeNES+Xg{%jBH6PZ%qf*sL0Zl@qRd^ z3v#-%a$XPfv(u%v0H-UgjS-vbc z8}<>Li^eyD7iLV26n4gJvxhd1arjxJU`KQi@=0Yq9HjcDlqvkMG$wDgV0Vw$9|iaxBR)F4|YPGL@B?Wj0eJ^SXAb*<_6_l8Y7{l6usao z|9aD=H$%R^AV}lmK{CMQ;byE^WMk^~Rz!db!X6lKB|>wuSzsh5JNStcK*sSq26_)$ zsF#u89y|3iloFDgi(ZDh!#2^&h)W|=lTc_-jv)<&;Omhz6Jc6Q`x2H7D5RVab_Za8 zOKTI4p1}2OJ~#$_N%z8G-VzLnv^dVMwPXK}<<^6fD{{b6t(;!ng9XtQOH5sBKyZBD%#c946c^ge*R{=CL|JXt zkc^hy8+0vyGqYUgee?Z;izU+xdYCjj>) zqnh`8o1g63HqM6aeHGg97_SibO<^8*B7#uAy!ZhpPOxXC7|i73Q^ezw8rA~!^7`MH zf-;iWDS8Vb_7&XLvYYrvu6e+PL|SNp&bz>8p)45eVLa0aDZ>}x3J>}741=++I7{9; z4*AqXNbKVo25Iy@WT}2VuO`CCJRd!8VE1n)^5?JCBY*t7!FWR{k$;^~N4|he3_%d__ zP5P?r;_hrR@$VqQofe5yl9Z-5!~_w*^5x;ftLrLfghFfr|7`rEAJssqrfnvsZh9K6 zP#1nuGkzvkRg^-4R{9a-2%n3=to9##*kc?eapySs6r=(uK|t(zgdL}lvDryx*F-4l z9BV6l-0fPg%qNuzgEV(8o-iRioH7va{l=Hlg^bN%Voelg%z&k0 z3ArgpmPFya_zLb8_h>YyK zr)1im)q5XGL~pmmP^himX;dB#bze=`4B&ik*D;N9!qvM}sMVZ{Yf8I|*|F1z6 zJU1>ZSD=K|ut8uR?SwPhkiMx=1kh~K#85sDy?EZa%U|ym(Eo+~jY@_M=+11e_o9`; zrMWis3QM2exTZ$3395M3CSc)d)L*Wz`Wh|M_oKV&_2lQ&m37suvKNi)zj%>de#u2vX|$H=i)_s0MfM-H z$X=FbeYQHWoL!b@@zK95&qAKREYH&Amdo<&ACYHOKRYz$n=;FVefU&heoaMrr-kuo zIy7rCGJ<`4i|JC4X7=OF1bkimCT#3YC-AbVI9TJe7A4V<;l=Mo(j6pn4AoQ=V4tRq zj(HCp`vUMq(}j6obGw1VG#x3wkck&BQ4>2Nny!hL|2F&51x~5vxWLkMfy(kBkxgbA zh10Q1HC#ytq||gxWX09?QVsAL$B;q6rYaK6lub~KZz?L1fU2KvzGS4|cy4JrQw%IW zJNQzyQE)hOsYYDgf8eEFgTp)yxUQ+1Hf3QCem110SfJ^&(hjBQl0)Tvc>ELS_ohk~ zebf#HE1QbM+<%L3|EA(FzfYeWa*1wGmf)SHhuL6gs!^zh+jZ%=CUsJ~Hr=gF^~V1k z?Wc=uF^*t4G98sG2UtptQOEuqr_kyPAn2waB?;Gxgy~0UBP7>ZiG<ir5PUoCH82S1z7z_`+MTxi&~*>v{H_anC62HC zb;KjQIlVS7o4q%N-B?WFbwiCS$4F^z3O`W5@&wu%?byN^};w4aAigv9Ru@|(FP zQY=7idUdb>@=qE`znb;Sd41r30sY?Gj$iUCT$a6(SCN0~ir3U}BXvs;IFyK3A~H3t zk*j5wwh6KB2P@jT297(5y1Ul&W;+I%ZqB8$Ru47iPBf&5_Vw}JHt=M-w+Ur;-~SR@ z$&V%w$WH8lKOp+QwEe0PcDkflErszN`)+xjM^Prvea2RfVGr!0@RviVg{h*2lfGvw z?qH7bCz#;nf9)A_9c8UAn->l zszB-LVgPN;>fbOibXnkm zgE&2anbEoyW3x4GEGnhGeoezn5V7$qirBukVT8y7dcF0!&V}wqQG5bKRn;@7VS0?i zoZC`v#M!~1xQk+bT+?;chaY|P8Tr<%S1US&;JdkOz$M>$<DJG?`rfp}xTKVX;in1gtsisdyTCPDKTLUl34@yeUOz@1@*Dcw zdnlIYlD(38Z;9?`d5#X5&c*OAavH|s>gJ+02hJS7`muA29Jkba5l07KfXk-wZFD=b zUIgk~Z{|`P)iW{jUG3=L;KsT(3L`1r-6|;v=jRtSil8I7(;qB4gR2n@MvqPn4zm6k z``FLoK%uUYf+w&05my%TV;a6AVnX1S1b$f?#sE>jYY9}qHbyk0Qz>VgcL}5t-cu&!uiGdkxeZU8r`EUu3pc_+rub2A+#)=#b<6?_!XreU$jr(|{y^R=%P zUPK?j77IRT&>2Wy`IlDVt>^8(C_PSHj+$wMMZ#8RrJ-b3%PB zAkx-_z^hC%+|smRYID1v&ChGMWJ0+IPKm_<0rZrltcw@a*^TQgI_rO6K{e2VI{!a^ zK^^(;T~NV9p*U@7z%T0M<W|? z@svJYn9rBR(^?yN5OXiDr~mZz^s;#RzaX9pI72qx$qxeq@EK3?SrJkN04W>qg2HX% zIG=@~yDy3&>q=wzp++wd^`0iF_wn*ZX=}|F-N(xsMIjr*{TERId+RkdJjf3=@y0_J zQEQ4YjO7QKcwrnbZGt+!N$SHep4@cj7$)%IMp0D%N1LQR#!30QVgKtxV|bhwHj1Kb zE~cVU1Wn0?Nf*5k1x$%zp5z5hWHp)RH=@?|&r^JVqbMqS>LsZA8l|nxW*Xmnag<)! zXPStr8O~?C-Qw)|T@;-`&IuO;cy`T}`BY0q$EGjsq3>;ziWj&VC8Xco)C$ zGT;8YsK|yCzGcH~zOB&n7p$K(Sty z-WD|Nd2F~8?G~YI|F-r$L5vdY;bFJ0z_=ADufM~;$IG(R3sf>nr-m7cyjc4Vy{Slv z7YL#+^)~^xSKbBD!qoKP_u7EZU!RQZQi=Mlu#pIZhX!1?Qe1^|%1koOR^P$^kStAIcDDEI z-w5V_G+1j<0IA4^aUB7+zF;1~VYAuUN1w0;X+s(&TU)JVU32picoAxtCA3tRFm=!s zUwknRcZ3?$1KPW$a|*6VYy6?-8q^#y%+plc`%+plVsRmLhqb$zO6YCv3UD2qu*u{CHa5Y4k`CmPhl#7(OD zzR!$8t%(Wk`~~TPQhCF)25EuTq7&(|N~3{5!(7!;wbz3)p@zL?q<%kn>eT6J3r+!6 z#SX1@i~uk~?bqMnF9j%UuhKY9J=zy_S6^M#pbBQ_=ZkG#{T5?l!|@of=OgY0i3#%K z494ELf5VQ%3zg!9O40?cs}jOgeW2$J2UyU7wQ9UWqgeqX>xrZTT$cygs^o!jFexd= z+1auN{f~UM?=ezhVu0n+u0L2amQ^@(KG1S3G3;JTFH9vJ)F z{maRV8s+*vl*K19`;0~nxS+ah8*!UhDNcqV{DxyDt3TYqHKV4kzOz9iFzeK^XfO>R z%_pC05CvoX_n0T1jq-@xd`kea5!Z=pr+UM9d zDkJ?@(^=-rf%qZE!GIqvei~0oB8x1h1!SFNoCQaOvgKja$q#X!!4CY!wUsb);J^X4 z0bYMo7%l)KiJ4_s$n;B48qS}mOW#obbRGR~EM%#FU?HpD%s;w@E&bQ6VcY+SYgqE- zH4J|XUl3FR)L@Om@KAXs{k8vyo2hq;s zD0u)-m7R25(+ERQ*p*1KYBA!sVsLCFEM^U^9_wHWN0Aiqe;dA9Z z9XfBo)?f(0(iPYJS>^Nq7#{HbgPjF3mH<83=YO;^X8tIbfE}GwZ770DU6lgg5I(aK z7UqQqFnDzY%%i7KuAA|~OlhY2($JdsV820nVxzQC{`$i42WyD%hEWLx$l7ek3%X&! zu9|2o^TvmhZl14fSY2348+XssH6@Xeg$GWwAG@X}?@^l%YJIAO>F!V2jhkxT1nE!< z!`+{-VVi46c-1ieWYFjjc$NXJ^SB`>je-mFL3l4>0JB}*u%AsL|*nNY+M_plLb>u6QdmFnpV zeu%@pmakt-a4Ylp4L3cSWo2sw28y>k0)}WB=(jZ=;nR9(^#fUMqj%Ky5y%*UIXbb~tW(KllW+eQN9F zx)5(dr}o-XlMnhi{|X~Wcdf4>Q9lph9Y=pQNNZL9RcYksqd6Z{Z*XBW3;t0^%h%Vj zZmGlCL&ZyyYbZ3@nS9Ot33TTE9!n&x znPl`Dp1^sOuyKGzLh4Z6ejY#GtV4$`;rI#jf#GDLXu4@5Q-iEz6~o9JhI`3OhJWzl zEFxH%!1{$4Nu#DRkt|XsX>NGjw zam6oYxzp@~MsX;E8DI)2er=aKEr?TRXWgo zZaj{QQH>z~uNc)J;~W~*;K<$iM6h)`SWu{ss`dJ^{K7(gRBcznd8!2KL~?Kn5*P~6 zrf?H%%Nh|<0zSwuG!>%h{;6fK=!)KmU|aJ=ND1t72(H-BV_)UtiBV0+5Pn$EtF}p{ zg;u0iHx%HBQB7db;}oIj<|u_iO6vUwU^o_mn5TS!@E1#Tiv5jZJrFv}M~R+Vs#8+N z>xt#q4)ED3vW#P}I3|kwfgHo4eB;a#J&@A%5CW*<&s0Z@s^vOz4U2X}ll@#XHO=1h zplFa+3Jcgw%|#FRn~}MZdL`n961`WvQmk=uDLRNO=RAu>6kpV-1A~J> zl~mL}tQkTEP}OKN+_GX!1AmfXTeJ&|`8J1D3X_V?h+(G`M52E}26NSdNVP!06J43s ziX6NmV4qC^m?tcR2~!Md2j)>g!1yJ!<$|PSPWA;7=J^7V@A?9c4}5{}EMFl0RbL?U z8DAi&yB?6?#+0(g{3)j=3OB#wt3~FO6hQrsQTgHySzFDY&0zX#95McTku`KaW&#Tx6VT{RO#4+l zRQR^F5!sJG>JE78S}0g{K&Q+g0wUJ>o=|M2-&zskLH@-@2Cz@>DL6LuWpJa&K*hBV zJ5}Q>6@c>c_3Vt}@Wj|+QL|F*J{Pen{Lb2_@}H7kJE9Fyh{m)Xt2YYm-lw-0$B#G( zGV(M?jYd|yqqjsmdm*;Z~k>w*j>fl zqv&T=W-o=kd)Lxs**7zLumv)V3aj&>PPmxO$~4*VJId+JTK;}=2Wt;aDZTSx^reHhR5E&%n1vd zS(5`mvp8K@i`cOF_pqlxl(QBY2Ej0%#aW$md(7&kD?7C(KLc`Bjx|mvFB^MLwsU!_ zPGo~q$@7OfP3DK@E_;;CBpZ4$s?1E8Th2Z%CXX5k+El5jR*yq4Cmp6o*N zr0}@N$f&63wA2_d3akf*Ce!_?^mg4_lF>mmDh7OV4F0u;&;NFR@qyCP0|yHCeln>U zvk)6)ut^e`=Hy*BG$rUJk+?G5= ztWu~P?h{R;ChU%q*~TPzyB&{27;w;bg5AI@g-Yq2(IOxheT8B$Rgi6|feet^kgVeH zk-{)|!W|L}g0;|H{8fwi^tlJfY-&L+nSiwvy7ITOu|LdWdBQa6R^vl7I}58zrl%g? ze`H|)L$JCk7nJy=>f{3pUM?;?)P3L~$^zbZLG?q64=!eF$+oI;C>-8(sicD9ZBfS0 zi_ssT#S5C};A}Rfu!t&DA(Ek(g0*aOd2xv_%&L@yP=26R+|>Ey7hjycv{WzLPI;P9 zjq;nX>Lc}0241h%YL9uS$k<#&mR(^Tw%`N7BZW%QpQypq7YAS-6`WKE_uq+vZQ$^C z64?x;Ufd6((js(VhJPqR=xR*oOMUP6J1-g%6kl zFqkpugZzM~dTawruVrf-4cVrwKunLK0~7ICuVb6xzm^J*3DpI~B_G%?Vw>yOZ9mdw zBO9#1x{8WdBso5*Wt(WQO%<yUO6ebdFYW|F0AVP?LpA++#4JO`dSQnsU-YesbefkERp`;I0mQ zK-0CjdBi(p6*i8B4yI=-@R>;@=eW;?8fmCuVD>cZtAcfqYCyKw3KZSNlzJ{qZzDL^M%a; zaNRUiq~-QzKI*D0tY7_Z(y3wTG<(rRIPCq5?GQF}qiSfLvvJ1VkQReU8i__%Af<G#FeLGMv4*ITAFirv` ze2~8K@#uDS9adx!RH{Q00`*~%{b}sr$5>Mp6OCxJ>edujP)r^BU>d-sG2ao`fPru$ zFI>fCz8Be|dhBzzFeVv*k0eiyONFn0e@1+&o)3ApFmRQsp3+(RE7H?N+|Y;TuA z#B(X%-*yScv4pq$)7VL4Zix(O%sBWO?o=V%D%!Q=ZdElrB7RiEfiB6$7#kc!Z^VvP zeV>AAGXwc?HCzobQB@Ct4)IY4iRygv$ErR}!Zca?#T!xzL~Iow4s7foZu2|E^(aG-WAC>OXSWl!v5lghxus#t5gr<8eBGAMM#0D2WX!@|{y07yprdVAY4CfKXrrupaS0qBaIOv~Q@QAd1?Yx&l(3$eO`#@iwrtc} z+Q}Pk86G;^dvhArTgX#gxP04JB6=v#q&1hdIWlNoAC(smsN7hmRP}pDF*&H3?3cfoV0XQYLOGs~X!gD|dd!D>p zAru${OpQW{@e%Tb)ecAceh`r~5I#5VS%v|a8r$AU| zai;8QZza^)KqDrC&xDON0C+Uf@ZCB*!ftX+lpn`^H zm!et-*u(QgK#pa=)BLDuj-X|}rb$7L$)JJ3ZR|}Qu9HJkP>Mk19G%cyLgi#r2S92j zCr~gmyCMS;wH%i5-cocdD6x!n>>JiszA7zcF(~msxuRB(yzIW+FcI>#6LUxk(yDO5 zIf9hiHikBTHP?xWCdbp|-Wa-TKS^pohbZAeV9r=FK_M^1Yii095Sa0G_lUvw0||p4 z$6}|`;79m}EGjS22S1QKP!7q0K$>9lrXqsdXdZ+DSTX{DlI^Lb1%RC}`XMO?30%YI z2L}}pVujHUWE*tkD|{w_V(6j(3F&Qx81t^|lLGi>LMSW(PN*oPnBOEHP8j{n0ElZ8 zQbPNb!_gB)e^G({{3RbxjDFhyxN{Pr=3Nd`97a9vTJjQwK*TNOdLZoHgFeb_WqKfX zurE#e6^8{yZX1Kvh%$Cljwmaeo+#Wgq)ZQFL{b1XGyzn!Qy?&|Tm3?wF6bJ7jfCIHmaE{A%T!o1{-NpKw6IP`$=Ouh z1n^vy+GdaF`TA3UEkPcI7&s*;xNZuBbosWlsNoct%zA$Xii#-^fAIwHiV5I=_=E|N z%o5+A2@n++_C7!yft&|30Am7;3$Yy31R5s?M0&}c557PC&2<1PtU1^zfco>y1S6alQAd)Xvq^-F0Iwk7jFV zC?G}G=lYP|r7)A-fa{-P1H>e#$MuWqbG;W<(1mMviOsU%L!ySwByKmg zqYB<_;Fn5bcNKy6U1kTOSm$eK9WdG{+#RQUA^`jT^s@egZQhR`F8#+H`;olb;Lk%O z)Z9b)7?N-n77-T<(FA9-5|&dOa7||_{lWy4*e!c#0vgyIkXb2|v4cZ#8F@;Qaub3E zz-)@dRzrlsnqy!;6T*g0me}`z+>i4*a zl??%C6#<;;BzjVtU{gf2NtL>R0%%iOh2Ov+^Qryty&{=H05h_qgsZ}VCG6B+dkevg zxBdz1znRBTvu-KH=OCUbi_jm5JQf{09@!>w%qq!@&qy*ts-YK8MVvZQ<0-%yXEG_g zIyB4=K3jq#!$`0Vw_-%Sv1!Sv_%Jcm5dn+Io(`j5UYe}~jM+F`G5&B~n#6U-Sb(h0HF zAGAmSQ`w<*h@0?jvozO1s7f@D#drMz$pjMs$fqF+iNLa(f<%BE=U5?a0^Q1_l!!x-WAJIZ6YA&*kVXhMaN}5NvC_F2kATrffpeB>WE=3KrU>@ zo!;CB?HEC9>5%s;=xM+;G?p=8dQe%BL_2*N%N3bcjAaC3S44yhi72BN2GEYdM_m_2 zx9;DMgrbhHcm!eyVT^eX8Xtz^D_MOvJQP+qG#y}c=FUls*n(*s!Ql<|Oh6DsXc^!l zNn=14ojEVIFu#mw^0cxQ>!*#K82(cB%4IsRxH5ajP-e(huy&B#&4Z&bWlj}58_w*Z zJ+8j~>h3`hnqDZ8!3yfrsfZH{5nr7W?e7SPPf3a;hDh{7qrGYETDO5CBc=u>5JOxw z^Dl%XN~M(tiuSL2wg*Gmw6XH;C@(D_7_l22iI01@SS~kZK5E(>V z0bf9cWy4JlBmh?wdJ9U|05QxEUWWF=0~6Q+z*A9FAh88dtkU2hVv9oW{=ETV#1?R5 zRJ0m6E%*YyjUE;73Es#@_X*swDBBE}L;zW($Qi>5=xnYYkPG(PTF@*Y&qsj>mvNUtAFZJ|?(SK3OKeYhVPfLhTmMyHm{Z)R*4#@6K%wfqV=(V-klUo>wjsTh?& zuAG#z{(@fsPrhb9P>{dQpKwUIyhoVej6&BM(}9ALx8boAX%BTE0M&rrERMP9htES^ zBP{YrInEWh&9q^J@B^Z+NpDM1k{jJu!eWoI|b)uz#diJb9)zF#n6dn zFox$8hutL-I3)$HLiq7{(db0+x$r@SJUbvLE)(f@jrT7zOG$)fR@Xjlm%B}X`#F;EN^ zyo~$f)o>a>o?4#?!cocJnl&FyzV9|%H;jF;-d8~)K^sbkIpW5ryb1;tF>{q%Z38ZV zD%b3%+tJE0?JKfr2uJ9hfTQQt{Nio!Yq|CpN*T0$J*8YBe#v|eejuBb+Ik4pdI_tv zFOg6(sKEUY<@@Pz@oSLFdvKhM$XGSOLXoSrb@)l5xAFmkxS0B(_60=pN_v%oIx2Wt zB2+N6%lF#PErVc%5jkV;HDT8U59CI-=fW=!5F`jM8IaKNoh08I00h0;2BCIPgP=QQ zU`L*RBYtPHP(lK~jVGI0;qcJG2OEB#o;rB@ApO|6!730kZ>Z#wRi9vzBunB z=A>glFZvIRh)G*c0qowcq$vZWOmm}pSX;T)69hykJMaXe7Ed^05&?@8tE!)fr>s_@ zj5q@2qRG7;o_z>{!}D(6^I<(+n~e8Cp5RM;BGOzpdo}B-i(@|Dt=U9)O0kh{%ECkPP7srO$(!FrMf^OHbBgG=!a;Oae!F} z4wNAJl8ZOx))B))hI?%irrAt=O#5GMF+a9c+bUhXhJKNN{6 zLsgwkqDx~tpvJG6MsT1S;g4AXC!jzlQ*V2LHgF-#HuUwpWln4nUDg1*d1NjyKM6n= z6z=S-b2dObBM?BZg-wD~Yes|;z}^Jjhn<++1b9s#e}Vq*5@bfI2?189vk{=CK9~c9 z4LkYJ-h|J!rmYHlI}5=!*i7G@;|u^z4q{Fc?^=U2G}{^IgipC-w$K?wf$-oJBA^=k zL-+>4GJPosxT44ni+!Q^fE8JSrbNfmF+W_UN2RRv1=3gf0;xVqbex_>jv;_D(20XS zIElH#0wGeAXqiRXwt`y9P`$(ei02|E+PD~j)=Ui;EuL}!1NtYLAUPh-MhN>!ivf)h zaHapv1Wsb3_pJEsHHQVE4C)p+FiK#f=s#N+LN;d{(=yXT(>-Y!5y9wVs}s942#Z%j zEcW#45;Pa(n4PfE?AN6LQnBYHcGof#V{}FVk-39FzbNi5jt`wlItY?85}wi-wtX=i zd)sVF;&hP7A)yi(@wxzv-0G($cJ*{8(bC{!C<#2PRJ@V_i5Jr(hNekE2u%|si!!iw zPpzeC627HN}AUi~z;FHkJczH8X*Q!EBqr z2$cZy9vv7A4c<%88m5UM)DD!5fH(EkVu-_-CegzQ&_gep*-koV$1DkZp#Ik5^$3{%M1JfMuzgGp?!`RWRiKB`LxD*OT4EX?ItnQ% zZ4M)#6<`i1NgWPDj3r{*BYGeyqe2Aa6oNAY^>p$?8-yxRh;=;`g1KTIi*zV8G_hO| zT-E@hJ0zzvoY%pCSzZTtJH(h44=MMsGG!{0TF2SEcJOudLaJrb& zKP-mSc+qqj@nKQZ((S;oEsTX}TmZ|EU%Dh|sFyhzRtX$FY7%K+)Xf z2l{5n873fUUOW2>=!7jQVFFzPQv_Ph5#R>UH6pAM$fFHlAe`+vDi9Vx<8r)hCxkF= z3}JnkCT4aDA^-vri#Y zIDAE*Wdyl_M?iNFk3c5YSe??{7s$k^Ob{-m)8uIey+l10l9vd~^}~5873a5~GDpBN z%~xC`&aI%IOA>$$295 z=kTQiE(oD!)OY7Gckq?y{*wzQkzMG-vhQ}xBK+tKE(!Y>c%cd4pe(hAtY`sj2G*H^ zc&k9pSgwwoX>aKm+cVrB(3@=NjT8hAlFlJf)E`KaLAS&CcMySohgBYk-xX@mTM z4020E1L)+f7(9;CLtQ|Aw(+%)ScxJ+FwxILK_U0&;%U6v_xpPNDUI^|zR?#y(D%EI zFCItndXC2_N0i~DGEn5rC=xX=MB<4W{XjKB1v`mYSt4h1RAW`@fe5sySVfC4R}A4e z5f^QgCV+wk<$e6bOfV2=XlCCN${0=E#xib(q#@sW6MSv^!PqsR*EdfC4~)bB_#MRe zBNaq-zrxdb1Ypr?c{4<5+ws6p=@g#R4f(7xDm)B&i6McZ5jTJlywS-m(?}^qF-M1C zpQbEz>PTVE(z*A;X>K^QIZ~KkR&`F^;``#n<&-4yEWI>)#pF<1C}bpZI=ytoNF$-x z@r<u<3!U8N#V9WfdMt{&wL;yN85;>daYgSgsL}re={lZuin> z6O)sZt_Fd$@A{%O?yUQ}-Z$p%#{_A4Y!s2QJ3N#}%50=G*n`}CdvdHZ#yx+}t?azJ4cSy!F1Z%3&ROkrq9r(M3`VM=zh5^PuGo2&Uqk=IdU6A#$iFt`~X5c4xhnV71+-1Auu+R41=9D|ba6DgYc%N&z7T zO`3%!;hA%dc*-l|f&ak`Hey~wXQ7LhWf~Dhz4oqA_-BUpVT48R$XWJa>Ne`_rBK_^ zJ&Z5wK&m9+=-hs!c!TyXA40M;VS20D1SdCxkfWsn0tf~nyLs%@bmPF&F9T97!NGxm z2=kuyyOEH;(-R<6!1OL~R%h;bLQO6*bFzeEAjl)1!F3_k$1al*ub9Q4rY2{ha2(^YU>0jSv{z7CwtFrq;n4QQ zQRvPus#q4|h@`0u7%Knp6o7iPUjRDwt1XCTGGLzr(E%WZB2?awG&bQlJinq9srQ9L z9qj;k2QwM5zk**dlMB`C5IhMmDuqHWrZPf5nBy=4a9e&T(_atl|I{D?fR*BtQAc<= zKX5(ykaiaqmmfM*PJo=6{|VB#3O;Pnx^=7Db>wb8yPM`s!Q8=fX1(;TfXB*H$$h%J zsQ>)((xM_l(JHPdSKpoz`)3Ol?;w4?^4n=@xehwm@RlrFze3Shg=h|rPRXPD*Z`t!>QkCu{5jp10IlrKNXo9zdjC&r6CmRens*am z0p`x%-rVkZScmP(T2j5dh54n2%25g6cv1%t3=qx=!_m0)XdIlpmy8xq`Eau|1EQl5 z^BqlU6y4d3DC)nxI4GcyQkp;to{@k8*AteCS&i8JQXtK0gbwzPp;?U@jv`G=YWV}? zUYs1eAL$cNH>*Pmy+z$Fn$*a)e3gHLNe#TNu=M9^Yz-$h1UVpeg{9vOWh3h*bwwFL zbO$O*HcXS)%zBeLFnsWc2mUlHKEz;pVrTtHjYYXx^SD^(^ToAGnM~6;v*T4=TF`X% zOYef|te*1_B&VJ)$sNToPoprIC51Hiuwmfmb6a9+ipi|HWzIJw`a`pY1(N&pc>;*T zTvnCS_E4J3q&Aj7_$+yU=hr#VFXW-U6X{q2u2Xm%>68(+qn^QXAI&0w!l~;C3I}w@ z%`};T1s$;@q2CDY0yj z0g_ue+s;2=x{kHA2U@~Vf5cRB^q`h%M^uz5=Lci27D>RU+dykY1Tr3)fW8kS*mJCzW-drm%rtXVxGxzLm{hwS zhd}SHZ%m`*I0(4nroaXhSLoXvy~(<|!DoCff(8z@2iJ{_%WUGQHii!gQ!XaWijJc{Vz+6@g(2Kz# zZ*xi9AYMtLp{!M5zBb3fG;ST^jQasH>+UYr=v1HV8L5V8)Y(O(0w+;~epDlckqHeiKQTe@P$1l9@Ur#@C$M0+rRC7j1Gj{6h0N?>;TI4PeJydX zP9?*UF)Wh9GG8plH9`;|_QD3iAGb@Bwf?d7liA(vOvEFGtr;)X%9YzhUwo=ar>tPTqSO=acW`{HuWaiTbR9e?Z3h z^r*xEy`8-08=OylwsE4q?@=P4^k+D~0f`nO(KC$`_0tn=isbwV%eh3Nq-;$+isHgp zTFSf9fgVqC{=nm$zwckaPEa%D>IJTOix0p)fI>fAZh!!l^%9|b(OaUA(ardeg8ILj ze!6&s{t88`7|6$f$-|*UC;Wwo0mSaNc7TxT!n%(SAywtUKOgs;K!P7WJAqMFE*w^C z$~ExA$5@L#481g)HIKckJFiMgX#u4d{t9$kYKQvpxHmc9l*msoWW#Raz3$|&342C6 zihXcxqH2|&*>YzZUpyFvoXZ=*E!&QsxDW=#__|6N`0)>|U7nej$RB?So$%4k9yW03 zuwg?sqne5AC`~M`Rnt`YI*~hjVtY2}7H%cQUC&pze+GS_1Xfy;YBN96BAuURYhB;6 z8~IKBy*$t2;y+HSSEs|PZPEU_?Y;R=v5u}esP&bSJ-(dt>^8ND$mkyD-rrD${L&ku zTd|h;$`VuEh?UNO+xH&StBC!ED2$$2=N1K^P+*Bn~T3f&UtI zeeSQZYoFi4u0Ec=%&z}NcAZkku0xw<*X$nuE_S6wRV)p^lU+A7#jfdozk^*L*!Tz8 z_3{Vy@&~qw5A0``Kd^s@WB-vKSgjdP#E1HS=0P{6<|tVl*j=llnGxq;ChwkiYy@^2{BbreF-6YdX7~gcdzDA z-E{PEP{EGEbNnPWNSao8ieK?ISH+G4GUKUZkjr54S}$MaYq7J~Gg?zGuuqmVh>5R< z!2&w&O#|0|h_U2Wi}*G}jKu~`>B!(fRza2Zy}RQC+pV4rUCF%*OSpA6jZvUkw#UcCC3O~`rY#Qs{H>fXjE(L)a5``CIX+iC-s10s z$6ww2I?gAyVm)C5zP7&V_yjE}5Hbf8;%fIH0D=r=I&w7tp~qD7mfe>> z!ggpQ?vn0O9tfCL7o~1NpaY4)1NE2HVvmjofR1;)pwAb_MP(im=ImZ%)+Mo z^=r@QpuZL`od| zM{GyR1w82ooJiHAMA?+G1#dT%^H15a+Jv_(;J5UtpU}gOa=y~4?LY&cwBm>as&>IY zX}sr4oVURZo7x<;3)rH1aqH*ozLUJFf4DBq>TgneF??phK!QfXh6ian|{$h z94hLW)r?)^C+voy2wx)n*n8*gz8~Z;93zMP=wt)JP2B;J8{7Af+2jSaDa%XW-vEB(!@p%MQ^K(YVh{33W%Uvs zR)Ww&cfZ1?^y6@1__deLawZJnd>b9&s6Q_9l}uTxy!7jY**y6@6lniuU5fj}u|58P z8AvGmHP@HW$d7eoH!r+(4iDdkbdK-db=)*;*w8^}TD^IT@r8PVi}NvadCFq!x@_P4 zIRyn)y1qeX@ZtrC!Iz=L4^$_PTujTC?s;-%oMt-O( z3mUS)yp4~K@So_nnePoZvVMR-;-2M)aR4nQnw?jl1*51I+5sDgr)o!1XF9=bI1z&h zr`BHnHp39mXj?JJNRT`gI-A}%Vx#Up3l&EYQpW;dL3}uV;MM?!(vFm&_@%^~7lEsB z;I~T;;N`w6AORq)zTw`@)ooQ(ye^u2c9_LjHnmPG@K8+yv6vuXp@K`=-+} zRC)9$BsJ(-bV95%>S2}b^ofC_u!HOCBAfHLEDmoen(F3fPmm7XxvJw(z;m%(3S6)r zr?WBHEqhNvV~Ad`vFfilUt{+ar;Ntwm+Vsc6g*uy914l6`AUSVpMcAbS++L#YC3#{ z6zsv-#G$uw<@Qa@bJaxtZg7=y(6CQt`;|SWLu#e}N`8-hZ?&%sE7XRQKSIF=@Pe!; z1&sH}!p`EVIU3u|?||heb@uIi%tSO(uM}R0YyKu)fV;hP^bu6#nnlD(ai=pL#7o1_8jtC!C{DVdO{nk+Q79y=4Xk+p^=^rbH}Q9 z+Lx$&MC;o8F7S}mBntwq$Nn_aSM&v*^k(V9IJ4X1kGL9Y)n}}tf^FdEue_u7{mQ6s zFdxbKI<`4A^}*>Lox6!T)>NFX)VHqdg4x7F=!yyHc+$;oFRm`p&2HsIb2tL+6|me} zxQE?-y)rx4Mu7-9I4s`Ga3vqSxpVEzDUX3ScmFls1iM=PeXOZnX3bjG9P?LLv(NvL zHIMx_ux52FYvSmZ`1*Hqrb3(v#q0kv&OEh~zM4~B`0}rECMk_v{%T(SYF_?o{>#3a z_}Ho|^^dN);(z?PT(nP7CrMCF=>*9`jnhMlRv{q{0*5O5ktvz>idW{9VJ580?Y{GV zn{y@1PQxP*S%7JLh7!SqbJ%2L2ifEd?)Qk_ka)$_fASM=L7V|zbbX+&5P%F&fivRj zxJYc^M`gEm_9WyZnDsva;a_p_ljk(;G|4e8P5tdO!E-fvL*q()f5IZ4;R5Vt zo)z1dNmB+hb~gtJTYzB5u65~)U=--j$}zT&4Nj9ZjXSq>D&PVvl{vUgIC z`q>w$pSFdh7VrhfmA|s7ZTLs9Xr51gpUh=NxO%2kv#Q$GL0eD#v?uC$EaG$iW%H08 zH@4w$&8X(%_L*WT+XO2ZaZ17wVH|;agVKN2OQc`R16OhWwJ$yV{viEs2R?5KETYxb z-j}{CaxG`Y+}pQ3|EMY?~T z{;xSv@ukkFdF|prlAeh#A@#}^SHMV(qNY(F)sio$f9^`fP-;4a!v>JH78qV!mxMg6 zX|qlvqNX(xuU5YxWx_41wj-Ih&~yBgE$Gp+C4WBQI>Eh%+*%ow?~c@^FBa*$B@d74 zh)x_E*HXd($4set%}J!Zu8!pc{xAMo1(ZQxtW6GK7VHLEWc; z+Q`I^IY2YFFDz2Z9BSDgHcF9nn{D5pMrv2+;%0y54^meefa}{_GWIp2<_U!bC$% zJ~Z3CX20z$6&U0zH=#Fe-)j7eIMc7Uq?(uPR4fNU1nn0bknMjAP-R+GVbGsCBZgD- z-P*TLQ27g_Rbi_g??FjEC=O#`P#OK{8`LsE9=@F1UxMe_YTLakhunVB`xX+l&dYjq z$67j@6JT!E@!~!y901kwoxvd!u{&$7R?|4f^tkp0kk3hyS&)nxhImhk3#eCG&6vC? zZ)BbbU=3ds%MTuFXPXc$+=+H@5AGA~bU$z>H1|570+@8!r5Oc4VgDUDH$YS*9NGQQ z(0p|sgC-Sy-ICt|m=kxFJ=gBBJ9uIq@D&Y)ug7M|9MI$z3vu#f7OQE>7K?7sVuhw- zu`H8WEWARvEfy#ci}l-0u~=y@EA3@rkQ^K1 z^7yeGceK-9mUO_=UKaaox4_FX!A+NsV)}$p(k@E0G}Y8(NJWtVB?WL=^$#H?IILJI zrNDJXe$MVY)Rx}{f0dzgM^1iM|8`aNmIEhv^*t2Y$_F5Xs8+Y&m-){jZ-lIq?-#=g`+n`;&bpuCXBug6fLnlaPu9y-O;Up3Qq@kLa{ zNGTS_^+qSviyp*XT_C1sdI&qFwYP{7DbS0M@J}uWE)|@mk9L*F$wPd>R8|$#5;_TI~F`0Lyl}z zGRsjdxHIVrgun^Y#I_pa2Fh|Hy0(o8f@j95IUy#~wr}En4!8}*H<{pfSe8Sw$zF_S z0!=SKZQ6+YV3MJ^iTilT?bPb5Ck0j<-c3eWR1m*NsBU!uyDw8yN` z-bK{vAjF|)-)YqK9bZ_6f+#K7iNbj2r--JKbc#^^4b8ioF##1Rmv6zYy=^xAwkvZG9Y8r%tGU&+nO)11_YYonk|It zRTYXaWtcZ_i}HP`X)dN8d+q8RTOP1aM*@fIHdej$?lcq@^EQolD@tAqxV)CeDmSXJ zrMFRIFF?){YV6ete!0rNIZc&)XhN0!{3?|ly;D^-&QB{IjVm;k!HK4(vCe;J?2k!} zZA2ea)Y#f9HFnl5)L7QsYbvZ`LWSMBv9fwgb60wVz}yl-#=I(PCmJO?_2J&q6()0oS<@DL0LdF=(B)EpeolH`>N_alG9tJ_&pe@(Dig Q;JZSe34mz}KosKhH=U;;oB#j- literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic.png b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic.png new file mode 100644 index 0000000000000000000000000000000000000000..64837ad33582cf70fccf7bf95b3da81e10240a3e GIT binary patch literal 5645 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∓1&T?fh4cG!26J3dZ|-o z(kRP_gN=>mo5U@GhNhhfV^3)IxJV{>WpG_7BE0yn!hn*30u9t+*)~ZrdHNav+bQs( zfi98JpJAq&eaYwKS{SvYdCv*A4h{ZaoBR*pb!OX6CA=$M*LWJAIxCMHTtS=Hnq z5QwU3@74gBx7Sm!ym5$eVn|3x+R`^dv2b!u6O1T6$|-AGTZZJ^Tt>Tvr%+v8-cP9C zw>MYWvd@4v1;|VBU(hO@4}dP+?T6O0$4ES4cjS3YLNZYSYYZ1K&`|$p=<4cfYik=A z7^tbKy?_5+OG^t1z1{31@q4SPrzf=S7NOX2vB#HNkn#MJqKa6JafdWj4^&_O{_bXl zD=wrRkk4#-b!ED>(uW0Kl9MUO$Y$c>pPuKur8~a7oU3KgW+IhmjOp+1_xEoOB_Jgt z`u5je$?op%e!9OU+!{fD=F}_kJIO%e3>Ewp`pa?>6e2NDy47;^yT|=QNczFj$Uxq3|0eOb~2pX7*Wh_r--a zFq5q8N5DazE_q(=KU-6X@uPpl?%V?`aj1W2t7CxK^{E>BjB@-}qWca)zJr4Uphzz+ zF5-@sSASW2Hh+f|%Gi**URsh25ARs}_U)VYJ27T9HfPv66TEbEbQO?nmzOSE&3w+q zw?ip>aTSD1kJ!V)XwOUH`gbDXiiUrpFU-S}3h=BB5$^-*oVjCDtnD_DNzDGT(t36B6iEtr7%8~gr}@>2>5 z6taL*R8&;zHK#R=*ry+M3$H+x_Dk2^H|s#4%Su^Q(uJc_Q&DTdCFx>5!)9DPk})<%s*4QeWXa`gb z_*+k)~!J(@B-X{M4vs_ZGb`D1~JrXMc9T2Jf)s%uSp_3Vs_Dj)x?fVibe zBr}o<4nJ#fKl2n5yLUhPVQT7HU)Sn20_I!FRiqzCKk4-7e!&n)&lj2GlDQ~YtcFOG zqW^PuL#wVHQ(eQox3?D?YbZVaHN{^2W%O1wgUnx(1=vJdT3SuNFADML>ALzTItGSV zewlVTRGsCw7$gT3Ryfd|2J|cOg)~Wi z$Z|8W97$iOd389Rhnq>q{{E`o&2C`M7anQ;FKdh2g@cYM2hNM8R8dsZubv6}yM)S` z6k;kW@Y65>DrKE3AGR1Ef)tG>oupkaJX-+Km41wEpCh5kRtNP3Jf2W*+)>#F^?d7G|f2OvRMONt4|LJ9yyLOrq)L(bxmE%&DwkP#c@iu)RX*G*kJepDz1f9{9F+Zj4W85K_%X)y2lf zs@BPa-p+x6Zl9cz^1!!OTL4IEL&MTc`4+2AQzYNY zh(W4#{XQsD!PE4|b6|j)Esc%+S|yZ}@W)i={qlSB^4S62Dm6T;NIy?1I|a1ubj8Z* zM$Pf<)jN3~Z|jH2^a;sLnTxl77j_HtxsZCP_aexcYYuE`;xd@b1HU?)1?<|_udk66 zkPpl*MMc36HmNk`Zo4c9i;9b@E6MW;3T705wG;iH{SBsTfA6MASuWpHQ*iT7e}8|M zgHZD-ymI}<#lMg0G@jlDJR}5!tJhHS6f7XokC>e&21xze9w2jD(`tfxFXWi`q~l8E lqSPRO`uf`e{^t3PHtMW}#f0%^4B(eRau8*yatR~<{{qsdA%p+` literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.dia b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.dia new file mode 100644 index 0000000000000000000000000000000000000000..3c6b965f7935ee0a5643e9a0cce6f28cc8777b4e GIT binary patch literal 1211 zcmV;s1VsBEiwFP!000021MON%kK#BGzW1+)(pSdVd1n|H?XG%HE3LGz!(5O_Oz?KF zkz<pIq6h)5`BQyl@QYlH)LY!)r3t7dUv11mChy&#el(fX7^DFF2m+kIU@R$Az15 z${Odr=m3!Y0{bFa~#d)<*YumE;!1(6A02Ps~JgG=BZDYcWpo@1Xr zXX8%9?}3P)=7Cx`Ny0l1-+8#q!)9L|MhKWAq^NR0CRP}Roq|k|4J@UHO)w}C_spps z6+_?hPcH9H#qWcPpBdjJcOrg&MEs|sv=EC>(eZDTkuzj$^(A8$AQL*dRJFQNN-Iis z0dyTVLqfjqP86~S-Qwi|G`k@OoUu7!VU|&+JkOdMj+Y14S@5#$I@na>Id`^m$!VIM zT1554lN#|HKG9aHMv7{eJo}!c9Y3Aw^;FNyMa5jyIQMW=QVHnBD*i&FFF2~yGAe4> z?qAE$%FZ8*0n69{zCSX6JxL{os^jzsqHB?GAy@MjrCU#{!AiwtUouK#wp7ezyPHGi zicRZmOjOOEJGv}?)^QWYTge6A%JTVpuN|gScflUrW&WSt<@A>ACNM2GRno)m6Fx9J zXjmzZU@*#@tufz#QZ| z>B+fbX*8@DL(nr667oIUNyV6h94~#D2$5wCF2)-2JS)Z!w5{x|Dm45bO^o%~E{wia ZoZn|ZQJFoIe#0_*_y$Mx^Sb9M004ulOxFMa literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.png b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic1.png new file mode 100644 index 0000000000000000000000000000000000000000..80b73aecc6ef0693c33ee80b18962dc2ee99a52b GIT binary patch literal 4382 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 W;30pqzZLL@2bG={7*weFH2ClB_IC>a literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2-er.png b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2-er.png new file mode 100644 index 0000000000000000000000000000000000000000..5efe5425309aefa891923a1c428a08030058a820 GIT binary patch literal 4452 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 Qw+X~R*Z6MP9sB72081um*#H0l literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2.dia b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-classic2.dia new file mode 100644 index 0000000000000000000000000000000000000000..e9c8b970f02685932189e7eb8c3cd6fa849931c1 GIT binary patch literal 1262 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 At^fc4 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-modern-graph.png b/sqlg-doc/docs/2.1.4/img/sqlg/tinkerpop-modern-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a74877e982abfbf64f2c72fcfffb02222b4d8de3 GIT binary patch literal 58732 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 z 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 $GDw@0LsV+ToW4%}2kd!Zdx|pCq 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

+Zek@%i{^2uu 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 literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/sqlg/vertices.png b/sqlg-doc/docs/2.1.4/img/sqlg/vertices.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f47516c2e1efd5b0a976e87bddb07292c543b3 GIT binary patch literal 19343 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 NQetwV`6AC=|351|B0m5C literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.png b/sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b33be772e38d64ab17ee989037b48f6086a674 GIT binary patch literal 163990 zcmd?RhhJ0K+BVD_AN7nVjw4N~jtU}82)$ZCy3(a8k=}{)5*-JSt^}lmf`AAFL+^}0 z2sM!!I!b`hLI?o@BqZ++(es?=Jn#2?f56B51{GHJUVE*(T=%uEd&fL5)IM{H?-Uyw z+Zmnvca7QD{)u5@J9+7!CxD;)QhLz|_~Rn@zOextTZjl7+w;HJ*baanJzr*H^S{By zw)&WjO(mU;jmIau@u3>T~}QgpG}(lllKIsp1^`!0p&{?%pyDnp~ebnPR%Quk_90E<)t7(J(KV zHkE82f85o9czpejS1puT0|dqHmg!xj)Z-4_^YU*ke|L|!Ma1bk(?Nkx#vR$4`rbAK z=Hj!JRe>+^Eb(w7M;#wZ3B~s;9tZAy^p)~nA?oMfpZgUCF&~@x^}O=`&wn4SEu7no zgtqbA$qkX2jbIG#t@jb1va!AURbueT;9iGc-(55GjLR7Q|uiUVE2U-|MB`RWdz;q!`CVPTl4k--LZd&0tZ zZ{n~3Yi^7CtEDbxe{wRCwR!Ipm=_!Ob#nUNU)g5)N8*%wsU=bRjJN0mzcteao0YCH zQ`}o|(q5)g(p617-+61PMTn0SB)xG>*Aua5tirImmQ>Q?Ds`1y-pL`GmjA_Vz_QpN zOQ@oSd~2HYbvbBj0-KET5>%1pX6)x9<`VhuP6ZQg9y@xJ2QVk;+~DtXL@sN2u2arl zs>H9$n^lqgG?hXdCD@}=&b`X=j^|3pJEJgNMcGfw!?z>z7c|Sarxtd*Kc?Y`*y#+; z5gQ1;V9>KX6^yi(6e4iDIOqQ3=;HlF6O>Kit&un+HB!)-&qT?@&&gV#f8lmzdxpn? zT-wk+_HMAm%0Bk>c<=i^KAet~>UF?o$i|hYcup=d^1YMJBvT{J4e#Vdh_&u*t?jK8 z|N3JG9xDvksgZZ7c_Q{xz~Z}(j_`8tbdGKRGOm2>ytj1H#6Pv0iaZufn~IXF$V)k~ z6voa{C~4RTHs401DT)~7u1h~Yn&NZa%$A^~D(N=8R;fX{vySSEsOyUX1{t=s(qt&v z;@K6HgZr0pPW01-4@2-0PRYivf0E*^s+iK$6*i{Qfo0x%LQ5iz@q16b__3YI3Q_NV zF|JnnXlsJo0=~uimD!r?`o%V9LL?pLjbIMbc$~vfr_Kr123*u_4(iIcV@DPFi0}jV zxr_=B@9EmHWKN&CLKb~ElVSsdh`q%$`+Ys$qe)-Xtq;;_68R?tZUe~{f4N@_d{lW9 zE;g#1D;pd;<9sxT?eZzx!-ZfQt)hSi~5E25p3hX25pQTGtJqk!-ywMn-<=UodMbs&sl|?ePIu^{`2VHN;Af|IPz; zLZ+2sty3>p1oCOXNWo7ci9==$i;K7Eiobj`?B;HY{**}ELkIT*wq6MS9YurI8pNnP zY^<@o7HvnVR&!do3*0}{q$Xube$iOYQUh}IKx~yIR|0ayj=aSVH;nEz3kg<|KNms0@uN z>L<0c_ggGdg+&c@C=G9h#=Dob;g?t+diPhg6-i%5GJBx*L4~b}E+liPJ!3mpX#hth zw#NOUxSJ%J8>H5i7%n1Wkj?8kSsk_J(fy>Kx$9f^`C_7*zmxVs@s|z+I=6&Uw zzLuXG_QKJ%pI2h9BSG8+l|1}glbl*fd>5Jsm5?wJvffQI6qlfwJeBj3c)yk5Di!#r zYmI^Wc6n8Lc|ej~F*TXZ^^f2-B6Vv*azn zn%wUrwPi_mN2`^wmEM#6_R9f25}#*L=(Cg!!5E!#KK0hpp=UgxNvNm%+koPnzH_4F zm}+O4eGPR`l&UZQwpQFYqh7l zobd1Zp$bb2=Z=QHlSp-*68UdSx6+E+Axs6ns%Sl^+}k8$GM zh1`(Uo;_j{v1_Enq+sSB?480E3^2`cKptFY*Mdue9+2z7IvS9$C?DYFoZuuVF3u*e|G(gT46AD&T&znr9@K%eUs$M_1I!tE`bPeP>+ z7R>Kp?G0MlC9R2pm}CJIToPO+VkmNSik2^RLjg_G`wYl~^HshL2I#A5A4G48J;Z&A@g z0^Fgy1VPPsVf#gr4on2uaaKKj8s50N#Vfo1-7;Weah1#Z{WX^sshs&Z=`OPbU~`gh zXS5Sm-MwGMNvTQCMy!=z$Lwzp8##O}uj@Q^b~-JIk@11|qZHJNz!=>NdXmkK+FUL; zD_R$!Xv0&G8w|g-U$v$$Zl6@+-m8^JP+>j&*T;(%Y9_7^d$x?VOeAVeRpz@3aJy3{ zkb4*IU6pRxbD+)TnJ1YTDob)GZN7V&mU55?W<)4<4r&Y8(IR@Trp2lf8x+T^+zCNc zLLGRoAgS|jYcJhcyH$4pjv!EZzo7)74*Jj>EzB3TY4AfqT`#5p!0Pc5!x~%{0O@i>tt=#5l^fvv12_0B_~T z&VGd^66;poN|9qz9z1LQ_L>u}MZe+3ox3{eRD$ia4u053GXa9p5SMD+8`{pRo0NB? zcij4Zn&p4N?k48iS^4*_HlgLDk|yQ3qMSoW3f@`4R_ky3@QzF6GQlM zd?JDH$T^SSnYKeje7((nRWgQtPzN>L-){+=vvn6@FHhK=g(NwA?-$AP;yx+tXK5T{ z>=InP;*^ET37oSCqi1M%z1w zqQAaB+fP!@4cT#(#<|3>dELcrGa7Eg5e$>^@CkVBJ^-=&NLML1`>o$(xlx$ zQN%het%cZ|CQKE)rt3$Hf(eb#vx zpXr3Ic)1#i61Fjc*hwU&45QO=5JOd*w?92>39ghd04~S98T*l>YTQ|P_T4+rM*@x+ z(i}z0l6*Np@^`BpxB!}3>Ng=sE|qLKkw?}Dc(GP3_#~Lz4>E#vwQlu_qrgULT*ppK z^NQvKg$=cre6yEs6R`HE)rsfb(UyhlF1F>57G7wW+}hg4`h@nwWlx)@u^Vw`dYnQ}7FEK{^e&9I(ReKoY^6xK);ywXo<&{RG5YenDQ_STZcEDz*?%oPK56+^IOR{?Xqzt==%p3S$-VoO zAwB6X1#3?`$LNfKx^Y#zv7tqa{Wk6&5!rX#&dMl^}_X#GV7PD%Rz zjTfxSDzIPsHKC*V@wJ}r@I&ijFzWhTl92qTE9eA&6}WY?{k7Zs>s3Z3X05n zDH1!QX8y2qqL&2a<5s+wo!|y5jwKR7rA@O!anehN5h1O3;;kE5bBg=!9%ZR zvDz89_Et!e#@795xpz<+c^{8M#h6&FPuG)*UJMqJRY)CsBoZ!3v#W^T^Ea&BoHR39 z?(Z-3z`zTyieZ9wQ5@kH?VyC3y(jG{$r;Ah9t~#Gp_myYk+M3adScGsD2#EqS5HN& z&i_fqlE zGE2EB0G*a0jahpmfh=n1B|qVUGng;RIyts)W!n@G2V^ynSf&_fiGKQxO94}k#pW0s z5y&DN!ds8mD{;FdBoA)BHRPuwD-W}B5fax5k|yZ-&YURPRVPa67=^}fb0$6KS?H_s;A^O%_lHu#g=ka-T84^ zsKm7{qPgWIWi;Bhv37%&RsL-r+eY_~52r^eQTw5thm;w9rrXLE#Yxr%m9?N%5ED+; zox7^*yrIMzZ8ZhjV7f+lNOd2+LJtcs44u86-9tOBq}r6apTdd`E>h$Lzkw#cs_(PT zT}hHi`M9Q*5w zVUCLYWUZ%l2;TF2m|Dt#U)y}f=>_?;_iMVK1s`e$I?1SwCK7?T8(qJ#pg|gq&w2lL z{~i+lkf2(PnTyzvb~sw%FsAl=ZEL=Q(R&?C3*&OHVlGhyrf=l|b1Dt|Ah;geM3Xz}-$|cqA z$=WRQ;=7)siuvI3P^YP=Yw;oQO*IsoC`sK-P!q0kkL^$3pXe`Db{1egZzbGd^6W(z zd*UhQ%1ag}yz{=aXRI4`7h%Ak;3xpBT`v9^O1_>R0$?q`J6xMtasDTeLmOn%p}?o! zm;gcV4L}{R?q2?fEfO>-U*qK=`5MT^#wj>I7wnbV5tNqJmfOi|tU;L%Lt>qstW5#> z=ILDitzdmU!(q8@;9`E2DPBT?4lxD@;8Q6>mZ=@A4}7?jC3nK}{pn!OfiK;Tn#`Hu zn0rFzc}&P;4RJZOaxIrhRdBZ4D?w?1Ox(U%Sn-XDnJldFvpwQrcEv2KS81Q-BzK;Ek%1>Gjn3)aB^ zf#9tkNx)-Ct>}711Lr`)?<(Cku_we;^8_2r<2<8}VnFqp@X?iT+D@ie-OP~47KeE##ktX}DLl|Dw^surX1~W7BqBu=g!wi2tAaeyKcm9NN%#!dYNWGshCeE~!r(Z;~Xn`76VgF7bO>`p!-?1)fT<9O`Yz&OUW*oWh zj~z>pbwWEbyaj$3O1i3~{eM;sMYqhAV5zXeXXNxE77t{_(S&|==IFW?{U@uJvaI88 z+gU?y_)TCC0R|KGLgLKG4e*JqTU(j*abr^U=O4$;<_`vsz{M^rb7zg;KXeA8uk_s& z%4uQ^8>ko!U}C>Q9FrSWMn7&UvdR3@b5Tv@ZXVcyi)Ef{Rn?veiZ#5cE#tBUZ*SRs zo+&eNZ2wSF{uUQ`9Z50)<31lVRcLoD3NX;LcA?K75}}#XZeVleL}G-8jew?o5Zx_F zez#_oJUKVEISJt4Bz}04NR);TRE;t{&OAxTJPhkETn_U{u!J_4QY}LX{tkWRb#X0} z8BKsc08tP%oBpG7EO5YPP+ES;@p1)oT`wj@IBq?+9xo_waY=xs-2 zK}}-B{9nJy%&!zDPYKq|@CD8&UYV>TewD~eU_JVWJ8?W1xo0seoAd(f@YhlkrI2AE zQ}%f4;gb*eB0=o^n(n=Z*=jYeOkWK_)kf4wk)|P-E`S9CSeipG+E!ZICyIN^CI+fi zC$$C?vE^JwNdm*$IP=?Uc`Rr(mX3dE96p=>`rt_MI|p0D70{EQ3>uPlPCw&T|WE01BU9`sEnk zb`wy%rG*h@iYwyu#g}B#4)1uRaKuS+6Q=6ClYN_TwYPe({9et4A>Wx%X0@)(Rs&9i zLi`xJx9Su$6n;i#+4snRT*Nn%#*p1{1v`L&+}q9ao}VH@yY=k`8kYEhQhP!^QTd=7 z;O+O8=ZH~C-#@_CcC0iHw@s!Mmd9MMaNG6DH806rTu#99Icct?1Ax2Yv4`fh0yKNk zM0w-tD!^V1kEC)>DsVBmEE1K=LL%p-$0EB=iNK+@aCmxH&W-QIT}Y=N8R&Vxi}mU+ zh8Zd?L5$2}W9|rw`nSnqJncjLx(di+`K!u5t|bH*45)Ykh{eYP0CdoGg!WwhR%{;* z0JO18vMI|Ou_$0qWD+}n{dzv%h#tuE=;@mx!MYHE`IjA0PNKzfF;#R@9TP4I_>F%b zYz>dL^m%_g4hf2!Pt%ibz19Hjb#<0gs?d`_JPo7oJCjCWNfwg1VqcWgcFYargTwX; zda%ee%X}of1TN0nwZam>lt0LNV^d(L?dI_FJm~&v>?~CT2|A9o4K-+qbv~dpY3w(K z=BdjDFq7%9oM}1Y4Jw>6&E?&?uVoXyxahn0MjM&OXx7@=3&v+(NV5;o0f2TOVm=o7 z3TC8Q@TFp=(7F!5-CtyAZ=%6@ha4`oFGt`dzCgk7V5`Oi4=;pz?Uk}0&FI~u)G$*2 z2VGT+eikC68k1^d3UydaEey`z&BK^bs53sBCwj0wCPnfpOX!@j1biM;szGyi0`HI@ zPdCPsE1EVYl@`9e%!lBmNDC%rfz81?qZR-w3V#KZHL@D}3%CUYm-$}!_VNUXLw$X7 z`Rn^T2^AAwt-;O-Pw1AXJntB49*)#ATB-8@$DuD&O3UVhdT)*J*;7X?>=VQ*n*YfC z^!xCs{q)+TI~?j|R{G~f4dcCRRgl21erK1ee;m&%FJf*VzGH>Lp;b?66YZLi*GtQO z2X|@kuuFWt`Le66_Fh-rT!eVknG3&TG^ieGssSEhhdUNMiRYOp*`u1&<-09|>gpA* zFs`6n6Bu4hv;7?)X^ommd5lhg0A`Z(@t(DWbJ4;PcdIL|N~fYWS4%%7ekYy+j~6(c z#&1)1gyS={!S9bRiO(`z=To#=wi(vJi_7D_GrX$189_9}chZ-WL{w#;l*Jm^zE2qP z-f@TsWl*2OvD@VKbhSg%C;A#=#j|FeQ>p?r`{}B0@;lmq@jm3JomQz5>#$0)}gnwwEo-6B{BZwl533 ziFOFT2zV0jp$7rd^5QrTvH39IG{3@?TP-B6cEQQAx=S9eB1=8JUyNBFVEWjw+OE^se}*$KpUutVb2@2`(VC@JyV)MsDU#)xt0~Np#GsP-%)Y)7S|%{Ia&+;6Ed8f$VOdKB#u^lFZAqj$GUP<)p9*szEuRKm9`Rr0$RO z`dro-pV5`x(KsO#PUVhs_TszoI1vf5u(3mgqGV7)7K@UGsyiu4lM(DNiX(S zfcJk}ZPwubP0|-L6NntXye73Swg*rrV1ROrt(y%2?MDD~kb#}^5-+FS8Y0ZjP5g?o zx@HtU$2$Bp1ICzXClrO*35U~Sl$UC_ih~}`wd@+kI-f#8$p**fQ%sC1b{Z6IpoDlb zxWY|S6}N4Iqd_nw{`y|%JnbYkb6(iuT0DVyaKdExz1woA4Rq{nef;P-6MB%aklndq zeZm&m|J%DS2)i_Y7;nIwXEE<#KN;a82|4_HheLNMgz?KUel_gc7GAU5YR#sNF!sWC zPCXEXGfIjbHP0g3%=uL%;0SfIpJcHNavoH)?pEFG?@6bjvJqA5mGX4@99l_I>Z9vv zXBu5nafbJ-`oUdV?GSHmwIfhgZcjf!Ed)?K>$<=l!a9=*g1*}bgmuO285LnCYFt*gP5 z3rFzUzbW1s^Zxs}JNCbhBJk^bvCe#-gi0-&2xH=jYV(`vz}d-ZfgnAbph4tdt>?g< z!>@PFBKf^(qV&z^REIvvI*C?fk7y1rPd3zU>+l4>7cY-Z(8IFERkt1}T~i?}NWicA z7U}y*;ZA@pJTHB?miiP?r_i)sZ6Z;*oGdgQU3(v$LTCHi*nHd!b-QG%%EU-nOser4ZGnCeDWlA2zYg}>dmr7;JM1~X&*RJw zoA{GZGi8WyiGWj@NJZm8ut$*aCA93$glEyW>f8D}=-8EM@~5t6olm%A2wy?M!|Z0@ z>+AXu!p@-sUNE$)iP(IeN^A-|-AqVygR~e`*y5-(8%)ES4Rc13}ZZr~QVX z?=5$n1s4Am($7(lH&kEw>#3b^Q1_FBhyf<+yRR}AMy>;75;K7lGOdTZQ$Z`E zim~@}4&iMgiOO4>A1oL0X*>AUwFCLRmQ!t-RX$DwHP{$vw!dLnO#tetR8r7Ei4r5b zYQCa4XZi{@RavYV12CSir|rED&&-!Wr0xfdi1n9?3PU9lH7Xsv2$dZHGD{6Z=i5HE|zqr(q+@8@Z zGh-rFH050?G;D6|DHtsnao4Zy>&Eg{pH%r48N?t_fK=)X9v)E8voe;i`JSYCL6y*~ zhwv$S_gS@H9&2k)i|Bk+48UTHI^*`16(}x08QZXXF#c?KAem?%N~qxtLlH*1e1J2; zPx~^>OhY&2>o8E9Qrl>)+mI=%QYX)= zTQ?G%{pi8#c#{ZyCvNl=@Ydg7-N3R{=_><@v)y@msa+qU?$GE>MBK_laPpk{x{Z-T zqmQ{hW!7H3NREsnndyd?=`S?jS z+Ae@$-d*? zweO|D*N`zN;q&jz(k)(!N5KR+Evm32Y%hZ{$+Q|?ALAmv$Q`jek-+D>X9zb>{2y)H03m18ySVEzkM# z$iQ**754Eyi7Nf|DoiV~Zh6jo49<2^D9k6JX{@aEKp6ZzlE-l4EWg4Bv?aV@snODH zrEo1cUS9YqgP!W3^07AEJdbPm>wEcDv@$-IM-XeP*Z^%Op^#*ZS#=$svcp|twW(9S;*K6MCHL9WKLs%W2$qQ>6I&=RT;>2wt*N@T434El13XrG=S3h4)bVGo}stv8&YI98AqM==!WR35| zC)$?Yy{PJ1eBF`Qk2$>Omi?5v0euX!%X0VYGpJfJ|9_GwE& z8p!&E6azV*nX*vIMi0lC<3<|$Pnk99XfCAZDvzi=Mf07*FFs4w@fXw^_p<%R9yuox zl&5^^FO{iUI+%3F1j98IA^L8=2JB+J zZxlJZ=dHbD9-kzO^_R{B&M40YQwhscO%_{Zckg9QY@`OHzz!0Qn8b&q=|aNS zL1y@aaou2Bcd4$=g`A0tgQz@sa#CU1{ynv1Xc?|ChmRIQ;K|jDpq3Wm&|m6M8P0h; z?(mubSeG@nVX~AW1j(UHv}{$R#Zj8du`Om0vtW36!&o+cjEou8sG}35-McdIHopZf zlB?Uj-^L($JS}9Q)N7+ZP9`3Cp1DO{nF_@0QRnEH(`}9bz(f7fdt=sB4y*OMd=N!!nw83lX+L-1kglu8hSzXfZO8Mvpz)GY}jOnQ21pP7!|#oC~)Am@J^a ziK{|u6hATn?Ilj(UcWpWPr{*igvHmhA71;1OTX9Ynha;H7v1ZTe-ysOilooqQzcef zX9v+pB%r|8V(@#t8a8CO`_UpD60E&ST=s{WjK!;rg7A zASEF>kI7)O9>1rfzXWzZi5BA2lq1`C!`d5We{VhX^^0fFo0N8!FXKjFMz4S~vMxU8 zBTx+rU?&mts!FO z&1J1CksuJ@!cd_6c!T&7#jl`Ldl2NYw>e&b*+3G{s;|Eqhg7rx)Qp8rtNmx&;haxHu;;M%7E0 za}G+eeKvrha+zDcpCk?lz-B@zCBFK81LxKSOcPf!*A51D>J#{s{}9X0Sb-8-cnY)= z;&&9sKR=p>0we~)Vr~|gjm9=GFQOfZVQ#0qPj_Y?n0p2Zzm2r94~x0#CeUFA0GNYG z{!F(|wafC}UR%+hPUB8geKEGt`P2tf#pDwLgSG0&9^J+QhLr$e+bW3PB& z4QHe_OZ#OEp=7x)TFM|L^0cE8#Im;fR8tBPZ8TVyS zU|Plv-!b@&COTnOt8G^eWGAhNDMJ;FedZsS9`~=Cng86up%d%4QGd8w5AY?p)l#^A zM8NhSYGh9}r|DUYbDki-Fm(H&nh)a;0US=(h6pu2Tj9f~Q$50Hz8Xa*w`4qr_tFEV zJk$1QRhan&6T<{R$aXcNjz-Lon&g9M5D`kb01uu zZdgpSfo?QpqCWKA_G5=%4_vhoE4l;_gYewqgQ($RES$8D&qMwyn)AErMz!8hu1CR6 z6OzY1KF&5^T0}?yG%hW4$S>l zitraEHs+|HH1nVe8aD0vS$j1B5K2zwF3wfd zcw5CH{fysLJ?21<9uTG*^Z=Dll^=!aFWKS`n_43zOhvNfvR_#Ee^6< z$~o+t>fp9qpA**Zt8;EJWCoiAGb&GCV}gO~a4)2dG-n!T?(m1=?RCiETE!|Y!Vq$p zSqlG1A_z4kfS@W22^u(>@xo4LMGq$(`>>X(pD|n5^ufqs@SS}c~)62WP3Sdx@~<(FBy-n z(Jg&5(^ziN4E>u<6*&%yY=3d9jw8MXd!UzU-?Tefx)wHZ`+Hv$e;H4b#=(6ce@-nw zEO00|(}bcD8PdV%<2-hp1a8ZBlf1dcuBWkmNrRvHx;E#4*es0 z%(ck;zl7a0)x`7c+HdHRM@fi?+| zQJ&_I8`AoC(d<+3Cr!C3&*4s8LjKa&qk7*S+r z%z4~;6*`_WOZE1cgETF)5qPXz-Y>N6h#F*$JSB0(I-H8UcwR*R6_wZ~y zfq86GUeWN42FYzbFJdOpF@et&2BS2XZ39V9I-lMSzOq<1aBYunN61EO$#L2Xwhea7}m^Iv1|EI~Pb? z*gxjobeY?_?7*gN_aK4Fj6i zzJrjd%nFNQ1|VNP^k_o&Kl6BUnv8p97jc@ACfs2gm?;y*zJ&789bWSHlEXiegWxl6 zlXN^2RhH_5zO{zJxNmC<`nvc5aB@F6r+0UP_*{wdXB?Q6Cpo@~-ysCf@>_c}-ZK8| zH`fviPxK~Y3O~DdD9(k!IH3}a%lU(zEj!8W$?b{PZJQK)uu&7-CoO=ZxuA8D zC~g5}6c0%4N+1uZ+aNmM)Xv9OD_@?-qeg11>y{@S&GjSmU)u)GiUn^JrrG9JyMF5V zBTnM?!0BL%XDcHzOon+OP%EC#WO~%Wi~E9wt^a7y*2+WQc@nDY)j2NqNq&#dPXxmI zeUY}8>;TpIQ_2)c zC;CzeCxy#+VYf-BKR{g{9#{_5xYvcjm%Q}N`!GAv(VB07)9BrdM*Kku08$3BY5y-=9FiX(rfwvv9i-12@>kH-7VB4I`;r@4m#pOLlEnMJ+~H9DL#$S; z+J%qaeVM7>ymI^$@T3m~A{GV_UG`&TptmN5s+Vgg;Mz7B!X39S8OcUz#v4s8at3tk zbbZ#VTOKLY6RDsA-9V08{#l-(BL~^Qi58NV-Z|{ss}mWPaKFoGc%bgSmHpug#yzDU zL0eMn>*|)lpi=kUpT6H)Yyl48IGZIJ7LpM=wd%OPU`7d7-&*=5R#e>v4upbfD@r>H zIPi8qZpI^S9N@$m*ylL)l@ZVuaq2R>b*nNcsJ3BL8EQx02ozty4A7=mZK(1EuhWk0 zuJF%=9r`EaC1iZCI(Y=7-f11l6|JiOC0CSU$`xl~&d?7Tst4%#Lq5ff67hpzK2kGZ zE@LQCRbe8i`k>KFa7AiSz6MYvDPwzoG)(%5<-Q!qMwu?waJ{7Nw{xlPhEZ?}PJ(s2 zpjrHs@F#9?`RD11`O=EkcwhUZBmiq_&L|Iz61C$bCjs@w8VRO*&@9Q>bm&032Q!Cw z9};o>8!A;DPw=Q>`-t;xmic#V0*&+b+-&aYwKzsRL>#lGauCRMdDJ*ogWENCpw#IT zTWr7ZGCRL64dwAy0aK+@j=LC298}z&tiyQes5Xu)9W^ncFtY=Aa9(SZC?#;JCF!TC z&Czg5hbXhO-0588Z5;KAq-K5 z0XZx}=c1}A=2~`%`15Dn=nt;10paiBQ?VJfBG-?)j@S%fiM?xmskBn!+TnDfpz77S zk;UqBP3V#0j~{EKFITjZ=FGFoPW|X)(1q0+q)5cYJHGvwHp^AY!b#Nm5Jei6ZZk4U z>{I)xMIRDjKluck(fE(AaIy2sQqchh4tjvofEPa5Dpo3ld=mOvUt;$sI zVno9aa=O7ap4Z9uuHMr=YQl8&2;k_YMP3$7(qIi>>%F-e3p71^5@!P* z^$nP*3LVZ)UGL8;y%2AZXu_AJ!)lqoVPR~hR^U?vXQNq!i_B`gj0CN4)cRwzo6yx; z^{z}wCbKIx&Hm`R&l`rietVi1sirIPpNi8$){RH*xWzgHFx!F+5NZB_TKo#v@ko(@ zz@KUGgJ8Jq{i9|1`z%8Arxt+iE2r^8)(nOoDZ&0AwL*_eIttUDNiI4SmYg3cB?^!CpYbNFGO|Mmk-u@6LFd(GAu)Q~J}p z3_g8eDuaPV0(xz`eNO-luS1+3;`qT!P7BP=p!kAu)>D0aP{}ll-fWhV@qg-1#d;B% zw^`#dZFVOWQun2JViS8W9s>GPR~xV1`AjPgp2Tc5r>$duJ4+o6ym^@Vlqm-FKmN|v zM1pBd*Vi(<4(z<|?DhMsgXzaosivfOTj$kNH=By|f!5`s z^+nELdA#mcl?({zIA)2d-%X_Ilj7R}Z@TaNT|e{0qwo6WhHr-kz?o6HO-1nw)l5^j zeqM^c9Rvm^w%U53yGX@e89I z4<>lcf9le#^h=o7^?o@QGK|qceekA3%GPiY%jhE~*a|POd|L0~bNEkWOZ3Z3#`cehf@~&2x#RA=}|I0gprgDB}zc!aL%lPgWJY#z1 z=pRha{I{K07-R(m;58fWr1=Yk%>Ud6D{leo_dX&P?cOeQ*5b;wa7*SsR03RSMIu{g z_#z+??d>sc4Avih0Qlvb?6=Hr_0-YDA5S4)E%RUfXV`=PEoK4@(SV-yr?poU`x2dHFXzKu!Ue+M@>eD@h3X?9qx` zOsMwEf9PjG@02?mRr^N<>wN;%0;d3n0>rjvovd|Bi64?=-ju1#ci_qzcWH2U3rIwq zUdsFPE|%+P%yVw@OeE-(v#z<+y_bM1oKMJ_c`4v9cGOj3MmF+T5h1Ef zpYB%(xZh(#iG|chi4eyd4CZ?Z0I|N~Wk6icn%37|-GZPlIOwWgQ_%q)@d2MV-g_N* z(*Tex9Kn`9waM3l0YNkqCIE_aSyV$mQ~dw`-~nZWwJ}zUnY0*Jq0^rCWX~lsH``U2 z6Aftf69h_Mv2J@m5|B^>>)%s(?B#gpTRP-2thf2Kq-atG&BxD{HO9rZ+=3Z_p91av z-GD59uzo_l`;yZkGXxsTGdi7q7~}_2rzwS0zwhz43I@Wc4dr3`^I zGmoDzz_`SbnY39iTNwAcn!(GAX~{s3L+|SE#Xp7h)qvr1T6T+93E+Dl)5WrT{$&$C zc%Z*(Y?zTx7w8q(!2n`*O+>2MzW{>UPvMSR#zZg>X?IWljCss;|M6~z(s7#~5wG&@ zRFSOnrHZY`K%xiIs;sXU;4XAPx?RMXQ>SsCwW7w-=aC>lt@^^ZFEyB{Y}cL7%*+5} z{?{*~t}U`W(i@H(;+?lnP{$qy*SvV`K#$5L14GmNFOdrn7!w$k6S%suP- zMTi)m1hbg~%q7FRRK{S}Z*pfDzeqD%9$-h!^7cx8KqvoMw!8+`kV5I2qfU^&>nHq~ zQt{L;!C6&mwqsaaN|y)#L=1j*0WW>1WCE7;vw$+KEL&nlS(u0w>rYIYr;pFE+ z$ZAg&i8x(KO78K61K!Mh9R~0+5uhvL2@4;wiKR9&2(#@p+H#yGquR zemlD3^UAMXzxCfzURQZ35LZ4Tt?1}$AQ{cB{XbI6#Tng3=4$>6W6LUeL*5qm9WY&M zL8%b282_V(L|JU&-}X8a3~2t(n*c4A%vL4f)fcoMj>F}d#rNfQE^x==07ihlfdN@r zKfCVK?}Dr@lba`4zyh!;RvDc$z~-?!Aay_u_&c5SschLu)}}vQy5})8At-n z#GU5mKjEGq&;z4o*9q!nx4*}$6=8yzwIN z78ItbJBUw=+nBK2bhXed&RMtNsKKWjY{kOc|C!MNcp&p%@?_!7|IFt%djz6>wqCE6 zk22x5+Y4Xd9Rvz~*?KFq%krGbJ)~(n6O&Y+h{@*v8Pxbb07wD|YS4c#k$_Bg->~n! zEo{7Zb&Iv8H;;Q}8F${c%UJwRRAr*T(E(?6cx^H!ns~02mNr6Zp;6~dIp=R3m%G)| z`P&z5Tyl)VeqgX7@xi12!`@p)RlRm^qsvw#R8kPIP$WgVQ3RB(MTe5ojWno)pnyTQ zBHb-5pdgKOH!K0^&UNNb*!z8+_x+!b=ffG}^}`-}4B%Jyyyv{;HLp2u?}MP~SW)8= zx8V-9k7eG8j-2crYzboiO=n~;;+Dm|ey~jY(&N$DpOn*kL%bNi6HT~9#ZfjDSv_ib z2C=Loi`xr%o7{#fCc`d}TV($t=jV%`mAsK2naY|_SvRdjWE1~z1AQvFUFBaWmn;(R zZFtg9-2MG2!&#%Dy_{hMhLBBTl79B!28>^E_)%X9dwXHZ*~!`cZ#r5Kz{GWU;ODh5 z2GmuI|d55f!(Lul2bwl&Mh{(~y5eMH4==Yc2V$s^gCUpM% z|KMNLhZP1vN9>7Vsz~)4EmD?=4~HRm_0_fSo{F12nv+l%Y>({e>Ijn)e{_#AH`g{Z zDu2lm^utWF4gRqTnZ9-OP~Svphn6JYpEl%J;5Hatp&^U9GeoMlzo^T?7z`r@auIwm zdqaBf5TAP_4_+c7asS!aONF_&v_lwm$Dh9|GlgvfB1^jidFl~^*O}Iii(nTO8#51A zhS3C;qPNZdm->{6~b8Qpu^1;F4Y)jC=nQZvIwF=^Y@&>|SrNh@vD-Ksb*UCsp{+nPOSt571)y7&$e!9 zuP0bJ?y8V?01jZ=$UhdNm-(6mu+jB?-Qr6}PpIISB6uHrqGGL2*T$r?IOU4s3iTE4 zU6l`&D8(bzA&%n*H3B8Fr~6U6D&HjXtZW*IXXdglZoI$lgqXk|tM{;uhu+b{Nq%tb zGB&M(jY<1uRrq*}X-5S$I@)O5t^;`pE*PHVa^z`cWyA~3J_=6C-F1#?{5B_JnaH*Q z@eQo2s{KEfgDqkl@4uFVb18zpWW=8)?_Xyt+v>;4r|_jJ+}}Ci^4|qnQA67$-qeDT zM%!d8oHmDjQ9qNdCEB2~Abm$?QrsPen9%uddXGxZxT8#ZCP`BW4yOuun9^4)L9XJ( z4hvayDMtMkTO0MPjg}rwPT;A6^nbyokRLtY4K9U$tfcR2@wRSxk_ygZ*QKaPJGOsr z`os)+bS_n0-c@1vAJ*Z;!^3qTmtFQW%$2n}?QCl9bzr6Nz#`T3OrP~e&Q14Y&yL{J zw?x{2!w37<0Ms)dX}kMp2NL~qE;xxX2z+B}{_?0VmF;CU!M`SOy%pLaKREaT7$kR& z0*ewj!dlNxPW|9>bpJ{3y7AQmww1zl3&4Nk#DB*_!)fgf9%OymDGnZB>B15RfqBE~Q>$U)_g2 zpcD=TL8$c%%WCNUCGOUsctU;N!HC1$y!g87K6|x*{KLP7z|YkF@2+h7j&p-=!o4fB zc4}VNmk+vy#m8v?^%?!K0>{0*b(r49`395joZP>bwbnOr9Q>-JZy7W@gQ;c+=@{|h zp$!k;0!ORE2f`s;dNId00g|P5)4{>qw#;+8v+T-O&&Sa3gTJlcCHeciaYAfn4vCLm zu~KYaVYS@8gxeCda6b27Gbbzru+62u4hF?&mLf^lqkY+y-@sT^yXsRm`{q4dr$v8s z{Wg~Zxij?ILd>w2N?2z5$2HKBOOgKP%KS&1DnlPVr(}oc|F9}=rphD04ii?2bz4ok3(wuyy+tz5*2RWOAgTY8%woJJwa+sL=9KR8HWJd;b+8Q)oBx$-Z+)Wyu`GTFx{Rc+p$z3LlK9VKJUq z=KPUNDU}@C6p=%imV94CS7Wk27WeFaYblKj*QWLzA)6NVO)rvW`UeBu8GnR+EhkB( z;SHmDR~{&+7W25QWqHjFj$oJeYwBZNGgK-V7}Rrn9~^G7&N#VhR^C0aw57HJL$C7| zPF!zYb&X3bw*Am|Bu~ixuE@5_TdKb_FYPg&qflBnhIQL~oju}if38@A$%W5m8hbF2 zrRsI+=+P2?9XPeS?RJk9h3?1ReY)a2HuEdX%Uv>-*ucH44W9^a9hL6DVfHJXVQr{D z)nTT*>*+RK={TOpJd*}?*~{z!hPm+k?tBN0OGX{lC)KpkC` zRTN>je{|OW6LxoOQMZP>ZWBj)aUg4^hcT2srbpw1Wa2Xcg@|X==ZynxM0R!t!iuM? zPjMHi7#U3Y5s!7qka)=m9MGm~71Lq!a&vRrtRq9V2UwmQ#+P??{xMp81_L2aH`2ME zb~p7s{ozM!kD^tfSIRt_6+j(YYa!*rpWmOV|15Fnob30CwnRHxX6(o}$<^u9w!`hh zw&TtjfSo9I^|7BhANQ_YaKBu!>RM`gIxee0OE#^LTxxRiS+juyv1h+NiyTxiMp#^g zFH${z_}Ae*H))7;JPhiX?YI6opFK~)fRm=2VLaP%24$jBre_t#zFWh-5Xp|I$rcOE z@-%3UP`w&Q8^lR}UR}}j{mXkM2f7TN^MxiRFAlHwfY8e@HGi>9pa5T`#5Oz{h0_rE zarmclbV{zv_R3wuh4k#*&{CDFanFK-L%rso_iFtUF){n%SF)eT?d0^iEdUN!fPnWQ(>?NbuM&??JFboj7B=VWJ3#YN0?B>6xuVpfZ8 ztv`j~r^BD2#66dAh1jwCBiQm`U4fn7@z9lg&~ao)s36qXWsg=V7{bvM!|(hmz!g-3 z42LBql+d{gF~_zf_4TJtqoY$U4e+{djrow^A6_@^=ebtkTwt~w{wk(*B-y4mfYM~_ z=$?L2OStbG)08rBZiod8{$ACIOmbYERuww@vB&jWd?)mVp*TiP!mL&H7!yFj*>e1F z|DcFi#x7s&2w~Qys(pJouO5aau^D}Qbp$I>Z2ZViwH&8{iQ@VcgM)*g{^`vjIf8U? zkKmEQIY2wv?Dn?)<8Adv|J;uT?$?i$h5G`RgR@+IJox8kcaY0Dt30JKxU^9oPo(EwFNdUPmqLwAR(EsO6gMGQKOeZTBf$TVs8Xv|KJDq%gq{6l5Tz$T2-@QMeN+mg>qT@W_hMiXn4QGGF z*O71TW84o6larIPx&C?7hw!K*Cd%P6-5HT0M>nKpfp;%(0GVtLhz$oU)Q=3@}bHBo=^U}}rvsgN0GSihZ$Csi+9 zvJb;F%41yl={eLv59np658#Dv`wtYFQ7C0DR8GFCc6cA5X2qCe$%#%~;V1C9t_lVO8`?w9CELO8_`qtg28KiA0-I0P z@${(8V#Tg`7`urQ`Sagx*ZzPBk6F0ysvlrnch=6qbg28}ft0))whM!OpM$ggGf)bu zs+VJ&7mAl)wqa7%9fd^GPIlwe2S=vG#s}-Uw0NQB_pkWXqTThmq81hw2EXzsB`dTqyT?-1n7n8u`GwQ<@LU04P}vFckq-tMTtkS?>Gv{?CW(dfIYy z>&OG=hDx843Ai|r2U2h{U2*=CL&98>S}7gDZeno%@V(>C2CE;xItO2fSj%Z9VQ(H( zi`m_}l`Fwnp4}PhNmizftQNz3=fj@D&;f!IXYg^|_a>-os=dxL9@dvpMAw21J(?o# zK7F8)|4fd&&QcNz%EtVK>FEsU*vl+B4@>r;FWVDdr|G&uXS!-0!#~@c`(K|DKp9y( z1-sm0q+*WWFspn6hq+=)Mb-6eUrdBL_zs z(-K|t$%l$unt#1B8{BMH>BD*0BqL>-fwC|(2;<8jVmfsKBQx-OI zWbf7>sNcs5dbA{3VIU{|Sz#Z1yrB}iwAC_)d3Ez*8b0ja>eK0_@R^Ds`vJx)?t9B) zb%F<0&pHyN{4qb4CbY6<@JmT{Uz6=l1(}3$SCHv<@YIbDCB$h2zpMSbO+m&K1Rq3|RvD1%OU9Uyuel-m3 z?EZ>{`$}nZ4%sT;gmq3P3GN$#5_+z?*nPG$Wo8aOW!m~6Z6O)YbeL}S&-XWk^9-7+ zVPjLnga8Vp6UdWAxAu!44;YM?KSs;;m&n*`T9y{(fb6E9Hp}Ea&W>Br+)h0K+p0s_tQq7VXUGnjnXII38{-G z?xL&0VW=hlDS4gOG=;~Vc4m@lz{9CeIEHFiKNjF3q;KB)V<>nYrWaU08!mH9J-!NU zU5O|O%>eMCw$Z=h#V~2}-)EU#ogt8BOox812*vjXW~5pUPrq*Tn{;p~eJvjIrjQSg zP+7lKn7cDZ;7*n(6C3k@1&!7*wi&dlOVCA@IKJpG7(Q;kt7>FC{E>yIGi43&9VDc>ql%d+xXRLg5&pB-i5C>1O;FVt-gr# zUx&?_+3}gq+dh>+HCHd%=8sZ*z&~1m1(?pVx0RmPBK{)0;0MPeM)g9;iPWo7W>m1{ z*fTHxSZb}kqR_!Nm&=VgvXF$w5Tksf9L9aOmoJK4dEbBQ$A*|)iWXx+DtTjKuOlXU zZf|?GE3Kz^5wzn?fxBxndBY~(Q(5e0hDtY`sC8ZII@wzB3jWsxK?H0=BI$3V}1R&eK6pfTU=LbKFda3GwsE@|4OVu4h1{B8?_#Zn~|tJBTr zH;0~Ut4)wi`kItgSRNstcl;3Eq`ttOhPf)sW7z#lEGcZmOvQ6kpz4yo7GW6c$^jE< z_&=Eq6q-ck>HP59`&w3J^~MKXx#69ho^G03fPlN2a2VW4!l)Kh$y_+?XOcL6$V#GQ zqanN!`i+GRSXAyWoSQs$w3nL(9w3yoEcjyYtU?*Tx_~5y10G6*V?Alr0^ar$?E!1gdQfiHA_4 zD757HyR~5`5E2eFCcc($^wUGn*nAO%T>v^G0ts|4wHi$_i*E^1ahR%nJ=mFBtvV!b zP#y&U28rH5xXF;~(jWisYqD1cPJi3VbiOkzHIrYr_U#h5tCS}_OEBBLCGZR$`J~8^ zrFA0f{w-atfKD*LEIRegyickInBvp!bX9+jtg2UMd?0^FSmwq=5rQ96Uozpg7%t_`UcPtJUl9D# z8d;8fbFO}4yX$#UCfq>2l}B6CoRzAJtMf2X#F&xzM~FNU?`8Pc72Oulh?lpV%P8{B za-BDk%FW#0S#J!K;hoPX3iG`deum27DuTmIu25hO%cdwjbuSv!GjdS+KGH7W9)EqK zT0c~?uw}nT+ubz`Ad$oGPd?Qk?I$~pe*ioHAyCXC2oc^`G^5wfu)!5g4`FN22K0cJ1Oe4vq#KdX=3-y}$ivKEKFQlSit z062>o3`AQCGKlXyMUX{&GHi`WS!sYqypboX$cWdDi4n^hygO0%+zZ zfLW2{=!-MnfU)8pcY|!y{0^TD*p=7&8)AvO_;6k503`LSaNSKD02H7G!!;;`9UUEi z50w^?-Z)%FJr&g!cds+aU1mi?A!^qO%!hbz$=QCs)Egt6z!2+_@Al{_XdWS>+|0qF zy@*1+L-%tW6T(ZSt9pos#!K8`KeFz`YkVhAUHOo|-pu;P(j?&!kyO<}Q`N^>M@T(c zwV3Ac55RM!fgv6J`^hkNWZEdyJ&FHy_DIvEm?Myjx|;WYfBpa4FOvrTTTfV3Rn;x3 zaf;yxmkI$=KUyRYT*Ci(HPUe;P^dnuwO?XB=Lm0kBAE=0M2N~^xfgX$2G;YQ-qz9> z$xPdJajiqj{g>`%pPO<67@js2O%% z)SN4ZnMb%a-gxJk%h%+Q{mb(_RMY<48EO|xuKE0qY9tFDp2LEFIfq0Nhxvk@2VnPH zqaG)!VcwE(k@?UpAG6kOh`RZ?Rza*w7`KfVXrS|(1p z^JeBUj}>FA(`?FJXn7 zST(zE)lhryZ;l8exD+op69GG4x5nSp5X$gf1U4aRA{jlElCisNAvj*&!!CUC9VM1%?e^D7&X4$y<*eE@^td&d*JH~oO6@Yi>}`sQt?tu`pA-sK5BNxRRz=LBT7IlkaDo z)J=0lREn+jO9Z{ybhvH_Ku0luwVW7bFuYb1#P3iyDvYYaw`7S>rfn-e=F^5sSz43^ ztud4fmDmHASRa_l*_rdnZRr*DWDV;kyrWYMD+>eB50s2>`W)|K*+(s9D_72*#HKsm z+Ef6#+tQS?*n9}3xvn8C9Zw_83R9N(EvLf`y}`A6f@MAWr@D0uoLAdJ9aJJ6mkj{n zq<0T+bDAR9>G}58I>x~AGM39En2K*wNBIUDxNYRcdcl|&ZZ=5h(5D>%Rx2cbVydHZ zHZ5s^+*24RgAUi6lE%@hS2dqS-c+;qXndq=PoJ+o&y3rnddJ8~rOhkyGesx*S1wThqA-GqZt|cc^S7$0J;=3{JiPN|$ z@%@jJq@%0BfD49gIF-so%an*-iRGL^o27O$dz+CPYwD8GWUBIIWxkWroYj?vVS2V? z_w*i-LxZfl#jJLyJPHeYX+Ybl0PLRKg8T6ofGXX$dB9yNwAc6_DNkc&iIi@%8|%U&J} zf|yH8TZ-*`gVCv-N-WQ+J>+4&{F+HX5KjZds4}-kz=#yJGdwIFd+xyfeY6ASl(CAyNku z{XBCO1Dik#QvscmEP@LiNv%#<7t?Ax6P_;)&$+%`r-Yn~ zcIS0tGXy^E9K=)aKl8sU?wVy{+Ld2CYa*SqB84mT3aEL>Kh!0*`)!2~m1PQyZS!60g_4xCQ%=Rn*edZJx z%lq8?W9A}YYk964nO3;Zzq4y;a~av-Ug5fnoSR?-WBoRLkPV2SRusm)FQ$#u?+KwnYj?f0kB5r!)0J|2ew#8=B z%`mhHI4kKw^Di;#=xS;c^&FiaST~PQ&IK`tbvR6;p`qcH`T#&ju0N1%jDf$wLlVd^ zerJ1}7PiR z5k9mjkC$;P;E9o7fRKPSkXl_qk~d2jXY~c=4r27gJmZ@SL#3ENz}=3(&l{1~eS4sL z`dMlwrSNrddoop-Gp{e+s4lA9pWmCmChYBrbazZ}M)=ezx-tS{XjH4*Mr) zA@%|;>h3%SxUcueaq5lUu1^5uqh;oEWnp`QLNs&3-zzGndtR#*n;!vtqM+ z?`!H#6Cmq|)Ql^zds4>5S<+2hTkaIvB4$G_xYj2833?=q_M#VEZa0Oq))@e4PkU<=|ag}lkRlU$R2R$3cs(x$QK)Vk@pWckJ6&K9a%ZK z_gMmY)>92c_`X%|kpRB-r!VhncLCiXp;Y+2g!>p|3;#vu_DVUq@|~s67Zven$zlE? z&ryJm`0zJCLmMo)H$G(qU4kNdjG zSAV9$>pZEq7?tBqm(|FT^v!K#<*7YhGbX@6DTHuzPl_F#PZ{9js|J8Jh5$wU{>I4uwNs9%b?eMeX2e`5_0Y_}yb%Cge zcQ46dFUxH`ZRrQI8w)xzWdR5we8jtvBRR^9%Ax%{qxpB)gIdi{_=fl++i|?Mjs|)>C8E~4UjlrM#dJHKL?`hitF01 zQ+b)8+HQ`<+XaxhFMTJJ@kFBDP;BGWteG@+t4^>wB`GE%07j$Mb*ID;4FPqL!q^AN zsX{>vOz`jlDAauBh-CJc{(s5s?p`b0;+_gpsP;H^!kB*(f|jIU;4#mOH$=bKL~>fh zsGa!HK#xZAlUD~TYlTw@D&hK$1p!b_iWA3u`rV`s_5H;eDl&XPs<24rLnR4IlIX@b z7@9$VPpV;g|2K@PE!l_7=LH-oOHgQNQnrNao2Q9@nmGM+gM%Na^?=Lpf!&^v%8G#F z=xbq8;R?9j-)A2$_d<_qS4qWyX`U2J8>th{(klNO%(-*?I{*pK)EpYWhbTHkeYY~= z#5*LxOi+51pNH;N)r13yoOILpfKB?Nl7(L^IMbzKfKe)kC3e(LGDzUI24M&O z!%OQ){@+yZ|IbUgI)d?lB5{oBSIege zH{ZSm303})Cki?VHhFas!aE+ENQjT{_*_7y)&Tm5TnKy`uDw62{Iu%jsZWq_!1e$B z3&I6RCE5)R`rp)Sbq3-3G6yrpvi3Ms8A4pRP zVih=Jf&!m=^4(wBCsVW3yiNB9#AbNEV;Dx~$8kQ@Ou!9;v4P z!4%%H@f!<;jEP}wwu`=b%#%?1ESx}R+zS+cw__B6z}D3$$La7-B5z2>pemJGG%87y zmZI1P#|p_?8bH0~>BgVFG5Dr3#H!t-e|&+kB*y3Y9k&GcOdM#AV3!C~C^)^Gqr;V; zkR-ic=)Il-g{d(h(51Br_?CnmkeqEGacgJyV6$=&??|0me=+9RGrf`hh37SZASt2p z8UB(8smMZQcY6X(2#u9ywAIPJp|qE54U_C(*i|`)KRoNG;?x(Q;8LpV0hP%oAWDTK z8-yAla!Z!NO*1W>FC2SbxvR+qfM>N%2_4e+&X_flH%SFO1)&!Y33?9vLsspmF_cE?VQ*vsZuT9`Eut0Vj&$pS)U8t zxV>-`i-Rs9+0O;~G(}%xW#fCGjOZLra^2k+d&}DLbHp98pXoZoXgei;w22Nn1gd|D zR_M{s9DtfFgrT;|F}K~>6NP{+wMQZ>*(`7{7+XM9h)S`(52gL1j7;(lY2NuDYQ&9| z*TMF1$A^S3W!W&tNg^1EV!8Lbvjx7>@mW#ptVhvVU0HlXd{nQG3qrQZ3nZbk{nN|h zAB&_^-G={}QeFK4&LE6>bEd!z7~o1x8j?hF~o9!&Q85X1mA=#W|@;J-?L>iT;1?P^*@HzkklqfJ-f5H?RAZQL)4 zD#tw%Su97tS;EbdmI0ztGZjyM*lX1Zn}*usId!uFbm{~7A%sPt-u(Sbx4b7Dva(l# zp*v9uxTbrsPh=Qh{bzR7DVi+sQot^p(?Sd9_xGz3xJd}n17(HOVJboIS32s+y>#?i zX>FTFxoWP^6s(qfxm^boRm*Ez&4GAQoYDi+p36r;3Gj!gW)euRs$wNvTkj}MbAzMo z;5u!{^L*io8*oh=zik|l8VlM7(`>aRCR{)=bqSGvWpd9Iv5KAsBA>J?aX{K>B*e22fDOe)1>|b&CD*8ezli& z56>e(ss7FLc7``ALaCL}vBdys6$*lp&5G7gRYyz2g5DW-}z!U0E&i=X+dvljwG3WR-<+Tb##<=e}K}e`RcIL_j#MEq?fG#FO z0`{#T<--*k9id}5Ce+~>A*M)ux6!ch_Zop%- zL?MKcY^Y~ugDlS}as&c?%*(6rSAU6!UZfbbU#yWiJiQj^zIP)E^1YcYB&vcM%RX9n z0Uq=&V3fOdvz>|=hEO|w3QTv}ItvsfyLSguV`_jBule6IE5T`SpO1nq5vOBbXW0aL zy4AaeEm3w)bgeNin}*4S<)`cRh{|J{(-Qc6OWzci^=xbxhxy-Ys>7$?VDR!a&TZxx@PtH@4}l8|D%n?~2?w|`G^_L#Z0EWeLCe@LDuUDizK*^; zFHao)8_}Z>>ozntnndfm1PE@|%gFcMDtzVy{Gxn944IoRv5St#r~ZB`_Kk|8YB*LY zM7`7&g>r;Xq^<&J@)^ij$k?8}JN4T%;;vU|L=I1;ZD1bF^fG<@ILFf{kqWQH7 zQ@;DOMrPw*EkNm0D5%d2Zjl{5A<=C_3$g)zR~GPSEle#UDAq84)q)(KyfOiMN9DgX ze`<5x847a=&&H~~Qa(5BAZ{ImKWB^v0a&gbmG*?JpfGnY3#ygdaMr-V<~o&jdAS0h zR>rG`Hx;@FwW50#z%<~1ib0ng(f1%ipaLp&P;ntao-Gq3uZY(@b(BKV>Hr9TT9ekg zw;GGZeM8DDJpsq}c_K+B-{D0)5N+j!14>V$u2eL+O!z$-Fow9=iG0(e#h_(`OT^xx zr$;187UY1u@4^ghy8z@gT!pFdWUyd_a{6zXXC{acK0)o(=n8!k6o6g)V=Ljv$U7>8 zDMu&aqGZWoDFu3ffN-HT08-v0|CwK^c^w@)*ht=!!)H5^CnEgFohyXE4d#RLatV0i zFUz47YYEw4!YT|$uW{)r&`eVBnUUp=sYUAI^vao%6SIs_I?lI`t|$HqQS3Qw{0XP7 z+mQN|icV|aRIy5g;tRDjyNvyJ5yG!6QHtWt5xkOp01iv_-q<|$T#Z--d18eieba%%i&LMZ zqx*xrmM=u62k$f!L{|N>he-D>mU3_t)>E)&+?y1Lt;07f zFr~{?mi;I&;LfN*6q2P9T&sIq8t;Ugla0eDsi9Z2{ni88)gvXS$IEMc!u4;64O3sT zQu3OTy74UiY+Fpz1Uc8#x>K~qE6TFIB(u?181e&hid8;q|F6^(#iIU&w<)asHJ+99 zET7Jl`q#m2%duDq64q$-w)7qYH#S-IR+2gi@{Fqk!R1+o;{9py*)4j+bs0JISXcF(1GY^DJI^$*k~BiBpoXqqHtSgnczs`3eTN=4E!$Yq@iRl{!7-1p8J-yn@-o+ zxF!zT!3V9%{P!<@llk9%k&A0$0a)a{_#>AK7c_krPKR>2!KGVme<5nQ{O?r>X{s(y zjeEV>%R_$ef>pP9A59)f#z)FZ>UV-z0dX(XU8$)n>s#zSQ{F0zhbj1q7jk6%_K;QIlx$bnC9+TbRn9orO0d-^s&vHSSL8wqL&Y= zUe)=Y(r!8@h8E|qEen0w-u-FixDb8kL;h3V;A7t|?cyKApKy+CmiW*gEYUb1GjiL} zMqA_u-1FN75M$!1u#CSgrVz5M9pTA!Qoa;*&Px3{AD3_w66J($DpZA+#$Ha8(c`7j zYi4lFD(9J=t-gQln{=+}c`Ub+MoScb)*|++Rq5dR+V0BCK%m46KIK&sa9Tn?!5xaS zZJljVk%y0Inhaf)-klfWs;GyA?Bj1)xfJqcwHy~-aI_~oar*|g>S<9hyiN=?$|$g$ zwKX@d->`znQyas3$x^taXqA~PCd@>5^LKu0zbCk{JkEwE^OE%id&{|&t;`#|vrW4E zC;w_*z9|_u5MdOh=(tw<1_B>1q}fCaoQ8#M5QXlcxR`1vn3^{de3lV8wMMSQd^@<2 z=;Ok^*l$#GgB0&%oj-4aeZr*=+%|mJFF=r8U>olhqQw&sjmr5FbGD^d78NQz30xmO$+{O0 zD=s7(R(S62S3Jk%YLR``YiU1fJhk+`hd&|5z}wE^4uLoNfTUEtWV2a#K_FVa8DXGEhsFni?3rbB_^34PWS};)bS<|sR74T#ac{NH8u$^U7C!Izx`l@>g2tXhI^@`>VoH4h@u|DAY2>k-=o)xKRtTt8yJXq*KgFGh8H??T)&5( zUY~0W6uebTm8DT2o~o2V(l+f52lZGl@;{&3Eik5OXxDGdu<$t3%N4jbD!Fm8)qNSsv4PjD z2A%IUMUa;6yAObF`C>U%{o#ffKHUkFhvhT*@WHt2T)I~K4~;Bqe>>&Ge?4i~t}}ZJ zUhm|~C0v~k#K>2)3K@QB1-!>&D1>ST-hNBX3>w{4=hf$?BTOL5c~yZ_j*GDe(%l@$ zP16jSw91~1IMY`PUkmA^0I{UdYoG>cb~hJ8JCbH-&!DcF_B-8TPX-U6At-kx%8E>d z*?x@_eCfjAwha5>&>{#<#kLWu8D?_rgiXrxws4VbY*IgMX#1 zm6%TPQ3Qt>9msRS6jK%N3|0ESd1JF%VtsOrd=qm*RV#U58+f2bD6Ov9KuQt>v*pA= zyRx3_a+y*LNpkNwtv%~2wn=hhQqI(9FR?RmoJ~pk0-1?h@EDZGRzS?&07B(SsEdAp zqIimCX(7^3(f(QFd}WbfkQukjRyG{4CRqW)fnkhy>2Trrk2iDc&*!?OQWaCGeU77a z-VIfS8{VQRURXS+;jT8>1_0i$ov zO%a6t9ZGQFYBlTY%StB=ujf=Lr>n5ITI(L{ZSO2^XuG|qksy)SKaIz_S1NN$CIr+& z>LV7t*`I>w(ESHH;)bcW)JN3e6+TK+_N{B-&yC_z@}n*UL6uO|hg*K2+_?zfFIgQr z0wy7ifBk#@&q!q@h$Cs6SAk8*tMI4fRRT3uy70}EXfCS?B!G&a z4)klkih#f9FudGpP0nt76Nn-^{-nfI`D0{u&d~oOH4*|UF>w%qPX-DeEIAy622DJ+ za|ZeZkAU$Qs#^Pd02iV3y0B&K2Y(0(54LAyz=DKMLZ1*>r_-Cs)7r6hRL{K(iR{+1 zvzFdQ4A;*9O}<OZ8rjc+VxDGdxka+ zzabzSkMBZ{kq>cP9v3NZg0>}zRT9Polg%?X;p4iQ1@)gXR)x~X`=L^M&Hf@|>dqAU zqTzlG=EebmtKf0E&nayl|Yp2cJ4m@(8M>dZ6}ehr>#O7JHgQD;5XW z7KR3hqX0a<0p$kohubn#`0=S0@V}NT;=MP`e zBKK1rpI~6z`0=KSleep@m6L>-sno5M2tSpIE z0zmgMwt{|=D1q6X0;M5UYg%?=S+UK!)G5X3W~`_m3H`Kkc-P}-11XF5kX?p%pH+Sl zo~g;Bud+ZOxCL%7mKn+d5(+5d-(h@HtSRcHi3gETP!q>UZ`S8d(YHsr$Wu9P-KUI# z02R7Scq^PdN{%jsd2T&{lu4s)N^_~%#g&48R`;=5vG@vxd33YFXy~(QgljxiYYe-> zNNvDnnvTjCMo7UMEn!t#-Y*RCG@fJLeR5D%yu+dM-7=iL&W0NCq9*$x*0`TUqvbl! z(m-5@#{bEca>3sz6QmbA1yI0v2NkY?xo5Y=B&94SaU&JeRph3dBa?)aN}dL<h1%~Xfz!_UpjwBnE0A>6MiYp}w zk~7ZBPkV-SGk0sKjGw4d@&O)fYoM;Fx=hdc*O4U&A{ax?V+r?y&K#o}xeLLDi|o#N zsqLw+I5KZ3c|{L)SLn4k!Egnv`CUd|P-(roDs7CD%*$in)~M)>>ni57=_nca@U!UK znGTFxU#Vf>pTT0`{z4r~LDVSS~+WpR*Dp{y_qiu`a zOjNZ*&v($VZa&kxl3y=bteASPLw#eRTybH;tp8^}9z|Brz`T@Pg^T0%$Y{}IN`=ht zy1AZ=k63(%$6D?+Hcp`9cu>{J_uIg3yg) z5bv{xp$$tDn-%M}V-z_0_M;P=MHbr?AD-M3K*sVQP@3>@)C=MSXoAhm_AM0;rknXS zt@upIOJ?xI?S&gTdPD(ojV-@7>3)u{0WAxgc)`4Moz=?qw*>M*dL&WcgDxqlZZIxabU#pWRo7I%#TLR>iO^LsN5f%xzc$qf`n1M zVePVZsa94Z=ZL(8Yqgw&Eogep=;D zb15lM*K(Bbv5D%mm2KtQ|5A}9EswXg*jQ^vr?(WNQs5Mwu9c^yMZT2VnKmM15!qi` zVmDVW24cK2C4W((*Vje-W`7wgT8b7!=Yal7l7gK|-D9cC3CHiv%)g=^_a%QeM6oN~#Y_QQ0pK05H-fptfmI|JH z6Oq|41f@L9P2qD93|71WKa(q(2T7)&>&AA-VyL75|6$6--zb!AQrOVuc;k=rq?$#Z z>B}KQ5B+iel%0}4xQpM?yF+!IYr=K=q+#_`2J{wq(ANB96?&J!DHderR^hTex!}C; zzWyWADP8vFc znA3CM7n#FQq22%NvbI(=Z~#+>1%QeW!o$DTfQH^*fmb?p zryI~t)DcgTdU4|5VAq23bGV>;#ajwa>6OX)nlmR+LYBAQa^AZpQC2s>YObJ381??$ zD^~72&C65V*RI_^;C8ycwGx>vY^~oqzPzW=k?#_MB$2#lTdx*|_d0eg1c#dk zj<@fbMa{`YX*UL}(!RRUY-43*bdB&g#kxK{l@k2X3OdcH-hW;_ znXOMPIqvb=Tv4y(4~|;uI}xX<3!5m>>`w%|DfggcrUs56@zpi^?jjpw;nE@zFJ!91 z4FtUCt^NK5?QoX-IL**~{KdE{btfqz< zW!6LN#eA7>aklxV3v)YfD|ArUjrOv99O1QHLwS6n(~7~7g)GLfBaInFpB|^$qkT;pr|jPUhA_A zZ(d5FsDI5`ttj;i%Ymqh+n-Ec{(kE`kA;Bar{ILhPNOA0;lczs^mS#=rnLd2gX76oVCnWEZWrmYzkn-yOM z9ke4~QX*H$!A^C^8AB-c-U<}hdlK<6${1?^h33(e2=LN1&t13L6HGWSvsec)?#2dC zp_XJo4W$p2k(~pWo6npe5xTL%vl%A}BAnw|tq>T^hFZYw&fU3%-I^c>XVLW@gbL!Z zeOIVrOu@X0l0E)1zM;xZ;`9`BS_pn3EzB8t2TAQ0M}PADA5CVDTcO&QA(mSo$(iL= zX4G*@;411uTJ=q?kK6)GpXa7bQ{U_3X566IQM;nFuy=NW`RoAD8HQrqzw=>>cvO)& zp3d>PXn607_mc8`(j-8T4R9WBsr_K{w^OLsw624KdId#4y z)H(i>h2PV~O8OCZY;+x>r3@jBac}uRbpn&touz);Oub;~Y)iiJkm$7gZuFk>UQk8& zvH`DMgH3S{DbpVt>b=RSa$z7ksvDtz{iP3kdCxQ}HK)mMC)<{}hpXI+NYHcCBj3tp4@xPwR#Fc@#?L?2VSN-1i1&44)b9DszUMRu9X( zqcL0o7WDcUWd7=BTejA(TPScA%Zz|Bn7XoCuGHSFXWwqFyCL=r{=+dLI%8 z?~^=cOdEN_{Ck&EIfE`kUAtI(uZF<8zS?UfqF;CPAoUpY`bSp7makNTSRFx#$}{qn zZm-xB=r3;@sF(dd6Ij=k+O@P(qULM9`^2?DU~APQA@=dk6V%naP}TYfS|{NVEQrM> zLBJPG?Y<``lagd^{5>2xi9`aeKPS()`jIln7;rCqdIyGGk~kR&+AjPcHaJzzP!*IY z(2ZDuggIOWsx0Eb8o^>o<)-ZIxB=M_Sp=mg1*3oX* z{pb5zkRpBn&A{BqE_wJo6vaY7QvY})md`Pl=_3wBiZ#q{QBPIQTDa)FyfH*ITS#ln zFYJwLHE$x~6}9kn0>8%u3T5@+!hbuzIJQ3idb&9<&f^i=Ny96*I^QJNea9lT&@fLR zcX;7z?|;6h-yjaE3Vo2`?JRra&1o{%+*pg`kMPyu-7;d$7Ojygvl;q2wfX`3|v-*)EBZD1~#W z@8!MmD5l97Y523sR{Wr7t1ZLL?Yd)IJe!)vgk5Bxj?JQThD5&%`iOaGJ1bnBH50FJ zTmPPaPLPzC_<#Xs7l?C*7{{HUhaS65&gY;vDVL1okP;7~eLrShv9}^YNz3D~6gO;O zXCtq0D`n#A%2eZAow45i_#zS2Qu~aGge0)o6%dWAj-gOHTBc?``o671XS*};0_4~K z4`Xi~S5>=&4R2czK}A%MloAPrEsC@vAR*l;(jbx>5GhGTQo01CyFpq?q#L9`L|`K+ zo!>0bbDneF^S-~&Kc43gSgf_~HTT>z*IaW=+C^psrs1bMJHPc9G%H*_WQ@-){|FE` zMNmSXmg3qi@?oV=AXwE0FHXoydc;9L*=jyQX8sy+@V0&*&J9y?r}Uzoz3t}?kemsN zb$kpBVR!7*G3-xIsc@QZzdzF-SK1tQZ*Y0H(rKR;#0suu)}JESBkJVTyt@5i6yHF}rpP2%?N>n2^<7X94N&U5nN;#0ozeux z2Q_d&1K?2Ils{QukAXLeR<5uwZbLni8ijd>bYxuCLCBy;P zE)58IsPOUa=8LS?H;416Iw_`|dk#)BUN1wXGgq)FHl!E|&@XOIe$(39d9mC!UbA(t zK)ffkGroZtCat}{ED_E7a%AdDisKss8DFZYmT2ly>)oF!dVq&b_Wo>1c)3o#m1DR- zT~y(!>9i~FxUp9nq}`yK`{K9cvTCC?5tBmPF}nC5D%PCB?$qGx1U$>H)oj$C$jYVa z`ffb=MDDOLG#PNLhwUo65mSrInsCuP!J|Zu{iB+xt=+kR2T+&V%yqWWa?Jkf{n^Q` zt2_^oKT>=`IP9O}zi1>?{l2EJT2_{1;c-=GbaIC1B4*NNs#X1{N_}lZV1ji< z#1>66q;Lr$fkJG0%^Zf`k^}b2vGz*2wmFdL$mz92rEt-<+Rn(~=*B>SU4_n@V#;o3 zv%Aeo|Dn)q*e%1{?#JnqH*C7T_~>?r<#c9$P%RE+3YlyQY51kAIm>WXB4%lX__pJa zQutPX(w3v&djiqzLC#OTNg?Y$WZS-$F5q>vF>mNqcyE|};vU#$m0fp&6k2ycQL}{H zW}#DAa?tA62J7bX@3zUgqEktmkxqW30mhb7YsO@*qonb!Hy6%s^LtvzC3T@C*MkWe zR#TGG2KY#qq&;LG`b6GR#`a_+>^}gL5nEq}5critjGc1Q zKr8eJA20AJmaUMKHxL|t(BBFHSre2IR+!n@9o_}v(rymuS3MJh1{Y%Glc*;z_r*9h z;}y5q0Q(wz|MoJOR?jy%Y82l{l1)U1t^B8r!4qdzn5ATS!l9S&6JuK!L%Y5RzH$ZyP`$wmUYW3#7**U1Y%32i#pUGs`;FaORB3 zV9`SQEvFjD$V~g2|QqO(pXB|gF%N$zmzWlN*k^hxTCPTu-)otLL zHO-fAvkl#Cone;~mMMnxd55=8Ua=u8hcI4a_at#hu}+H2@@jgqMO!o(=3Wo4!SHv5 z{dEL|;pe9`rTsoH%1e(fEe)+!6o0+Df0HS zZlw#xeI2vV07LWQ)6}ut+2!juPvQRxy?d&hYN70IbC!IHiQL_uQMR3$^IO$)1?hXc z8va>Hl3iKSm#<+K29!NDI`f{*TqvH(^v&eFy0a!VvuZ%0u0NX4tvp)4JE*{hm;g*0rP- z)gSvp_Sa!{aRPo2hbw`RsB`T=LBhi~@9a38w^p%NDA0vnR#!ughEC(+p)2n-io} zB8Dv9(qt&n5?IaNh*2kZ=u<3D-gB8BF8Q<-4fPx<2lAKIJ&I7t65BM|>XXUaYS}7= zBfU{SMj~K)enAJjt=oge$b5KOce^y_`LNw`$8=8TuaGa9Q+jO?lQy}P@3uN0g9LNwZ8sRvIa zU0I%Qy{XWo#OdeAHfQ+qy=zF|l#G zpGKtWd#9Yrip>Iova(R$7*6AcsgbttfPv(K*w_QV)VrY8WTh#ar}sGgo+VxI3Dm8e zD(!}tcYjEmWM1OAtXXNO*;rcE zCfR%G55W%GnM`>Co`VU%r6bRh9`|9LppU0`FCxzqNGGwVq(^^K)*Whp(whG9EO%sp zUO0!_#(`&BX*h+p)jK+%z}*0>B^?k2%LS2G5m8YKpTxLCIHNkClUo94xEeQbQRfuWPq#|( zT?24y%~mZ%X3{^D&vahRuiob6y;i9vNgF%Ln~aKGY{iVSYjiP_O5qlG7cJD?+biGM zZSO?)4$geJYPzDfH_26C+_!2Q9Z}H`xggW093E*O;?&bf6!2Sl&FM0@8<*2idceUkO&0O%SZ=DHe zTV5aae0HYw%AT^BYKIexr%{yk{I~H{(@$jcHD;konETHi-#)*8vn&Eap<$5Pxo7C=$kjDN1$~@cdgjr}tAAGo zP1cCapb&Z42il-l07H_5lxzC3@F6c{rlA`5Nybc447KxXC-b&q3FU5ogQ24NA zWgeZ@gh)J`du!1(*K$h2Z?wL?9>9F%qwiB0!p<(~4=l2%mo~f(h-=mvt1J!~l6ZOVF;<6!I9z1cuXWfW**%#7D>aU6TO=4fPZ4mAQ_?oQ8v`?)9h9 z87f5q_1nA*kbQMg*Zyb@saqtdOOZ|DCfC&bl-ind9q2BFf&d zflFuVL&&R$M`tNHCJ=JZwdIKe1tV*%TH?2}^%>GCA0OiQX_DQup!rc3nk7Zm!X_~6 z0SA-%y1W7HYPXa}x4iQ%<1r2F)cL3vdv%V>b&6dHj=Luf6BXDxzYFr&a%U=Jc=Yx4 zh+3uPt%hQ~4_r_L^g zb;QN*i|w;#X1Yvkil|gHPb`TY(j}(Q1y;~k@N#gTcSA`YJfv0tPX~c} zFwaZJw#D-N$*CA-hphS0%C?E6Dpx1>{GGm&iDxI0JG7x7JZq=+QAfnEtFXLJcO(`2 z>n9^-ZKU))hOXkzLi$6~qVp?eu-?5Q44o}`z$*>)uR2VSgcCx9fXu7t z)BA0MANvhJDO_^Won5TGP1_ zB4jb$UgZq3v$YKtJ@Se(+c0c8DDg2#6YNE`RVygtlkL4&4Gv8ZD!3t2Zlo)_E&%5| z&p`&V$7AvEl-vmMa-m$N5^u}s&aAFV`br4jM$3JRZ4;B#WuWUM3p`?uycCEV ztR_!t-bOR8WOG6~vCJln^^Js9mD?uQ#ALAILs)TU#S@qd#zRa6sfswC2wmrq?OS^- z(c~x|HXe+))VDe@6Rbw#)W28ZrkX1{`efVNX-?6v7Z!fA>$kp_%-aD`0kP7;3|&Az zEyk-)6i=+>ccFCK-m6Q*@XpyN3psL&l60prLRy*_+MgpZ&>;;PAJ;%6(~_qZa4wG~ zCi&F-<_I3i`LYRXpa+-Q_~je)%H0$;*HnnL&}sVqo1H$8Cv?BE%Cw=AR!og5Ha>n* z=9848UmsK=qyT~uU3|35t68y=`*MM|ZFg)@8`8t*nysIjTV=B(5)sQxQ2X9>OGd-Y&@+E z{~Q`~SCdycB>w@O#Fd*+l@A6rB8hi_fwa)YFOwrfo1&Z-vNGK-`#e*vVPP^&mo7tz zLBOMoSyM7*9=9VoKpPnA?{kM5JB!5>Q|NV*`$P?mpKs0RZ&vPaOI2)P z#ri`!e_~GZcjp?@_J&-b6~&&%V0*Gmjd(`P1kNiLSV!a8?Xrglv)1qF*hf96P*$gExHK{qz+Tv33u`C@;zV>CIHko(&k@|o8l7Y#W@;rI~u64Q@9 z$4q5L>0XloCW_tB)8V`=d98A%=~)w6y+W^laOJ?v_7J4yBb7{8<1`LW*BbeUS*mtr zRKRVecK@wOe@18(oe(T+_GQ2KR#o_z9p35Ihr(uw4lz|0W9{b|f^HVs?^gZJ)!nt* zwFk_FrcXZf=&gMQjpo@=a$b8S=q+VHs6_K&mNI0vpmGojtSXWB+%ND(d%I^d6tmuU zXQ+nWMA&|m4-hR!C<0_I0255p(?Blr8UV}-x}Vky?7327W~#!U4A_xrM9-D*A(3HE z*7o(gT_^KdlQN8I+(ms+jvtOv^{EBdtbS789@N23X`U>54{f-!v3>z(t;J>=Jb06> zW|_RV?(E8O}8=! zw4NR+lAfPZ)OWwRjER3^(ex2bO+2R%7i*`wSt;!M)i?{^ipLkYFE8iI+jiz&zZ&zd zakIK8moKlLgyq#QykQ$TxXG7`R}&%b|p)t#J-YlN!kjxkG%%ySU@3UjqY~wz93p)jgqYi*RhAwx#N=oD~L215ial(Ff>RBZp z{R8yiy_~1xA8ehydM5}eV@Y4{F}Q7XQJg4Su_&6s1laMn0l3&$EcQ=DC)&#@T;HmQ$W8A8?JnCfc$0S15@8w0ivOO)tUq1 zvF864tjgsdeKyQTbt215ET@UIdt^1CM6$mA-J%r-j>Kw2R?7WnS@@;&drwAoT&*5Mg zW#V6}IbrBFXH5wotc6~EB6Pb30>_DxQK%?3VLKhl_1MMdqHv8i{TOwB_Mvs4!#$U6 za(8i|Quqg)!&@N!Q&5~BB+8{wpu12uJ0G;B%W65eqUGO6$)UZ#axE0W-Q%FWedpOf z%&@;_nw~>j)coi>|9cW4H`Qq(@0zqnd(VSu&;onS0*H#I%I%3hNf+&Iug|v5k#Vt{ z4bR{#>$!d#8=?Xc@QT!+(d#u(BKO$eg&Uw~fL35JKXi}BC}G0lnBl@mxy*+rbPVRh zm|Ux(S3Y#dT+!0B-Y#ftC<1&X#k^>(aCAkH{0iv-wy)INr)@8h#)L)S|Bea&(~dHQ z_^OCyy$Jn{Eo;Sw_iLLH&(3ncSFDL0g(h;l5}LSVR4Y`iGLuZVc7C^EZ0UGX1=NO- zC;CirnbiDCK`RnU-YVeYAk18SDr}C^dPU*lEEXx@E*=BO_kZ3j+euR0KcST6tL1uc zAjVjsBy&Wr>JpKeVRv%CdpnV{FUW4Nr?!BD(1D2!#3%K;O91p*`FbEDF(%>u3n+tW z!ZGHdv>G(6ufrq7aa+rVQ>@2K8qVQr*`nFJT+#T)X6t+%k3o|H5iK{bF+7d)RfN(? zsLv80k{9BkUVN>vL)e(;Qf0ukU1po<811d8;xqUu0ZPKTdS0QU>%T&dInDP`kr0_d z^5aWGODlrlB^M>CWMtWaCPaXEjXuj8G_s(%2ZaYOq(X4#`B3t)J6P+j6~l)2Jf%?a z;%^LMs2N1`Jzr}RCbu^AcNA4Te1x@{voTQ7)g zL5DvAFd->V1FuWW*mbt`U;S|cXlRj7s{aiN9f93hnwl0<72UR*9auib0Cu#{M9)EJBwam`hd}0bFj`i!BI z!*(NC?UOBQ%kO)ZKY|9{V16XRn7mN3K^^FEgx7FJItnL2HNy|T<40Qz->xnNcd`Jw zwGz`fZ7T1d2;#poX$s8BWwtrL1`5RZoW?#M*#x;H=%+F5riuX0TlR0bz4P@#(@|dK za=U_OqZPyK1?d+qU#5q`eeZ{Gz{Ib9^M~TPbh%Q`2pqx>H~+cZGnA0eb|k1DbNJoU znD_C%p7kkT!$B=`Vc#|k$FqUERBKn1R7~+BN9*tR1|(o~rEiLF^SVxc{;(okSpq6v zlTc)pK-+oa)&l>9rDdAcizMNT!^)K;exVHM@h}j*5<@DpWFMu+i3QyayIThB4x+_7 zMDLIz(#imd1;{I#fL;USauKM_vLL4r!`WNVLvUBz)mPZNpg&xy+u1Tdmj_q# z8vrB@dB2e}H2q`-NSM*xaYesM7doKfJ`cqK;>Bp9S6Zz&jC{5%=7FtX^W(F)Q^d3MA8#lue;_L<85@1M?D)4J^osm5?Fa zr+c75Sig`7;v!^W(pBMZZpXVwo*dU_gVSMP^ud1{F)tYLGinY(IpZ+sbK%TQ>i|0s z`ud#8gZG=O&OWr(QlxNX4C&ZdORsq#PW(a}5RJ?8!RtgKTZ z1QF|#&@3>SA$D*?Sp$lEx+O4zAtY|Xxb(;6ldwYV+bm=K_c z?aRtCRgjqlp(>V9WXv1CTT=kFC&EYg=pnswSp5&4gB1Qq2*ivgq;x$<)->h^OwFhG zRpHK8W567ZV+o_E4ocG~)`see%XwD~kLxof(?d&9r9GcbAZC#N;0w^fmizX=jBe}; zJ%s!u)5rBsA9lcr<0e&Hc0q^S)`)|B3VmB~&ZiF%#G~-|fUF#SZjV^}D+x20OZV;K zfkH&Oj+UzDn7IEW0Z3SUV&;q5`cR#0>V5!`JQdVSMdi3bB;^C`V^!?!IIXq4YC|2L znBnPBV_9#|p9vVa=GPf-ukn&!xmUZrD@^N#WYsAjqQQ0m|#-6DYl{ntr~f8bi) zEbrJ?1%;8o*!jA!8Qp~Sll{yl-#Zav`_FbctK|>P=(<0KY4WWk!L^_1U>)*E?EjB-fW8v=_mQ+J+JmeS>uT1~{y#|l*G0RhEyre{l zJiIT5#{=wT)WHIMJxTn3EYQL7p_)xy&;RXEf~GnTA`kKd>I~?MJdtw+=d=Ld_~4@m zU2cc~FctaEfYwz#<>1hs{QIzYjDK!+1|IkI|LbOTwq{?nI{sdF_>xFx4}bDmUKe!X zGny*mGgz-NZ^IKG528cVQ3DEhbF(kKe?8N)7qguQyuwFFqL{!6j%(fSk8?Wse&+57 zI~!TfGr!^EW&XYJ0khW$3OJzPXQw5hfAh&zZRGR8p47>79TT^`hyj<2+S5c7k#C}ajh zMeTJ0n$uCPo^m2*FB3L?R+2?J-L3zt`wIPbx!r@ zCd-p}HeXK;cs4>7lSg^mDoh#l!b-cxPDeT%4ii01I!;^*h}B7xGmvief{&WM7Osix zY=ODqQbj1@#MQ6?KoJU+5_iF3pytNaAo>raPT#um&(v3hnkiRMdlyolbV1`2V(U8L zdm=V?+#T8mNveol3*E=Oosd(>Dxf**CfJZ+UuJZ=dZ_}W``>?ysyz$=9fy*602@6Y z7vE4wzaGxU8pnX5+|WKR6mq1VVyz$mPqU(Kmj$@xQ;(r!@EIC%km$wjPYEH`L`p4|e~9cxZ5wxP zbD17xmIZzq4IN!0On9Sxx%MmfX&r8gT#8J|Dk}yn2O4-UC9&R>ekNe3YNTW8iGJduO6 z!~z=mpSGQKo!mSTszRBI-kd4lXCF3aYt^hsVy@MwLuig@#u;kt!$Qmsf}kKmbd)Kx zUBU~^lDG&|RmjxuU05zWAxlT(2vm=o39xD%iP|+OvBfbt0%X+ zAq>Qeh!rF|#G{=NBFL%u|Oh=nb=GuS?1SR8J(6HRrBf@>Jiw z2?zW@z;XQtb6ntvHg_2imrDl04jQ&?{(m?)!A&`s5QupP`a){Z50)f(BbgBz8`m7K z+_ITh^}1e>*kEg0L9;wT@@b0h zHs^;4pAx$b&|~XRB;=~OXVgtb^c65o)0GBh_M?6!BwW-*qmHGH8Jq#upl*lVO$v#V zU`Zw9G2-gsyz}gvf8xB)kWGisiMsc;-*MFGQ+d0Iwr)rzWOAQEDM_Aq8dXJ1WI@KJ z^BTZqMLq@UkmLYCIZCAyl-=uCAe0&`vKl?9zxDx{62iy<{mqww8ECWehzYy>$X%nm zn+MA^6bhn4okUU6)U!UsXdyqHk4HZnxe;Na#^3hWpop zx8)BHrCyznxF~IvXW(m6?;^qs0h4ebeX+pO)IqOt+5!dCC3rz@-%4|qJ0-UIj)alz z%c?wY@W&*2TN{( zwqxfn)wp%_+tT#3J#W%LKX`g~yBXa!&A8t4^1<9on79LT6Ylb0y*~==Ny!c&CCVjoV9p*Jb<;!=}i2A=muY+Wu`aHx?&X=IF_qRy;0uJRI9}?v{ z5uZ=reM*d!&tkG9D!4&jGIJ`LUN?x>Vat}RK**=@9rWiqjJ{Z=;(;E3cK|xLP;GCi=^CH@t^+PiC+f2bh&Xo3E?$=eMrhy6#U9Jn1)kLb5I%N$yxC*G zJ~J$1$#)5+G1PaeCvMHRzJB?20u)(S?b6LaWmwrlyl&}SJq7I4>wmx*ZLvzx+LQW^ ze!!Ncd@(_v`0VfdicBcW(FSy@pNI5^`Z=f$}p+pnZ z4Pry%9<=RshZEJy!7f-k+y#FyvVXgACbYbB*d?keV&M%%_kvjvKzKx^tO21U6GZDE7e8Dk#egAz5;Rz8fIE3$R6cLNjYJE&uZF#X7H&_ID9)0Ll=*++JdtW zX~jX#QJ(mU^Y>!_4w*gY%V{1b@dfDJ4_jmSOqJA=QT`Yon>^S z06E#)HRCZnFYm;zs+HMxteCKth#Tp=2hmB{ijD7Q$f6iD%03}_6lt`6) zDfs5?B-DvABo;R;-3uzamxr7@epehreZIO*DTrM_n~uIn*{6F)Lr=e5knxI%9<6g7Yvq}PtPWyYHMljeky!uraX1Ac|3pv+qC5xTCo5@`G}KEIg%zb`Nq>!$ zt4jLCdiW|T?l}TsaEnF=D-GTDY(GI*kkcLwQlZ)3F2yy)V;`K*k2-J+L=OOabk+C? z`}+sz3tRFyLM)L0`e-tlYWH?ISXf%Kw>U7^puO;$nibijHUK@&#eR)aMoyfCw8aN@ zA1CIt1|#h z`;vcDP}NBs`U2I~d#2HiAV#}lz=#|eGMA&sQw0Fp-b1ID4UiUc2(^~#m4fJUm+iH zy`kYr-8_;AFUcr%+qxo|{}HeiR~^{hDo8LtT?u&G{bC%}l(U>1R?}ChwGZn3h*@-X&ed*~Cus}I|&>doI>&`bMA-xZztyf=G7YPg9N3TH}(EX8q%DP;*W<6 z=^F?;RsI7b*eSuS9}~Y~wF1pPJs2m5w72x_;##i*3Tb%)Av#ebN(sOzxJ{i4L?30z zBl6%+{TurL{_op`agtTD4QT4dc#SLxrC}H|fZ+RJ1D`-zS9;V5>TavX$0i-w%Q%aZ zB+jJ-J_w|H{O*Q)s%@DPZGgQ~F7K!EeP=|Lx)qc>neA522|851hXJi>^%Rl2;PJL{BG@dDfDxo2qRtatD272xE4$D# zFv}_ZimIR`Proe$a;KNa1)&*9XVaX#USOs2Tdy4O(+VA!wTPqMvvvis72T)0l*kd>?)OK#^%y z)>sR`qP!xo%EUE|>mZRn9e6ECGA0D1s+(Y*D&|EfCmv%L_@V?5vff&Sp&AJgztXoD z0}ttDg31ihkF>v{0??rgwQDogzc)@KIQOrW`U@ zJW0LdvUC`iA29g3JqxMSVZy#ff>6jzpaQ~FfGvuxl%`*n(QJu&k4to8I#94RFE&Q1CK5PF6q*dh#wd<^t0_)) zukXv2UD^M1KKxWrXjZ;oK~1C5@N*PDLL_)={DYYN-3ZJTNDey9%W~RtfUC^K` zc0-EkF!1??wq1PEx4V*f`{*yD*@vqa?;keJizf@RRytlWM~aKAUWSnj* zY7E*6uhQ{b+xuM&Cd)2tb=G&BUmZM+;^%;#XHTRiN^WTr*&IcXpyA?Pv< zhD|!#M@vVCU`xr_r@6_!dM5~K{4U9YDkJg!K!fk=kr^tckTGv9cPa!5b2fmY=B?86 zh>n@Zy((fCv>wsx^ZL&1v@|r?87S1ZAF!wVK?Sx6*@+I1flZ(bsGFRE8#%Sx+>&Qa z2;XWN&m(Z-*0~ADS^-kJ31UPCujC6jupTu)i~m}Yb5+EjuRy>3Ge#8Zj&jaZckyUW zd6?YB4E`Z=A(i{Z@^pX!cqV!{pKlToRn?#Fu-*aG@1q^AYXBuq>$lRkfAB{b!UlDd z!9P?`B+J3^BZCcyiodRy83ogz{Jr=e0a?2X8r;fV^Cl4wg35dx4GeyEN z8n;@5t5L5pfCi)*KqaO3tuCUfly#yj6e)+K0VRUT;0VaHm1!Zh8E@qie*o=Xh|Q(p z=*B5QDikj0H8})=96JT|978>u5v86rs1kk$6-Fp`{Olt-sP>>oHD z!ig>fnnrO!V9*SIQ6Tz|`in%!_nD)BkPZKGKnq3?BWOkkGHB_J5SW%fIph!{wJ#Aw z$1v{}PODPE1CSaq0aO;b=Kp>th^v~x&;+90r2$y4!i92KKH$H|MU>YNLB7UAMX3Xu zKR8`p(?UQj3pv&w*}$ezz`R?&a||<=BNl?~3mat_s`jEgQ~+D4Z$T3p23Zf+F^HiJro82v^9o;0#ZytJv=TjCq^$Db^ zlvksm+GiScxY<7(+O_j42)#*3j$e$zDT0RhBn-srm4}w$Y=#IdeykEPqgxdEvsM2- z8%WCpS zKd<3WU86j3Kp}&*QCmrm&n3sVSb8fuia; zXhd!oIM-YV@%!6hr0vsr@f=cX!88@YtQb5&C@pC{DOVa{xdasogt~w;G3HIXFZ63b z1pdZrJ8ux6j$%!her{L}dl{*9!sc%}C~Kp%+`$az4$P3Cin#Lfv)L&UWsD~^<>PJwp9l*~-12ypH7NkV$E;vY8nX(g6le`RGj%1RR zA_^x?A{zBpTOE87;t`#{LH%*s8bt99UUKvdqO%B|pC8ikH*ga8SR5Qz*DwC@7e^5* zr~gxX1P?RF+vj};NhMubO$eXD)52X20!!&+1H9Ju=wm1adxGWBOVGEsZGj(Seg0p> zndU6S9sZ($YintM$q!kaw$hhA3lk?dsVoyOIwgYvfF>fAsoSd=4ZDoR}K!Awo ze>@@o_3z)m4^?=OI_^5cpivm*aU9`q>NEz4klZ$)giike2!q08z95_m(6^g}nfIYE z>0@R}G=zx(V$&cHF%$**WY_K>RF0aE;2wgg5XexmQ=kn-3j~1>n3*FAl;od^#1he* zv@mWa6;Xb{C+EHnV5CtZOF?18IFWiLTTcW>rknr9V zNZP@5Z!gcD6EOnq3V-NghEeYSZ^1zu;CPWaOBX>W|L}?laMZI9;C~OaKm4YgHYYDT zAcBM8E@x2J!p~l20UJd8baiDoxkME)*JzqnWgNW7ITP^mP<6t|9EZx}m^ZQemebn& zaq-O5R*H3zBoRug+H-Qt zdIsj)NLXyQ3lN-z>`^PXyR6`F?{h2uHG#mpxR;$#onT>15EM|3milSsb0XosS4j(sN8HZ#Yg5D zTyUIei}RC-_aOwoa=-=PjZj-=AmMYgzaR&{ii{ye=3AO&=+E3zxz%VN$-@ zJC4i=d4C3F^2ki@^Mp=Scq@grzC$q`;#eMeF5(44BTx3Lq%rR?@k`McqK?E~U%DU+ z<79eN*6S99hM}+~GpN9meZk=eHHF9ny4eVrKYQh#g^oojId6)pC2feG<4WAsA&FS+H;pHe!mFJpVKjz1pS zdNiJkBL4PS)=bEZ?yZD83y1c{Q?YU|cx8Qc`!|r05(+aw@}+#ix=c=n8YbQMsf@OP zXx+jZY==`revsxDEUaA}-T3n0y_gl?)N8}MFz`9BNw-dn_eeY7Qu#48qz`;=j(#_y z;gH?x1G%y2EL9vzzgHTsTo>-+{o@15U$_}6cll;%_g5I2nBBV$wW)>Da+nHs_7ep% zxpQ<5W`1V*PhE(%8F?XcdJ2+aeCX{u4Zg`}V`qwwqLur1vyLDsYCx4f{o%VtYZC8c zmKn0)9`Uph`sbqzGqsRqPpxf4`)~4ReXd%kJo(-QWUiI1M9oe*r$Y2CDCVbGZnvs3 z3KOD#-E=L=d_^$Y`%E7^nLBsrbqy9{AW)7UquAiT!f9n-0a`K@VQvP#9N%Bxf~wq2 z66ZVezeLt9@c7{#*Eb^WrtKraX}#T(jU4Op+LOdztzs3&#$KK~CRs&X70$#-%W;gK zs4lj#GeNB8<>>avV)=qY)~8pRHtVrBg@b!7iD6d728>Q4ZsnNpUYs*^;pro>1eZ+v;1>NFvj7zKHpLdF-s7CuY@Mn!3vE_OuU`E$6|3i_nDx7X) zpUw_cf%_`=RvRh-mJ|O3K3ipP_ZU7$?7|w%RL!ZXXUFX=TPw(#D|LWQn~Zf<^VLwM zm?n>Bh5dTQ89KO zPc)1L(Sqr}4RbKrWr8`2+!BVht`GCV_`1IBFo0v-1n}?0&seim?ktDy+Cz1BJUPx6 zyX^?|_Y}U+y_L1KwP6j*0y0!;TA&NM_{4?d`nbfYXIk^CB#xq-=}x!tM;ueA3jZ>A zE=nYiYqLkxEb+~HSSNM?W|z{cfkV-Pk!!|0^Pn+{i%fZgX=PZI z^%%2i94!EQ#GgY?#oRd0!VAd_kgACR%G~@AGJBVXZ()9ZzKEip%tp<&Cru-GXs?RE z(SL^=0w%>0Kt*^#MJp^bGqXEJ>|&86NRhY$q?@*|P7b{yi{Nte7Fdy4TbJ?q z>k3+Qb5H1>tMQjqh) z(6E;sC^@C~mN#9EB+T^MC$y`=U9hr@9oqx;Kmw$N*xJyW@q|8!=^u+r%YFP5l7{xg zR?gXUvu4(MH)QxKP7N~iW@Tl?4VmT(h&abD(48HRb;TEbz&7i}STO|3Fyk&~SWffp z&PXD|;sb^#oahTT-$>ejOc5h{40C3NASMzq0Nc&PLFxby9pNJr%QuFmcrVk5hqbSN z+q%JS$QO!?94vm;4Q@9&Jw6WxThrKDj=ehNQMp}ODW))RB(?;0V7pUQ_yZ4Y^u?$Y zqScB!kmK?e9uY!rpHXB7iCUKRj+t6ygipjdlB0FL z`rlvI2dV@T|AHSV zgdBN-($0F3PUPrNSZ$9I{K(ANpT16Sf~7|c8Z9LtE|hAaj6S=s*M6_gwj zGIH(RdvDo#&!NbVYo3FP%z5Z^D_-or3)&s8=LDQ3EDUo8wiN%^_T)*<(}YomWiX@S zc4?p{c$^5^{m73;k|T7RLJD>*Ibd>DHIRC1s60vEsmTBnUF$jm7LCsjG@`%j<$`A5hJYT05*3HLu>H@w#PX<{*Aab4N}@-Gw_mky1|*px zvwTgZ?r5y73wqX6(=5^dL&=ypZW|J8JHI1*|4QK$FkJt&?!jZ?gbPlDJgEFEX#90= zx>?B$3bi~#P|tBln}Lel9pyI%V|nSL%v>HE@sCuIaHXpX$J@HeAuFzbvfmte!f&_6 zi4Anm(Q$OyUIlMuO<$=32f@Iv{NILs=t>g}AfjZWaKdR#uXLyiulB&2Ts@rhNufMO0+ZvRy%hn+8vmRRg@0^pWdOf_0AWUQGo1_*`! zHb>+~C|rt(sq*NP+EvyBtvd3dYVa;yay3X)cnc&4sD`m%856_n?0&VQ~ukU?1Gs&WLIW6YRE#@ zcbXvzxdL;OG~FS?*}e+(>DwmIR5OkQ?LY!#ezGI~F-HgIr#eJ^v!ZLODQ0GLe$h0) z!R;tpF&=?W^Dis43ufhzWn2V8if@zgJAF8}#&hb)&wwT#9uz-B=C86oeF!s_kL@s@ zLZKoM2%kpVYl9sr=pqwm!R_$?O3pp8r1-{*k^?=>nmZ;RP^dt~c@z3^|} zP>xu5oDbcL@ALu-a17|Y+lIqKWmeyhcPklT+O_9H3*GAQdpI?6KTbOBuRD1{>oMK^ zh`GW+7S|<3k)MPSq-StjFRD>gg+Ij|ZKOjCWLgTWAaG24!sPI4V&QArUNvEB_}wil zNgH$00ZPmJLz4wXm-whkfCu0v5=giC5?Qu6m~JhukY5J%+--&YUvqP33HWx*mRG$L z%dX*cKx|8{1tH2~tsVJyn{IUVE-vU3ebBZ#<6-$SLoYwjD8Uel`g;%HEg{(a>j4kn z@<&xT5C-TNn`?vh_EwVkGIlAfZEU_lm9;tzCg>satu|EQ8SWe0AxTJvv({&_80$2N7$&3zx&HP)! zlyQWV(KIvzkF_f4}-t&^y?5h)gM7Q z%Xt%{=}4{G?~ku$IXUDm>#F%ARxIo8*nx)QyQ~0eVY-QcEAekCWothJ_~r@$XM8V& zv{A+o(xUi-|iz6~8++4UQl*vE4r*CDT8cUcd}rNnb3PU<8H%hy#KG& z5a0hk8J_s-E<5-35PF=z$@WgVQt`E7J_+&qEcg;s2xsvbbn6c_dgMs5 zpy59D0&fF+Uy5{Q!G$PdsRY|;Q*~hW@J>~W8_X-EONAU+}$Wcv-ztkVQaz=rT zL-ymEENO1iZ&LUugCfYml+Ot3VE13^K&+;1{?rcUi#)0zciLH^c}Q4;md5Mafkc)7 zfgQfVlGi{Txkl)!$qxdUCv@wxxhXS3n-wugtY633(dq^b`wa@8aSv=>U$7SyjP9kyzxzjQF>qO z_9*0{YH%L!-bI28{$4kI%CsXf$nL<_9)Sa)u`LOHYCHhq@b9vqHyRdsqoI8Rrvq`2 zY3;Ql3$haTXq5|)uq6P1Aex;SNhg)r3b-F#@$D}7>=E1FuFV#Q{@3~c=YHgHzqfyO z<4fnL`cz2p8TexERLaTb6%H7snf(Y5_JGL_ZgApoA*?^Go>ch;dY~e~&eEF$_ECdq zh&d@MjQ*s#od+k)rOwOHe*)k|pb9`u7MX!=a5SBOz%jqx&;^~+eSN_^Z%lmF2eQLn zC6Ym4*NEFTsg7JgCUoA?{^GqD(O33`!UW#NaH%tkQ6c@&mkW?Uu%uJWkw-OXYs2HM zX`0dHMF$C+2_?dYEkn{vSJngfwLS*p>{h>U(Q*VTdUnmv!J$rq&%5!&DIe@H#QO^C zwX!82Q>NMW6mHiIy%^}cph6-C_bKVb7YB7U(T`#{lnGT~2j1zW8SGEH3CKK_aDdb6 zykk{81ks6+dP4;-5q|5BoIoSuyH9yfz%zi;I2YBB03l>J2L9kh)w>WAqfiM~Y5`n8 z&f7#17OUq6i1i&f*Bc3=8b18@FZcUFx7|q|iG!50;6iyH;uB&u;dlo5eSFxA4e0_< zsQOkCJ`Je+S4UEa5~s}%Vulo=4V4xHdIZaFZ-C>3sVbZl!m>bRPbjG7V9+2Nh4SC! z5J%ENK-FBZ)Er$F)IVjxhetqE1|LfR96#HvKj{1yK8F+v28~j90-R`vz==|DR;oO& zMY2d;%7fVNhZMxv&76SRd1XXG9*=VVRS#)_D>*&9t{l8>$W>M(QB#HyfebF_d)@yZ zd+#09bpEZ4qK=}{6jYRI14IN=dJQv-I!F^x5TuAGz4w-215^Z5RHUOc>AjZ-p@?*8 zQbVNI&>@5*cYm3g^PBf~&U@EAYu$C%dha^YZlh? zi^j)o$%1p|kgKI#hu}$OV(HXxx6PJrVh z4|N=q-?zEv&1$c&{pkQA!9o$Aw9XrO{9Zuh!s!ME%YH5Vp^)>Zr~5+o+|L)uD#^vIEDsKSt@9CIwX(I#bw|0#&r zXI5i~+h4ezs+uJM_e?Xbj-Ya0M&?isdK@0x7yaire`b3kR>-nSmr|ooOq?nscB|s~|5Zo$ey`lf_f7Sh4 zqp{iB;a8`Wdpt{f`;+Iz$+;74P3`y!>yGKRqYqo9V;!42c^c%o(J!?glfc4tmAyfu z&vSuA+Szqq0`$ECtXZQ~&^JV2njn5iVe7v_C=ktf^awzvWV-zI;nPM zBgBHMTj?i3y5N94A#;u|U)PuDJ0_28L5IzuoDnrdUJ-v8>=&fJ)nm^|hu!+qehHa5 z*5B7u?ltm=IqmuxY9t5ZnB^{T0c=MQcJNX~5dKpX1k#T4J-DqCw{`P4oGQ*L{#(y8 zL4WTr>PKp7oX>BSZPM6tZsm_Qr=xs2Br_ze41EW4lLnK}6pU=$b}Kjy_al3$7xvO) ze3)+Zqwk1f@p?z7P*%xl0Q1feAONx6Y_?EjGhT`8J-gAsrVnZ|4ARB<2ULjg2bmq~}3fsMY6g|)NK8vuO4!S#_ou=1vT31skx*$u+WL5XEjW6Epji^n;K%BPM_fjS{jNxAASGPOb1Zl#38f-@o!|bAt*{Bm>C% zukoW_(oFoug-j0M0doHng)9cmBY%2M9SzIL9o}81s!xRuYA&0=&9DQ58P0_Rt&qe4 z%i8Y2NE!2Q%bs5@Y1V~aLXKSBog??LSW=YE;V@W&!1u$M3&4dgH*2)urh=gK%4H%@ z4qG*1OHWl3!o*F;{k?DeMpZ&2VlZ3N1gN!u=^KT2!1J5nDGMGr;o?D7_d%xy%s{BX zVdIUmUVm_*7`IB95;ZSvJCDE93xKpW)HF^GPil1pXp&zbuLr7yMK1zoeGv&=wx_P4 ztOcdn>NJn_+CkjasFDcel0U38MMId;#*{Ele~(Wk_nH6~WaWVo86$sG4&Bmfk4Vluk@umZJ*kYb296WW@IzQ?EI-G>i1NH*Zi6@!~Q|ykrl9TcT(O&Rael)_k`3G&r_)n6#OE!!Kk-)MGU{?^@Rp5Z+*??P6GvO#^@d@wQ zxVKrTBC6oDIZ8(1gJPW~uZeRbU!zI^((t`vqmrn;Tf*jr0D5>W%Y#p#Drv~;vupa+9rgSvP)J@0@u)cCWh>w44wwf&S+s}^^@vAv zcirTPVx*sBWyZSILb(RplY6|h&4#eZTJKs-VuRAH?VGZ6F??ADth9O*X)Fv~{X9sd z>>Sdf9RXy0r&Ud^>n5t`*p~l`GJcg&%Svl|{xRHhI(C!hdM0jrOn?l1jn^uOzLRo| z*ZD7vaq8WE-oP4sA1y!fA>~uUal|PTD)s>ktM!QDhE^eP!ZTRp^p=^?-ktUt=o)>^ zpJTeBh|9(vZI$`)JiWyy&)uU>*);yJZwOOHQI|rcHh*j#2s~bt8l;NvCE|g0#xY3^ zwtHAT@%(Kx2gl3+hS_Kt%{W}kH$!H_om=W0TH4s>{rz;XBDYiR;l{?#=Zue?40zGw zIsyF`<6dEA@8D%e*tnO%T5{KIvaH!qg4~+k-F2E@q|U^iePP%AM03sk9_Cwp`Qp_>__KcAfU;c0Ux=Vs8Ssf@blYwH>bLHYtQ2>Lz+e! z*u;1@ztC?jWXI(^S6qG_n&HtMS#rJ!TA_putg*3iE@wKRg=`DEb)R@ETCGikB~ukS zb+nF+6GBoCXSrCq7jcd}Quc<PA1(iI32<g=pIZ{66UZJLBNW~Z}Y46sOzmz|5AnmobE;V zAJ4*ZF9yz&tM)uB;?^s2jFy6?3{?X#^8*iyPw4H-fbpapMA>Pv$1t8)vHif0{>T8S59$4~FVT~97rg~wT zd*YnG35wo1?+3XM!gdH)9f1ljARp12kO7PYcT~?1GFXu_%Mtt?=CU|sGUw!u630sg-r+yn)%pJ?@XZS>2Bp9mEkBTg&*#a%BK5bl)pj#hy-(!_W~a{R1^P- zBF^78M*^RRk0D6zA62W4(0=K^*W&W$C>Msq!254pUo!l@pp$Whv9${%IXaCGSeX@8+jkXv0o?45 zyfhl`w;UG7h)88V0DZJf0moiDy#XBOH-5!{4Sxrvdc4dEC!D3LGxJ&g5&TEv+92j5FZ3BIU;hr48gp z+_4}gS{tI)OH~~fDH(ZO750afH~4orNVNzX$o3hUy^bZ)#UBK%P&TFJt1CGP;07ZMdYs-`UCrYp{Qes2YnX2*v#tK5w(7!Z&iRYwAd*laCX1#CxLyx zLE=%wUsn2KH?FVsn&~D3@E8)*j;?8bC}l<=moy@7~2x<}A>~_~rM-Zz1bR=_r@u zmtE*$BEVxzidkAY6NTAmJN$e}P19EGXlX@A6xYg)TImb3!LWo8wyoJ+Tc9}|al~(! zgFvGGuBIdZyvPF+z#1lsPVLYV(j9E!)a-1ly%jZC!Pr!&g=ugq~+v+5M%t+l?CLLZ-tW-2M@kQK+5J+-(FK?bR(H4g% zZh*^5p;CLR)(h8$q5Q z`5~po<%~YUv^Sah$o@%ZC3STG2KS5r(B$nJv5P+tlEw=+)-4Wse8Ptr5#< z;Ktt%t{nL>AE1uR2+<3~(R`EceJ=#*S5-oC$!}16R-*8O9%PWCscO8x-;n}+zb?{GoQ;)%3jZYeZ?K!BfX}6_8{7A3)gmdfU#K`TbOh z-+Vp;&i^H^kfm9$^gBX@8c2|gk)IGUAzlCBIU39`GBM9K-swoc1-K%{z_6t;FZqk{>vsW$pk3DTfn1Tm+Mz=ptO@qfdCXAz8a{uifETKHPn80diTzJN1SMV!HMs^ z=e_&YkM}mJyg6?FJWe{K`ppw&*>f@~;>V%4nuf;ix?2_q4vx`uWlYpu8f!#Co3UIF zx=Fpc*s)~`Zh7N@OeE@ovMv`%F`g$<+)&dMr;uRI`E)AA>hlyLqC_l6nC8uEz@e%s zDsXGQwEN7v$vmS6h)hGCLG7DvHHRr~Qu*qPX8=^qhcO5^xR z*z0lpgrRd(EGNx`S}UNKJ4{C`12yFlD2_jTRvfB;^`33u`>#bQUOX()6Q}b3V-X@6 zioa2h=S-=jKSa6b)CDN2p64ZNQyR7Vt)zeNLv8aV&}=BOQG&eaCY z&x*zEAcmSv;rgdSRm;0g=Yln%t~$Wo+SRnAz_0|*AW>VUo6FM}FFFVNY$=x(Ts z4E&PG2oT-(1?_c!oUQCZk%6c^_Aqs$_$XM12!jUHHM*}&DgrS_AYYG{S!V3jn6omp zH)8+;N`T$SjKCo!TQlil4Tz+R%l(Jx!JdEy`49-Twda6Q2MEL!ys#r=<2`ioWxxjh zaz+d&gILfmxPU?os9-jQ_G~buK3R0HJ|egaqDBI}w9k{!K0jc23VV&yZ`*lu-B?3F zoE;<%pxGhdj_Rs-8F6}K zK3Rh3-|Se|f$9@3=jrHl*u493ZMDprFgv;$OkU$*}p zncVMu^2&w4I!K^iEv)QpxPQ%+#Rb?m{g;XtIx|E>GmrABkUvElnb%dcw`iXg1jf}Hq2sy?Ge*a;FQE!ID8a6sxQn#~U z=wxAzcJ>D!OY0a9ql(u*?gg5)>x$-V(Sj;qQ}=bh+Tj~4km-SYKv})c7~rf-(bjd? za9|I7!CTyTnEgAO^of`M)zsD@hO;cC6MRfHk2gqxR%AIK;-Zsnmmmz`2Q7Ic$!+jA z;MZi10f!&I|6ik>ET`g_{9^-@1c^|zZxMZ^m7*mxLSoIk0; fLj2)RrcNSMCRSHyE#zplpebS<@?v!^ zjRWP<4-Ynrkih?XFnB^i&0N@hX}=*n`C+c}n*%Wib>#lALENQ(&SPsGT=3kZCmS(G_+R2rmr`b}SOPfhqayJ2 zs^S~}LG0iBI(VJ_7YmHrB!%#vMzVAE8OW>;NcEXN=B<~tNY6p{@K@m2#1R)a0<`t~ zlf6z10JaqLJhTOEVY^@e^Zda$h3T(VL=-JJ?x};ZlgpHTp7;RbrC39jXJe_xUX6pU z29C)Vjd_ce=`3!?==Ff^M za(Mu=)&)2<_z{I9f9Jm&^ZHk(PDQ&fA2toTlu&bpMrz9Oz2e|Z<2Ak=FU|OsA6Hh> zLAK?|s@e!Ooqo}M@HcFLT^F|oW|GFx!0mqbbGJ3Y-y-%vy0;G*Q>C?W^#wG~ZUUA_ z9!v~^d;H@#yCJJw9`H0QROT#K1wPSn$YFs=jF)2MX+ON%EHO>Rs$oIW-tzeH(9z_% z3NKIB;q!cEmGus!7Z<&Ln)u^bFzUy#bsuu>k@7CmSlR*}s2b1ssCj_$%<>1#-{OK2 z7!8J}78k2{+eKk*b^OZ;bQ``{OgC1?}Xy=~d|OY00&%D$I7TX`;c_!$a` z>qvR8nxl&|k$VgMN$vlqm-fa<@$l5Y^t$3{P1P}VYEwPpNi7fzMfN29auZn6fPXu+EjgEdS*sm#KM)ndaiT16 zD}$%yPOkG6&jk`H!_8z{ahRp$nV$=w35Scgimx13^!3D3l**{YaJ1E*F;W^aZ1xDRI{r-ets3 zFTT%vcFD#_a<3$kluu|(iB+?Q2@FJFp+>A$1&YdLaFj-^#VU*R!7@tEkXOFOiLIMj zoU1?ukQjV^Bc^pjF2t@eI5RHKf_Zyxts7wH>gZ_R9Y>>XFSYpvesYSsa~bY7Wrz%W z5qezGl$1Aa3b^KaE|5a|H^VC8dTSft;9Hb7h3fBQnY@cTB#Pfdfa5{X>0J%5cu84D4k~%D3YyCzyw6?u`x!_?yP&8$k9Z{hC z;j&lw*t%F-8w-&_t2%5SK^>@9-3RAm4{V#qHi&X>Pm6Kd^tul(Gq3Cl9+&SjDX=kL z-q32gTsx0jexOQu1cy!ho1bZ7PHqvFEw?OYer_yL&nb#1f=hJL2Hv58+^bn77rn@0 z!q8TkbMip@Hl;K?fPgE*O(a|s)JXX(_-OfE8!!9%s!^IC2W)M}Ex`uvAIdyAc^5<^3c(O``;E9 zP7%Iv2LufG6`#LA%oOCEm9SrFsbS9M;$>F2n?0tjuEp3|anWMEKRd+~cLY+!9$vSE zmx<|yBM{Lf-8it6cJ54oN1%eoabEs;$J@vI6~r02%j%o3J-#nbhJN`~I54=&dFG~Y zgTSk%D$+`?Q8A5Q-j&w8*kQKLpu-|By~eHAWO{A#XmslM;?Jz{_Ahsfa?3n!-7fQV za!yT_(2IV4)n4{8}Wez^frT!wVdrHQ%e#=-k9pOsfmg5;#Hi`y%htv@2yd=9?$)Ra?S=4p?exNSntbh2N>DyR8gxEP)6?R*$P zeKf3vuVJC3I?(rr@xW;D@OjeXM;{a>H;{ax#(9Ix_r5HdApEqgB7GQh&>k|63f6{A zN++wGj!Zy9UBk7d4Kt`vLZ_btHiS)6*J0&brn0<6rK73l?e2l7rU!2<{hGo>S=!pr z_L=0L8`=GC+F;j8c6W?8Xzo`oFUKvK;zjxKFa6!V%p!QnK~(IVb$^ zA@=qP?hmbKIepMboVO$I{19UFhZu1K;~z5+_|VabZUBocsc`K(zkk_)E&ITcEbuoK5t*aP~7(EjyM-!d`!gf!}WpOp%M=D^zer; zPRQq^54@(|Ix?W#_S4hT2h#PjnE_xmg*ssB#i;fsCD@n9=M^_h0xGEby*W;p-Ne`F zc7df9EA(!Ct8)axY2*_h>?Zivk0B?MPyVk*pi_DPYvHfY4Sl%XU!R-rkwk<)Kkxn@ z{2Y?$;K#30kQ!@Hc}D0Lx>r-v(^`-h5D#ey@K0m>`z)YZ?9pSw28qY%l;VIK6Pe3v z5;+J@bp%?J!s;5_vA)Ua=|V3#B(DET_waYdR`7kR{`r%-k!B$9KOtLo;`}h0B=RF0p`RC^|q)Pt%|L0Ya+w6QEe*16!d`5To!$-&z!0_h&2FhknMsQ;O zR65cL_XBT%z{x!3ZL!?Q8=izDqZ}v)d1dEr*P*gb{1r%BbXX>WsQW0OWmneBK0}q# zb2|@o;~)&to{yK4CPE+ot;YJ@#6pAz2tv$O#bKR|1T}B|04%7#+%0+ zOw^7RU}u&8xA)Zlk+1##n^)bW^_8<+6#PbJ84{FRx{B{TgCOP z64v)LZF6gDj|cNz%4G*d)Qd`?lRv%;CurS#8GKHA@4BCu=Op)B^^jAs7_oVBMSdg4 zXKuc^Vr5}&+Z;=-LPqNCKaP>4e;gxL|2TCF{&nj7&(D?qXJr0o5&X|0pnI#Urw$(8 z%UGYap>|^KDMIE(Kwv0}to=mktfYRj>eOJW&If5H?aieszn+t?KJJ~25xbDT`I~7J zlO9vLF!m`RG7gi4GfjaaMla)b*+JevozhK3&P$iMD8;ii zVQtvdODBKBO+=h=CHC{ZjJkNqce7ECmyY~nDWPE#b+I?ND zkJEKUTWiprPMjzcXlcv%3`zm0T?}y0?+p%h0e;Z17>e(q}^%s9JlHCrE%42Phb^KYw1MnVznQN1&87WN_8W^vHAenzt23T z@i{%6b?a87ivh2E5iZKTMHB6;9jJTR_Vb0=w!vaAzCdyncUv`F6Rtko6|U9&PQ`9x zd4L$mxp3k*kJrrjsz>i|H>z2zcg~c?EyZk9zUlr;!PC#+vupj4{O&Waq+IDUFG@t< z)8O8@K9TAO`I|(oy%rbn*ISiLLbFi&Ti!>Jy-<+))ZBU##Y;kyhYZE`msoU>YnkPT998r{J>w9)IS+vQM1k~XDN@am~MO1lG#Hf=Y zorsmXz({lS{H(T|bwH`nx|Lbci8VSEedd7u{qo29AFCCV62-EHg*YyRxwmyfLzS}R z+vR%CuWmKo;yp)lRe$%atXIz@*p+qH!+UwZPd<;3FnVb+{MB?`zfr|6>;8|p;DVcE zv%u-dpPvP>CuqSP7V)6<1>HhjI6AM=Qoj=opmWQ;)8u1!Pt^djjy&-hN`V`$A(WS> zeuU2drrKoeC5>Jn9iPdj%-P*7OLp#lpS#zh%cC7qvH|ck-D|S0rTEfW`|Z1E46@s9 zR`5)fRK=#FZ&;Db)FP!DtLWnsiIl@tM26P=_V+6u>uaz;mf>HsrI65eQ43A4Go1z% z1J4EJY4+Zneu$FZ>i=~bOCyb>U&YRgceCBBq8O#rYvKjf*2>Sf=ytQ>;}j?xt3$n! z_T}MKEIrnLZK-Rh=iXfrmiVw`Kil08PsbwZm@su3)+vQ^X4#yBj^uLLvd)`+Mpmok z8aiF=cBu)oHdD1$@b2{>#5e6Cd zZbf9+MMU;IG$>%49P&r~nkJpz*{ZSGG^lWo$8Fzd4a5fgWd9x+FV6&^cgsCP@hplW zNRiFSW(%`dV|G1s?z$=?VP)2$0DJyFJ1f-q0Q5w z%S#J6jX1TqeA<@8P_nX!mv5w$Y`Gg-AF`*Ra92$ zdhpwg5j8ZE(X4ElHIq?}H_lbPFdORBT4TRkOHbWK4uSY~wcf;oq7Qg8y30TjlutPv zieX**EY?vaATzi}>6kdNIP3DNFpf+}29pd*^?cXu3%Tj=G?zBqM0M!Sbq_dPQ68rz7F7jg zd2uVGYNxsP#4-53l$c>`e+1Ps0gk;<9gcn*dZAywY+kfuN+8+hd-u2Ry)K0;YQ4YE zwdyTFX`-2xtv9Cxz+KL0a>AF7E zWhg`L>78qnx%jmYUdj9$*Mcd@H{3u7^E<`Rao;C^2ORA2j zg}%_r_^NRC=4CVH)|(aItgBdd&Y%zEvT#AVBeZ#``VqB^rYvXUDOaI^pTB|~b<@y) zBBn%wlA4f3nfgL>Q{ow{6*PgQI2$k(zs zxf9;KEsu}+=pUJtdTtA~^t&hYE{)t?z_FnALqWT1o70-bqP4T84RI9liq)S%gdkBx z&1*lbx(^M!rnhkKcOvr-40q^UEF4%Tzc4Z+9*Ds1EM*xDSJ+0zu!AG5EGBjP)-BEm zcT<0u!gk9p7-hTFndZ+$cN~)?2ZW{fbgZ;8(kXQv zdB z7^09&povzFy>YCMuqgB*?IE-52hpmA=jKOx98zH_Q6;PfbZcCagN_L~eG_+{n#|=p zObvQ%;cYf2CG-L@lm*DwTXsASI=L;W#+8i9by?GQxAYiL1Evi*+Xscz);#jvvyIm! zsAv}*X$g!PbT7s!Y$zORMG*%VZwwW^OurKd9m&+G=8`^HvAnEG zh$$mC7D1OT3D@j9lZxn`gEm=x0&{*Nj|e{asFW+@=@zNs{bQD z);nE8!HlA<8PnpSjr~Gd70zKXVgu0m2Ax%pb!ZcePFoA~sIm(Z2rKeT^1id0WfNq= z)4p8vIb42n?_?Y&s4YJ(wiKgt;}z{*w`K?Kev@6z zKWx(7{buqhnOH6bO3)Q1i4GQEOKfxN-a}bn78aKl1&^Tjlx0;>|9skdFBFRK@V}IB zEk#08n|^Jf(%itT_{wrpWMWU{M(owK_Tsg5xb=m(wV*QZ&pvD3=Th5x^=*O|>u0l5 zHhfm64)0S~GraAbnv|wU1+gTPO-8?v@7A<{X=+k9v!;SrfpsR7o4J9I19ZPPxvKX` z-cHi;Y3@qWQ7=Y+PrNRt(3a@9RL8D991vlC(1%C~T3sh<%AfLGX&JjwcQoAOmzqPgWV6G!W^-EV%C>`f`Mt(xZ7u~RKvDExk~=@wdzRr`7m=@FTz>bGU=tpeOu z3T}Hv^kU1c(y1DTnvQGKohzJd!wqc=o2iRPr$AUl;meey)!(p?^>`=L;>$&)d zj6-FYp06B{9skx9dR}aNzxcdNznbb+bfp)2=~JrnuJK?lR$io3=a>@k4p?r?dS@n1r%lmhZMS0&p1Ik(ELooW9{0ko zc*{Bm#o-|al#!0u{M=v~x{KZ-L~-IrSsWfIjq{YUJ|w`De0Df1T?&#D3LN`QS}ltx zVXvA_(Noe0)Q^F@hc&ivjnn%j8)-4_GlKYTf8j1{7EeEk=5F~pPy@A+P3Wap&kB5V zSdRrYHUh{5*-D{+;(jO4BG%`lwZhw%yM1P?ES}=2=Fao71zE?)IHKl$fjDRDum--~ zV+*C^tkw0`*SOhq@7S${%z9jnNo{dwXjS^?+5>c3ZT(G^zHCQ|j_&!e?{OkAa^0&b z+Np^sv6=6xBK9TdFOTp>Ps!s{dU0||kL2{HAdzGHP!u(eXq5}OwQmSpoc0G5poN=f z^O;b2F66N8#$u@fvyp?)Qo6COdhGF#flW4dh#X;q5HT6cqKT3#;P!A_6IQF*yV-sw z)IW2k=z&4!E`_z`SFUIc>7~S+VeeU~3?fvfOVAi6gu(_jIf znqwcM_j#t)vzVM(Rzl>gJ)=;@q7nXj^2_VHFL$3+PNF%-RdR?Nq22Fn!DX{3iW_0? zD@YC5203;L7fZ=2o(R}Z=FD=i@_0Uah<)Y5NLJ2nr6oMZEILcY(Ofnt@~sNDk%@9~ zQHXt;r1Y9-N+4=`Nz=4P-$FelLxD7=6S+;xEFSzmmlyV0ibZa0B!Jv_L|vtw|3o2Q zs!>s&d->vhBO}kQOASSy=r`V$_)2VgpyZJ4isRy`u-T6yZfy~2yWCbX)n`9)rhIPW zlpE2*YQ!ZB*0?$n{-~;KV5WhvnS>F zL5rN4uss6wBHn8=M|Djo7rO$XVihWH#=SGj>=VJoA@pzS>1i$O))i?ee?3S&L0AC+r@ni#$KfH=~umL zm?B&VD8U88S1kHVYHtPxA^eJH#Z8bIC{cF{9t369|IRR=$wPw;@4yx!qxt&RHOeYE1vR>Gp7 z^~n8#_w|b4MCCVCjZZ|)SckK4ED)<2VsC|qJ#{gdiR(2ST9v_O2A)z2a6hB!6xPg{`Ua#M2-!kGJ z(ivzS3WwqK2W>q0{-zYx6XftHD;bQ?Dk|6h%n;jLc92 znDWJX&TNln>W9|4IKkc|;ikCd-KLk@&@OMRVmSt^CXFIZFno`DM;QyQNHqQ-)~$Bp zn-}KmtF%y`v5)jogC_2!T;4_X9 zkFSo6i4vndzw_dpAxp8Lpmc=s3*$}*9{=E$FGO^mdGov+no^xsX>}gfCB0UW=^h)6 z14Wiz9u%kLBY%umMf^x!qrkD>Sz6Bq8RAf^ZzE1~?SsPlpis2qwv%b?vqn5?`E)&J zjfn>8OtT!`cmBJ%PJlJ+^USnRIWm#9zfFN`>q)GnB|=}Y6Rh5uU1GLXb?>ddSOf_d zzeqq8RX^NCfq}3Xa)VWv$UYD`Fej)i;ea)&bYPmo7od9=D*Ii-NdT7Il9R9RrDs?d z{d?nwHq~gp{l>Idv_q;>72267ts`q~W0hlwhY3Y%TdS$=i92 z=hHJ}akJv%U5z$bmnf6A_Gf?8OZIOz5ZZAe`zN!=9!&$5zHzz|D!jM@<@kHk#CMoq5FYE4JdS*`E1%ek>89 zWLd0_O^QIIxz40-Su(iz(u>fLjJxZYSby=%d~WYBVVgnp`F#5aeG@4oHoCWoXPXxd z`69I}ezEA!sGOa$B9W#yt~$+slz|>()8~A8x|P`teXYtRe$#%!2La6cmxsz0Yl2+W zq8M7c%*z=h9}C_X-^>J9>TdsDr@j=M^9H80O|wvcDZFojx?hx9%xe1+mH>4~kv(Cb z*pYBesucV6G(K(tKbJRaZ#r2PXAz5$jrOWHsWGBdMTrQNQo?m;TpF7c6}yGm`3~MU zR!K#D&MW*0X||=^J+RzD_s?eJ+smH69vWd`-I4c3%j1pA&sp?R-K6P4eL~xqytEiJ z>CBneRUfz)lqk$BcNz)GtnM@`+7!E+G+feI&Gcv2Pn;P&cH6Of5qy~G`Fi}bW(uM7 zWfOb!u7^LdlMJnI-Ctao?CX?jx{zPs^U%C{FZ)4UKqab_$9uZY-R`MN8_CDBpyO-q zb3J2>4A(|^0`7zbH4{DX_u-NRC8+4=I?p|8;)xdgw9=}OLRil%9y(k!Xq|4QNQIKZ zECY7=w-T_lhAu*cq$ec&!6vp_>%OC1*9L6OpIU$lpWdkW zS(8uFgc7sPf%J?#>)VzDf1H8`{@pNkq{0Pf9%XkJQ_-mTi^XD10M|?gESva~66Sna zk{?`pB9gaKCq|4FI^(R%+PabmDSS|*?smy!Y=MDSbA2-wjSqSbV|ejE@eQfL+% zrKWzK9Am_;>0exE0_V% zI(8{vYm+FWzFqSb{YOmp9~Yl$gcE2b_kDK^Fn->o>fsnplYj%au*Go52Uq~Hfl;TRO;#% z5~wIDwfN#3Wh2GQ66xrE-Nz8IA~#k!#M9Xlt_RG|Rh$o@%0F17LAaM;!0Q0vtT3ik z9YSRkK)os7@U zVeyI)g@x0R0LVTTJH*l{2}yhJ9+%8@N))b7V=!BlnZ{SKC=IF-cA)W2(UwCxrR6Jr zEouU<2G!PA=Y6caeUkqQ+K-7k0D;AfMJ+vDgc<~i8)4J0HRP8P+Y4t`RnxH1>ysB< zzq$~jS6W#h!}Jq!#4uwOelA{g9{ajV3)9jPDOvp4Uh1+&lw37PwYdG!q75mx>+jZU zg37>B_f4CHP0CDtN&XmXS z@XmKOt;h5TCQ?I3pxwl3DmA(ERB_mR#p0VP)ASZ8yZs9D`Mo@ZJfW@Z>WDtdNs zMbx^;flmax9GOEcLx0Dr?7kI6xu4+J!58koCiUYYg@%+G+odVbvyYkU_(JJy>*6;d z(Lm8_!ELllx!;@=!p1$m{ANVImrlYmdC~w%c_$0Ix!Skp+f>X!UtyGO0hG{4aFfvd z`6fv8I#FQFVwulBJ-gy^w9}TAdUA_hV_tU2Oq}UZVXxZkM=ceFg2sBnPt~X%Wy$> z<6+l=NZa{sHB7xG;Z%ErH?K5UOG=@xb4^~;1&MANR5Y0*EDL2b&t_t&;&B3{O5v?U zOn+Pyx*5`)j)cf={V=D|z9xjKC=0KBj4|OY@!JYJuCN~EZZp{l-rlO;&*!THu24sr z>-aH!ODcb;NS9Rs7qo1DTzo zht8U0{jh3CO-YG)@LvCWWNuQE#??oa33vt5aN5AB%)kI9ACzq=Nz=fHg)d>4ixh?X zK7ca7kR0pvEx z{NMSk9ptnxagufGLgKj=w-Z}Gn+R0$0@D+Erh{$r6jxbc&C_17(BkLp&?>?9sVn{7;%kBiQ{C|P#D)FtV4MSu*Y7q%PN;|u0^7^ zp0*VKxIC9LO7lnisISECT26q@S?te&UW(hBpR9f9xHFjyq zAx+?m>J)wa19^PoKMMC4IaE%sHzaaPWzF7^8gfK?Vx~OMHc9V%lGyKVq(e|Lb0>Js zIA7Cq!9TpFj@|f>J$CK=B19_^hG%1;n!@b*fPob!6f)T|opon#?P^OD8OmQE0)mk|Gdhr8FKFXf z&%kM!sqyXw4ytjJHb&7jF2(J!pq#JUcm@_jZ^OV_%gHv@G2B#Fy)7atwC_`QQ>05z zBYwWJ~+Ww*{HeWr4x-4|Kf@dIgXr-OX#;>;D zsO&xs%?Z?)yAj6y>j~3Mi!(L9t+aC6L;u~y`eOWx7#PJG+x(3`9B6kN>tf#0#ZTC# ztl&P^2*DGu%f&i-;O2|EI_$bVUwn=V!KW3tnJ4)Rz3x&Ljz}(@7!a0cQ&)%pTDr*L zCf>+%G!X&{W|nPlN#W?=J(taGTecne#$Pz zHjn;Tl5B@?p1*59d0)tU-o`Qc6Y5$g^|9Cz@4`2p=w1Ew1>kMIh5Dik;yfzJ!&^ZY z-ciZ5fwb0M#b;K)7hguz-(EZ9z*`_fr&Mj-emzh@T3}N0u^4HN%9nX*uf^#Zo4p5H zr6-gI5Dx6&_w?I@@9f=Pky$F1@h3%dPn1l(_u_pfBh9wb+-2-bcVjUOY8~YT=$+@A z>g*_hylsNbH|@O^Z{N2s?BKTm7<@T@;c)dj=l{jmTgO$oHc`XdKtwu}kW!RT0i`6Q z6bS(-ML?A6|>qqiz zO#l3Bgr-&8`bd1dtNE9sf)Tnx*&~{xy_YGwl`ojg`I;&-Hg7{|9u*cFo^(GtljZ$l z(4UhAF9=#-kVt*O^TFvX2^9VAR*$00dFrav%?)mwr}HzLDlaJe`|2}vOf&Xu?#KJw zy}1h2-PJE2u?*@A!oWY^W0u4|cWGLxi51LSpmirVbw2_Z<)Up$nXUeMBhQ?SSwX2t z6{YQ!U%W_bN}iVQT=T>S67!(cJ1$%KYF$fjA75li*^|*o*&QOKI}|8o%n&PmnWW~b zt@)hOqAdf`p2yEM9odCY^wZpi$u+d-u#VW*9-OI*-KkvpDUc>$&S^?b!<4aab+3)=j?onc z)cJ|4Jg3Nq8iX{Iu8zOkqH3i@$=8LYQ=`v5;xL_7$BuYFB+t>VxEMr}VscHCbrzRG zo)c;D1aDOf6->goU2aqzTRXWv@I)fbKgO#sI%xBwm>;x}kJ-q=67(&RI7?yp0G1d& zfCs0%De~iFkw6g{a=qR+RY9xahMej#tmYZ57mGID-8Qnj3@Ebv!yC>PKXXh9X)}1Y zK;!X=1`BVJk7pvn&rXPf>tw#Ao}nDl12S@2L8e{OlowXaL{ai?7xwR5Zwz^8T{-mb z>;Md3BM2qwW7cS2eC2z0YcW6V{zK0d8k|KWz%JS63MFRD(TcvoZZU=7B(b#K#*#kd zIE`A)a8$7iU^;p0OfQxJx>xbFjs%=mMa*k?vZn+tuF=N__ya@pRjatI8h*LR)pGYB zcR5M(4sU?3=hf8{$<=W!RJM$XJnZro;`rD!a!Bj<`7I5lvH|m}1A{$D^Muffwe=$B zO>!&F?>Mgp`MA~2`SJ^>=bwbH(`=5S(K;|TpVNF(L#cS~K~=O>Pq6$2%<_Sl3C}=$ z2cgRK`3n00-Og3~8+X)t_a~skY^7-(F{R#7&&8h~d2&u5?H0lUN?hMa`#P2+CvFJiD2cj{NEZEK zNI}gR*&O-@xf@Y@H#m;AsFoz`RR?XIZKyK510y-(omcdtc#T32&Y~V0H#3i{#*!s@ z8eV!ZP!HrHCrsbcsKu;@@a2nKO;+Qk%`DsNl5TJI_r#Or@?+uFuZBw2*Fg63=B(e7T zOk2UJx{9gvz35fytBqTm4}6bAg-n|NMMy0DOGrGYsHCqdr_7M+NU&$jz!&|Y z!c!SJy7UkEiXDu0LYzszCX?n+>KTJX_PjE>`(54VU8vGJR7t@K(^`RA!{TG;$|^j<)?GAyWo*Y}EONeF%?(AL z9SBSbTpI>==GD=5&9={^5|Xlqit-u*Ejy!6Vi`O#2o^+QFHwfy`OLAB_n9m(V4av{ zZ}^wk_h!YzVBI`XEj?`*(r=76QSDB93+I9X#1J2FHdT81Z?NHx<+mv4uvzkk=b#BS!qq)F)z|;*pmw&#nm;j zve-t;Ua|e07xd?9zP&nC12S7-FB%aAvFv)r_g*erL$}kxqQI;_@bbd+?j|2>WDT^R zNDxECb$e;{a+_XlUz%!=BNiH}G&k=sSu;LzYr9YG{Ux*H8XgTlm(9{3AC$DaW9hlg znD&(&pOnA>sFx9fWhy=lXW8wR_UXT8MMOJ|O1rlFBMi+hGVY~=YduJ*X`apf#Ub5K zsH|p`tRH^_+PZi!uP3dd?R~x)dMFq5;~e#|8+ppK#MiW)0zS26v|lP*%J=ULp)Y64hZ`pwpmp$+sL8mTJOo}IAEd8pOXgzZ#;u>Mk&$l zB0qq*Qv-5>)QI($1+1vtmgnYoupC2dFUW>Ln{C|{=pOCUj-XuD9zRhW=kWVY_V#ao zxs5_Zqsb(z+-@5t17r4u95W}TL6KIX6iZ6e?O?-3l|ejUCU}!~cP6PO+8~avYZ(!t zTc57RW&foMz3J zsqwBQx$C#yZq>jqp@g)%WPKV$x~2WQKd_ob zd1)Pj7NPfW`O8!nH}LbrgMnYE8i6iNP%^U+nSuXbqUphDCLlo!k4|}Xr1hs93?DJm zDd$lY<;KN{I1I&fRkXaig5rALAaeS{Ao00uu#dg=pp4zVgF8g2{xu~=IuKwwDj`WZ zaeXPFJ8~yafU296gprguYjgx6MFwC8;lL3{azpeKfp>uGXaho(gTTt1q?qAoMC##2bA{&%VPto!vZwJ z0y;wj>JT3(FGSOGb_5#Z-D8uHT5)sBYxI;FOgQoTdm~3L&ZeqcRAC{OeaOH+9*D%L z@n3EV4?W5vY+eANzA=#7e#$>5m$O(ua|@A6Yu}8Hqcp0~)s30R5BG8lrGLVas6>)x zbOYz{BB%-)r7<}!&3b=IJJd9qAZ%=Yj)i3aI+^NMqt!~@UQFlkbe=`vO=gjd=;g^L zmxmA0uHV#HR{!z{eQ^?LZ5g{E6$#dss{RB4(g5Nk;59Ead{D~E0b5IM?9~YpY#)_*9&-PJRN>X=hED-|e9`)8LhE0D`(5{eAXKRB zmo(uRdeD}oRk?l$x8efW-u0_jXoiYBAmK5-^I4iC?NfK;#Uojc%W}`*Et2HZ>;+6U_Mp4M|IzCBn8a+8suf3T^?aX@MrJFTl~uP@kO z)F*HsxO2sQtfNC-{F$_qrSMuA7>a_v%nimI!U9}kT98!&mMekfqjURC30!~{^A6Q^27Od$ zI&;yKsKjPAbU2e|^#R9$TzN)8|FzgNOwm3m3|Ex6ZN*-4(dJ)`epu`Jq9h(5{#J`p zh`Jpb%?YBOR(;}?parfri}0`iY6i zyGQkPyk}#Q3y3Hp+NND-M0+iF_{(#H73m$^ zIL%^DL%Zxsak;EMHQ=pchLrgev)`^<)~~6)_M;d3Rt9+0@C?vdM$ykH7(Cag7{v=I zI^3PF0rg}e&~54aQ>wcjeC2FgXo#fRHOGpdM?4YE!AB6Me8vL>*nrWcH)|yf7EWAZ z)*xe^tW+ms@;&TMUM-LXQ~Qb?0x zPflylj$K-ecEZf zbCqhA>B(NgLWCp|%DNn=k1@-b?F?1GmvHmx^cWm=AV0q$Pex9%>jRzq1;k9V)TKMIya9 z(+BT6Sca?F@$=AZEZ=%qBcG@FvTzKM_&j4UR}R8}VEz{O+OGeWt$~@GSWX;mk%|B# zw*PBT)){$|zqSxHP?9KjinSF<*+eS*$J5z$&o$fpd9H5p<=-6d^Iz^$KLjT_p8-S~ zaeH9ou$w5&P>#-ZTblv|zn#GJwkK{%2i$JkY)Vpe&!r;zo(DtVJ5L8v!13yZwQ&1- zE%rdAG(SGIw`HRP5A=@jCBKa2rsXygPf0R{v(v2uLatKgTA;nH4Q8>@=F9Msj8z^T zWO*iq{YIx-d%>BpAuG5TY1fxx(qN+_D~G*Y-~vDZvQ;0gWFLsV(OXN8+*E_ z%r~#`sJPO`HeX@W_G&j4!+XBLsi>s-87d?@%N)>wN64foR)$+o*jzK; zMF`Rh3wRA9=WGkWSe9#$me=B0ZqR$p>=eNP3wVpp(YftgBIdnxb|98&0U2g;hl2~a z434D=9~gZ|X;QTJ;Y~dY<}`Y55mIi?ZKP5+s-jGQ-WxR0%FiuOus^?GM)y7MZ%VA~ zktPxQ#&*YpQ*2?aML2%y00%IuwdEGRY4qpHBX~%VgeH1e6JABIFk2q{ZEIZi>t~XE z=R9<2YZjq@%h|ChnIif*(sUVesi$S>frEi%3)9GD#y7Y^Ah3{4N%iU~59r&v)GQ+R z`Y|0RNEl_eiC=`~bpIFpARxv4fmg>Hl$>~JCRx6M`E3dV$<;H2v}hq8kIp-wI{2Bh zkzWHe?~0A<0S2kaSbW)3`y7Bt!27yEw=-k zb1C1U!LxM}yi+0hgJj)_7YXjfigOZWk|{#{psRk7wu2X~XbxLoR^$T7M#_o6^nM+9 zQ*kAzEybJ!D9ai8QgkQKKwwL$+?)H7RSjQ{!gYU~&VJi&!crIxz;Arfx4KlBLV*23 zes2Al_@O403N|zllryT!nnOc0=2ADPZax#~g-5m;Uf#%IxfDtMgY}M%qvihmd9L_W z!Ty_$&LpEdAiW+R$kWmL!Izc_L_>Yok;5M=6mhaMHbNr`ie&I=3{T)<)_APgc7~`l zGX^Gw`zv{y$CP+-F(vM}=VJfzDNM0FRiXJ+?K=}r`W>)V&;}Od2dzq1ZQ#C`ZC4^9 zv^3Grk?XR|^x+M}?Uq^J1Em-U6*U-%YfuyRK{R~la*$+KUm_Nsc5SQ4nV-Jwi_^u4E)Fed*g$&n}ES_e$}=coZj+=!rT=|oQgq8wIlxL z1x<%BjCo2j;PNpo+ze*hpquUslC}aa`^b^}oW!RAS^q4V5yF@3g*ptOa$Sso^Z>h2 zWu)UeC0nV?G`Mg+H11mQHk=2@Deo1Aw~;=~3I-8=v7ILtY45wGI|#O0x(Ghm`(`66 z_Sv8%&L}O>l`8T(<9kz*K)CrfHX+}^&Zi?pEEFZekuS|%U&n~}hqM!kbJ(`P=XoC( z7wVi4AMn|#Q$fO;yIUoxZ^HpXT)Tp59JpK9=mx^AOLc=paNb97vzLLUI4S0xp((M# zKU@H1HI_Sv+vBr_tf#OE&|`n@zs#!z&DZyt<|KC!3FdaQ+3t*|B?nRhT|oj z2k7mN_`~o5QH~rb5@t%UNurvQI(e^tjY;$^5WDH|W5}d9jDI1);Y|7qIN)4$p^^o+ zje=m9pv*WbxxD`-PWKfCzNNOWXK`DO%Kv=3TG=RPNjZ*Q z!^h>ElW8Ic5!t5Ai?)ma!`halfQqjj@A|Ks`?QdXAIniNNx-iI)K~?pI??1`o8y?4bzs{ z_*`55?6?U(bgLY_i~I5DKj3o=R%*s-ip#tEW>iMkOySF9q#=R{!liK-p=;>XM)fNI zYoGh%Tr&YL4%An@e96bq62NpC2~_PX1ivx!_L=a`7c<(*Z>lA zo#m~~U%1;9?ZFA7Bd7CqXXhgPbXdt`4FG~iU8T|!vtUfZ=h6u4(ebs7OxttH+!TG2 z3dpyWL!fHCMV}sj2oRekLLQe?r#qWzw57hXLs%y6RD$CtRm*7{-J+IAL4YskfXzny zr3{EqPOfg)qAc!4_}d0rlrX*uthO6(XM@R}eaDtdAv(m`Nxf-HX(ewZesO8w4m-_Mbf*)pZOtHbKgc0jS1r zLT{Yrv!r7G{?78&Q)7eIep-`&!*%z&xq7R7TTQ?@{XnV|<-XcAqjxP>ht@Xb3V6wl z%1CT&FmH<1Bf$OZ^cvU*L7aNG3{@5d0aAs^>xNs*T`)j+b}v>3I}c3UP^iwL%P`XA zO7%&x#;#?&g87%Uj0JLdcb=>NFg}6ebCe6R33?DRJ*hcdR|9%LvojU6KQQxpf!I59H`%gIiVSiabTgnYnAA=@ zBlh6jwH_k~4y5U){EZM3Y`#_pjHq41DYj?g0mb-0dlz+Pj!Wg7&WPeuKY>e7V=XA2o z4OpLaJ{>eIm=H%!E2Wrxb}{?gy(dP$Qo{h@tvPX-QadqO;tf{3i+9$2!R1_?;`4E4 zsWmf?l22cQak{%*kkOrkEUEtm7(17DGnk%Y#zktfbJyqL_TJ|CtzhsVhfR;L*~UgI z=sDe^bDK_TUHdrsgDYCJgos+iWh%6CNb?)|3)voQ~z z3Mj7*@+Ex3EFv0C0Y{=pg)&E@Io4FBFpMR?v2a*~UIYN53%KN>ClXYqpWNzx4}!4i z>@q!%GBGD1KWX&uEZ5z7eqN=4w;5zQbYu?5F<^1h3exWK-nsk|$Hv0f^38da@xCj} z3#VCAba2CzCrM{WGIXpCHqLaSkz+jh_|0#Y_o~6OF&wHgSIBSUZjiixg=?V)_zdULuxFi*E6rM)}w-5q-Z zW?~F9A8BimQgHDp%g^Js=lVvSvPKkpPNchk0vxCq&Y$eY6BafdWv2~fBG1p}Kp=d- zcme&XZRKIp*?ffGDpLF?(V;>4d}E4z? zc8op6yC<4BVT`g5+_sSV`_erhuk*?(m(szAMH@VYX8%mu0XhgUH9x^G)YWx>WIrwo z)VCl54a%x|@3H|Q_GylNdPMWPTCOL&hM$wYin2rR-Iq8rG>hl~Gw-Q959A=Xv0&by zK7eQZ$zWEPrF-%s)Y<}Y9rL%^Bn{C$NJMh`YUX-a?)Mk0`?+*aVBmkhq z#sTowr~9|1TCeV?!pzj&<>B%gMQPTqxycGB(2WckcSQ2Osv5*{rvoNF%Y4d%6E&F! zJ}KT$v|PAp9H#)Zm2!)eq2o1dO;|5ya2$~uW{Lnek9>X8#!Ru^Ge{Q{=6`FWt7(?i zXWegLE~~n@7qd;6GRKQGU`P55_vok~O&2RFBzPRXAZ1LZd%)OnrOS=E?}F4Q<4&~O z;ZDaaIs(j#j2?bc_+(NFA0T7SY8tvA>wL=UmOonazci|&^msaCIK5%F`3|JSnWgV? znU}4IN8QxEyQ{eh>3pg%xKljgCjr#4=|=7^#Z3M$4Lg!cE%K)gI>WJqD!aR}*rGO! zUWa}GFJ7{|?4Y709(bTP?>~&xii+&TQ>VDL2TypwlVOtt_1cebNSS72JkDGo=1s*5bg`Azwt8*vu7 ziTugpt0zDpPq5~CRv8I+suzQl#SCMRY>M-PyPS(WlV?!g5dk;CWX?zJmw{N`tRYu@ zr)Rw+mlQ9TW2Ka9sQlE{^a9!8o+IwbXqe6Y*X_7p0sv;0ekqoLu}v8%`c)ayn@n&x z$F=258=-|h#sS0YHzgdta_&Yx70?Lg)KIz}NvCa*^0Mcl_8<4!8W=+$0%MU!xtr85 zxXph~c9k<(_gWyZu9B0m2HlPh2u`E&Q~`LcMh0vFW(e~!B&jzvY-De}dSj>Dv3h*@ z;Wgz9N*xQv?hWW6BRyQkm|X>npWJw_-y%2m2MI6{Qb)M{EfP}s`1}S!Z4idRz{Jgs zV*N#uZq-C-hn*iEiq*0vPBl+pqxjpsq_8r$b)MQ?t>yup5@gVex0!6o;R%b)-aS*y zvl{q+k^6YF^3-$KibM7ANL&u@U?iF%a8NJy&wg;~#fp&lWSHvqg<<$q=qrl6luR*w zka7jh5!II=UDeF+xh!b<5d9G8=F^PVmwz&Yhu68?Ii)XBq8`jZ0eD;W9zk6DHc)2OI zGAzggeM(t>`$Ruq_wUbn46Kl==Gp38t!cg#dddtVUvP`e@a&@Dxgip79GRYQ*;4Wk zU-T*n`)57SkgXN(d#ImX5#3VGD#;!U>LA!%3rq!g53QgfGlh7;|CPowUVI8`Th`oN4O}LVTEsz@Z)#OUN;2 zL-EVM1Y{7k3xwwZG_~u3`isQfbGdfgZB~uGw}+ivKAX?Cyr$b9#nw)G%X1D&;iE@K zk*AFchU^Bi0j=`EIA9_dXgQ2f$h>IG2S((iKVFK#x}fr{mH|+I%&mRh~6~ zV-8OoO+njg{XlPLGEz=L==vk%97Cvf!t?O-5J)??2f_}e`>}3=h&mxg=B4H3v$@hPL`?F)(j0jm<_Rt(Uv;<(NhXZ2`GEE~6 zE>Z9Qm6-*5T)aiSe9ilX+v`~5lC69eTM5s&7J+5J?{F*R?OBDd`=*gv?cWqN1uCFA zWWXs~0Qg~+j6&+QJ}?EEgbI{WAKEsp4)rsgh`hqpkx0mz8Z6V1Hw{AqKvidmZT{p+ z_DWYRb;2HEmX!(|gBsJ^rYUNi1TQdhyNJlJ$GL3wA+te@N09-_5nlRgB>e%qE@chH z5be)FNXi|$dahYMv>?;aAmIRckwhNOE%}MhjoQMsVH}_vyN!k6q+s!3I4O{P^%uEc zLFINTN+&BlhY@)lMDF!*jNWS4)=V3NDePxQJZ%zI1Q@~osi8Z(N%Q#G=(kr0G&b8w z4UH6hz;^YwyRux*Lto}M{Ym+hwUm;r_h7%12-9d%?wpP-l6N^X;(oXI=H&DJXlB$h+Z zBhq!?sGcbv4;0c(wvUj&l2nymGWYp|NzY~}-aBXdm;kQa>T}nMCRVR`aO}=;XF9L1!fN_DNLHE15INhM+0VaE^9y`0juc2$<05E z(=2iW33{*PPDls?y+_yVLsnt&Up~!uhZWAU*;W|`})!U!c^Zp^)V*zxrzmB~yP>gv0)Wf@Q*K+=xl=xRBOlxK_P|B>x5 z?vBUy)9{Z{c|tNsf9)M}Tuw9=d!WDy{{M>_*R6vS>!;F9}J>>jR7~?Pgp) zXxpt?>qsK;o z7Qn6HxIuE7n2hW^@d;u)yo8fKD;0>}5})7rELQFznpC9qWAsAgYr}QXq!T@_sh)ht zDmE4o6Hy={CJJWWyOu+Elhf8EXtqMI=Ee}`(BtVxF2XIGgg<2LpLBityu{yC$)80& zrFV&!^w+L{vt`|^m275n{AfV_^*TLG6pGhTc8}$Zma9Zo65VQ7vbvJZ-djy~0c;m; zdTWHzjzUo`D=1~wZw6LACa1lu#=|@}8B^v?9_Mdvw|G(2OgOPWrt7T^K{j1a(4nH z;JOKSd=g3_@7_#R59@M~^58sV=c=L{HhGnenWc5F8}n}q-l}8i`MyFFeVemo$V{X- z70Nq&u1eZX)Cespl9}#$V%-d1* zZ1d^dLxLdJ-|K0d|11QSDhhQ&IQ81J`u8MD_y^haqCuK|XY=wU1Wx_IbX!s1Y6&|{(8l&}`J|55ES8`pRm^xKpmW+_U(3*g z^HSXHSP^;_%qF^1*$T1r=)OF7CaQB{p}v)`QOr*- z^7Wp9U!ZF4!CBVgwRF&oYrA(!0h6GiK9Fu$$$lVgc2HOR~6e zN`y;dBTPbUXwp)3cy5o2$m#eXT{~@HYJBCWf2jL0K737y>E+G$(bG#j3F@S^ut{eZ z_Jc@W`}=n8T}mv)o{YIMvOIJBWC)^;heCZ2HQ<~W0Bxn4^UHr?AO9Z*;Moe_JMY^D z4$543lR4?)J1`Dp047{hru#iLuML!wGn$+Aoyc6UE?lXHOqyzN7Cu2yPww5AmR9YLUMov@5@{vdHk4Y9vL|4_yNFlhgJdwM z;78cu3I?XjNfLr!ROd4E#*ApiN|tBQPP1-n;~VlB;1g7?@2yw=a815! z;1yVBH->C)$*^a|ubr&*e!KT+t=8SYD*EgV*xdc)79#YD+XtLxFNa}T7cqJojARt* z;bmT(o%65o@=G(mP{kloUpSHB;B*Bf$_utG;D$wt2g<)oa3I z@j4iA4}Pmd;-&>btWYTxOPxQOXMqs@fJJRd?y?lv3ZjJ>4p3dylEU?_=#*}rt5>hC z0!UK_D)1(*AgmtVey8E$t5ejcGHFS{ErRoCsrM^GS*-})qUhg4y7c7%ib#u0ldi=)D@kb)yY-pCP!ue0#cqH zWHnsp{^UYA7$u_Gxf^N6&bcTf;A>(_Y0Fr$mq$L@Ja#`V_CyaRY@ifpxRf$kYH}?n z2t-Znl;Q^lOU5t#uA(foFZ;s^E}b)c&>@}lXRipBeb4il@4?CWS7I4z`F?WK6BDiU z-`s2$dKGeVb7!^st(Ja2uWbLIAQKz^pO<5exBCReae%lY&;;Sd$liqf_NZOZewy&Y ze7MPjorAV<2Qf8}QF^r@lFwy6tPai2N3%Uy@o4AO`q21zxg_3|m8Md&lD8DMssp&J zp@a7Tay8k$6cq=3@KHo~Xi>A!#q&SZlWd_mn#-2mrWJ&=2UO2?E<$ENUKUj}7@Z<{bsUl3*0u?Nl8m)k3=x;Sm z*VZNn57I*Qn(MP3f_ud&F{*inA!RU}$D#8RFIvc@#B{KzE#PkJM=4Ui*^glpDeqr| zZY~ZmZK!#Bd#{2@Q$4h;8P}#;A`=rY8x0g>pdF{8R}}ECC9b(lgh=S_Z?EV_uNRy3 z=iN&30KSAIzx@)mo2jyLw`PmnzD8dgOT*!!FP&@fSdDKZqSFJcEcT6Uo4ne=VrxC% zc5#^XbE%ftd{T`BvVkNFYKj#D`E6Y5VQLAjc5n07O-HaCo&>e9(0A9L#Ej55&3v!| zJ&}6u9(AS3HDZm&G<1^)W%a1^4p4PCK!b%du>qeO0rC=QKmY+qw$4hCU>2XoySCV_o`?LFS!Wv|@NftfG)z&opw z(cC5xou8DLl6emP)DTVrJ0_xV#PumOq_M!#O4ch!#*>xH|N;=e0=CkllUv z5aZ_cd}hxvUs&#cTh&731SQgw0)fcH4w>QA$hI8LLKR<3fea+9`Uk@zeR|l~?T4Q5^2Xp~W27|PMLn=%N_Nf4N*3n7e7D5o%I=TsW)pDzq%;bGZMda5b*1h1 z5C5hX#C}0?mhxgjZV8-=yeMH_FTg3hEJNIj8tGRS95xfp+QKd}nD&6qzA9hYN0u?Zvk^G)7QKH%m}+8l9nLzv7>El{De11`pO zi2=V8VL*OZ)Us-p5a{^&_UDplF=HbkCwb$p_{X5Lr;ks)yi_WT5ZqjRvH1JU;8F

E(YkxA30yuj+Dq@I}>I{pT+ADtrbsAD_=YJp)k0raPvEj=M@Q%&y+d)8h( znvs;G650Xjs^4SbwX`o~dWAZy%)5mF?fLIk}>B#b(KwH#gA~|BYQS{5&L76~f<~YdRVN2bv zz`UNU6tlHB{Bu*GROc!Mo)U<87><}Cw)>%O)+!X@YkoY{N1S}$9fyBFtpi9Y_?Rf_kwfi^W*EB zLAdN?t)~qh!G<-J7_y`?zc66cAcbrV9*SXD7l%G-7n&hj;6>d$(#n4JiiPe}r`H)p zE{X`=&;DnO8(xk`IR^&DeGKHEV>7(whoDqxO6`h{~se=xQ{>{C>#>a|2;H{tHSFyz^yQ9s zz}#rsW?4sm<@}6FR^?#{PW{ZPabNL${|ognI?*&@tBaoVI?*U#w-F`l%!*GnyNpOb z`5j*Un~*;8_a`seQ0)}wKq%X^xbod+v$y=^mgane9b2VK zsDh$mH8#ET6BU)Hh;iPby_X{uE=^}OvdUKdz{k_5L;P^Jr!uE1^bYn{DDcQ7IBe5| zXZOokdM0El+ag8-hL-JVYx&(jA}t7%2$!l;VGIT%si|1%P2_BNt>Y_FC#~zfQayu& zLl`^=I&uRCMXNr&NU6Qe#ipa&oSb%^EE)m3D7W`KW@<|#+|+B|N#*K*&8YV)>eecB zFk?a#U|Q#yxLT_l%--mly_}ewtVf=JJXhiuO71^>7O73*VE`!lCK-|b?C?mcOf+~7 z--3027bJYx+ec#Q8t3`P``Xw$`U_s80r&Q(01q)R{_`7(*G8@uya!V39Hruz=eAoNpyTL{joAtm%n?#PEcy#6FJT%*)3dNxk* zrSfj?DZ)Fg;U?`Q4-fXXZdZcGS+u%U{Z-{ciP}J#@eWAC43I^*UOq>PijELA13=o^ab}<7qi`C4WwFy6$gpuLEX@?zE=j zF;y}C?gKPEwINyPe90<-sbfIqEY z;+0E1}=bv@dvl2AzYX(G^TWk9Z z&_+wdlble|R#VXiKT~1ZtE}j9!J=vw64~Ueu*?HQ^DDAGjHwZ*lh4E_6oE2#J4xab zq?=K-VtXG$*!7GInpYCbUP9fyTJ!6N>vJ!Ot5~MsZ3PS8ragQAHv6x}yB0n!LtpP3 zgcH{iyb6x2JGbZE29(n8sUQKPNcyq$&vzsniWRVD+vtS{KfS%Do&B|K9u|%5eTloR z@$ft%Ij{MHo1Y-pR+;Pkl-pw+#5YAj$!GPE^3qivKaU6@goL_(>&;krRM`)}Nd0fB z(G_|emPw#QcVR;NqpCF5^PbaLz;x~^kpvleBkuN(q(5=#uinAi^{C**&^37PgONeG z!$SBng8_CoEk;Gw-0)@hC)wR@Y0*b^!FhoORFOK+#;qDyQo{wZpu?J4tzZDuUfeaM z5GWSvUlTKI?jFE|-;2A{0`^Pc(BrsA#bx+sr0^7b@Mdcp{rVBS1z}(rTz@rE{kiLB z#n_FyhK2{f&DwH}1&}E+Mj0DO6&pdbYchbd`DT)J=a(mPcFV)8rFM&}i`$>m4;l`e z)_Cvv`7JD%S_c?X$lPOZ5!^!WNOdOO$8`kZ=gHuE1fSOPA%A06%@I3;Po+zH1cc-W zfz@u9Q`BkbW7RBEVJn%rj1()>P$jLi^2IWgk$m$YLR%VYG4R&x$>3|EIq!a>JHGO+ zP!mVL)zRAYN>LB{vS#p+?q4rkCLDgoN5t3h6EXGJY|8szGnb7w7y9(C5FaS2HhM!c z!cz=92-&muq_@hTBc;Dib`Yu}@wgbQeJ6S<4{g00zdoxv$$72uS2SmnA)$cX!p#=o zy6Q{%DvDAjETgpvA|Vou7|9f@g?l42%9Ozws|LpS29d67;G#MK2`p zr7V^9s9VbxYeztaLzUj9P`LgTgvK-fI6whYfwKYwXR~&eD9=ujLKt zb{M~DS{F4_vsOGA&cO3LU?ft_GluvDx6r_ zlT&-7M}rweBvE&52!6L=a){A?atI($NuFu|`6U#6*}pE?@GZk1LZgs0h}|>yopZ>x zJyfT_x_pV}+)s8oQq7;!C&X5w&Q4HdXPX-}N~XjSE}D)Phpnx_xe}hIN&MIAo`>NS zx?2Dp>X#{Xsq{^*$r$xmK(18s#{gPh948iO>V#kvzIM`dP|ij841)YV<74ibaMSV` z4LHID-HY#Qn=^DLd5*E;x<4v)cT#Axs8(1e}6w#H9Rg~=C0eVf! z&c1p4`^kI5-J2^>4+Kw6Y;1% zUc0ZH|Fc9;Xmu2>8}FlVTePUDsycU$yE_EHnONEq2-2Yu5kF3%(j0H-`b0tn{3>0z z#%!+=zum?%5bELPkxBnV&DTNLfanGVOc?Nto&TU7rZo?Xo8tm)&4DEIGezzgP_??M zo%mAOO?F%ak{uaqlS8xhO#E$51ULZ^ElsHZl#uy3d$&;7p4gk1CefwhXM1l>8=#mm z2%-fYtVZt=aSOj(cxA0M@%ESvs}&yNQBe<0=L| zM9*^elc2xu9W;-tV2|P+e}%|o`*cTb%?lo!Rq2&A40m}oGV8klzWZv2l`(WCfFF3- zkK+eukp>uwU;AGzio)ridw1O1F%aN4SxjR1LjCM(!@h*HNR!o*nhtC}s&>p+`;b3^ zb9Y%)vXEZz?dJd;SJJ^)Y{|j>J*cm@pl5_PdgJ(m5W+s_kN1+N)2eRwqMj{=cUh2>AYP8{{R*ZDUnzD{9T9p5Jz9R!u<@~pw~pxQjDHCUH~dEyl?sW zm0d+}if&<_ffoJM><1rhl-tavEvPK?r*7O(4aAGpB0XNipGV$|SI8IYKEeWD!PxGg z(34+-DK+gNb<8;=(A>8u-@G-9aAOYh{$S@JW!nJ?9cP zDw8%mj*7(K=kC_v3gW;M=u$=H_lF3%p2A*9@eb5Mzl2Tq_`zRjp+kIB91mI?BSDvV z$B*ukqP2$=79vlw9rtNkrDauM75GXI>t-rmbU~l$pB1=k^MF{lm=P%zbTFmD2f=Qd zS%x!wmp{dtJ@maGc?Oe%e~W0gZ-ulK+NJgmVrNsKuWEY;MTCYZ7`mWPvwQ~U?6r`n zK$D$z#=ybz%?k@gXY!M%ZH$KxD!4n)jca!fT9zNpkW?qemkhYQ~zV6Rl(w78#sQRNREVL*a1)p}p&bEgx?UdHSI_v_`AaVGo2a$<*#U zYGI@3PrJN6>%2qL#r_T!@Bie?g=)t+}e?sE;kKb7KI^&WGGiT5G zhdz&2`ERa(binC<5l(t0g2tA!lD<268z-#X4Ki{qB{qtsK>ul!@XoBrp! zH*l*uK_o-XH}`pz;dsLNneI4kkT~!pPe>&61I?AXic8RZFFXDUESMDx*9vdWTZXPA z!d_TylS?d8Ic?wor@;MCS7cfi&g7DSI5%(2MHw4UPKAXaYx>iUvfRWg$YRR-X0aB zQg8|Ee3SQ{edB!VWbxDIyly9SOXbJcyx|O*9WYbyw7geJuoJ6g+f|MYHXxXJ2~bIhpB>0LhnN!C*2&Tbzg-j~^d zyush`&kd*p`rGg4#6Y*8L7^UwpHvGZYrYM4c*GYI0^l6VZIyB6d7kdO4ZR{UY|KR# zi;=C0{*_KY8H3hv+p{N6-Lm~saAGosmlm$^fz|Mm$qw(tq0!@fL9 zj`{E+Dtq%#M5wy4J@2)~E4t|haNuB{an5U@e1TM z5})(Vpd;Wt&M_`uUq{}NfAts5J6=qCJ8Kb^L0c43)P3IM|5r5R%ECom62k=55VGA- zJgw~A%Kz%u)*z9vIsWJUQASK8JYI&sN6`>-6y58-!hA~f`H$*hx%1{nOTX8TqakT6 z19a`p-P(UlN{&$n!8vrHK(ZSf!ysFUU0>1RNAOs^W;>dZhB|7o1S~K3su_t^n(NILU_faMb z19Vegh^B7(aupPt4bad1yPHb1G!LF98An8~*ef&Wuo%2tB;amVwgRyQPNc?-$@%9N zXWW;MKMRQ|OqS_m3ECI>He#OmJ$^{3UES7sY415FSbewvV`#3*CC;QiCXnJQ&Flr7 zHsI}!F2usVOr(H`ZK(K{^`eBiG(f4)6j>yY-l}pppxPLfnX%^yMAA-sd{JTKZ8#AB z&ovDce_(M&1P^m6z2a(fdijoC2fE$`AelUF>r|;71uV_W1S>xH`&`b-P7yaGe41C_ zaJsS4bdBPf-#l$Fvu;6uQuHsCA@`HIk~l!n_vQYdE7Dq(?RJ4J&cwp$`&jsxOTSKh z;KEB^+gDe2Jw+0Z7bEZge=($v7ejos(R^N_D%){5fFBr7zRbKj8$!#^M_PZ3;<J@v?;eds!HV3DNwgIm-UyoQUPg%}dr}P$N041WISZ3Ooq z*9%RK&k%mmXPol>;PWNAD{v!Sn!_yzx5s4ILA8Xu~vG=C&Sgvi`_|;rAr$UCJ0U63rW=bV<<{?9f%$a4@L{vnE%w)p3S!VBcUe;Ro{XFmUJn#GA|NH&FyguCbTCH5ec^>C+Z2Put`?i-l z4{oJdEPFe%yqwYk!d|6zA1#T5)77SNZB0P=D1O^jsC}kGU+0ocle%!B?DN3&+|oh zPpTGBM|E{mKG)?W8f8i9!q&sHwsj5x@6)ElB1j+j{)isUov=-kO7K3QWBBq_&Ysq> z*Tz**jQJM#!_1Tja;4lS$}%~Bq2Tz^drAZs z)aO5i(O=B3p5}<`_N=Mu9mi@N*z?&INMp5$-3^{D!R98BkWgOGHppq?dj{4f_vs*x`o^(b)PTtSrYX2f7)MM(rdwN`rK}wE+8Pt?7>X<$7sDxtKVvAeX$nQiTm>4*gg_ z>_YjLJV_BdC8HE)rzQ>^oey(AD0C$9;dT;!VgD=BHSe|t6cAZmz?cD+sRxS7=A-0awL|MAsZNF+y_pEXwloF&cv+)*h! zT>oZ~^QMr`-tUwXqHE%k3ycVnx-LyU^I49Wd)%kgi$3qfwK6mcPfJTn*XH=YA1luu zF{QfIT>bf|>?MnqXQ#g?=SYI{mPyzzFBvuaIg>VwHvEZx`FdXX&G=sLeRaCtIYU32tB1^e z`^A@@IIQm@<5BEJyD`4KQ~jxy<}WAn=4YYhTP5 zA{Av>WVa;hdWg_&B6*qlnGt)?svLng;nwtnwXdp)%3;6G%9HC%8)xc#Nk+5Os`%O= zdwNBYyL&v3f^TM<5~6oE9`Fo3A8;dvcl&9hv7ocruJyl_O53v??hdu-u*gO5#$UhS zxBg1RaLYY!H1b7ktb-&|+T2dr;PLzWbxZeaha~>ljn1(k0Tia+k2~cz(6uVj@|m&Z zntk3`^;qtKaQ)H13YpO0`Fx|Auqtr!XP6J1nSXVJvQ$Uocjq3@{736=1V%r!tY$jV zo|!t7zwF_9{|ug%AmKmK%T?Oe6M4xy+yqRG`yHM<6`3Be{@oPwEwYUAd9<_7YVMoF zxJuG?S^)up#sVqBi8YA^OAE8vmhH_H%S*#QZWCHh>{!i($oZ%biyL-7p@9#SqF@V&n z)_eR3Qvb_tDhrpK@h%Ufoc>$PJaJ;mrs%|Qy}LnBi# zL#b)g;czie(JdQ}sPg`jl?APT8GWV4o3!dI;N#%M@g)9$Zf-oXk*}dmgh};Tm7R5I z4UB~AX3C1{N$+{d_?yIJ3iahPTRATbN~~;bk5_dC=bE=v6XJU^R2Mygq37k*?%Mrz z(H}}<`l}!knDFD1QjJzTgC>^=rf1jB>YY(ti=Q*s1cGhj`uk=3YQsOfbifYBYPzQX zpub=fqy`Gc7C6DGs;Z7R+4a{Y$pW|Cx%Y2iLRoCXzde=WJNAz)S8S?Fv>Nn3t@%Q~ zi7WQ1+@CH9hVwhgfQ}THu!_jcOKz)QhQq|D<(Ure!KhJ~vZ^1Sy<2OK$igJ}y>^R2 z%X--eW5A5fPFDt8mR9;^7te{2XW!0_kA+bxxo{F-p}WQ96?K$N$dxfN@caDzUdRT6 zAl>L0Q@58*T^o+y+VbGwU*GM@yL&Wzw2Bfpd2qpLwro1`v*g#}pC7vUR^JW^y&9KU zh4GK}ZV`&1crTU7k)}hUBEQ0&dQv#rAG+v*6m#S}Z`?-nCO@}Ql)lcr&CYtv&8$D7 zws%>6UOHyq@>QPbu&|>kQv+-j6%|E$S4pi@-1}|!uxniCZb1VWm&tjJtAou?xvzEz z^E^$cHqlH@%dz;P1mlTuau}B$=e`pbaR)F4;-`b9=kv**U#G+D;`sLUlr8gUEiKNT z{LI#+V!73QRu0oA0hp7;)ti6)Yr}tdy3_2E2{gd|1_vEWw6nwA)@e(gVZGPITxHhtXuYD6_pBD8 zZly|PWn~R@0C*hyvqnKgtxlv@<4bY+1qvsNlz6X$D|E_s0Z6LJbaH7)k=fbVva^wd z8*coh7v=oR^~Qa5(MNS&+DpwjBa<$1(<9T5Lr)U?9}}16;81(P^&;MJw!*PDHr$54 z4JKacyt*s<2u0`KoUfU_+Eb--QuTE{k>(ov)Slj3<~ZqNLb^cXkMo&C3VawFd$nv8 zl9C*x>nE0ksBGaHl=E8uTnDkZiRziU#<8DA)w6l6?O?KK@WL5n8?l%cFYM5ADST|o zX}sf;K=$P?W}2_`WxV^VsVQ@|w^qG2eo~@0tgP2Y_dIrT$hKgTKP|fF@|9(D^TLgY ziF-On0^Y4=TOp*y4?2u=i1d!$Yy2+9#(a%*;ylK4VncWM@(}$FeiATjq5R42$rg zEOa90?YAeJbI!#SUioA7CC?#!AxA%&YVYolmz)pu#Ke}CqoOQCN3U~}k4n;=MA(+! zBP{hWwqW@IXKb8-U$tK<;WCLo>h0@0AKm7hZ96OdrQmwDoCg~xYiM|^LfFs{9S-!M z-<6Yb+t%}6>P_37onjL3sru<5j*E2SH#Ll7-`)4{&|6%-9$qATE`C)tlM?O>X@52a z1%;A}8#XQC+2*CgpKV_STXu-r(`~_m4uc=5MYUd8J%z7H5~p?Wo=)I-%h+i`$0FTHgX{Zzy4usrU$Tv) zL`tr9mL&ad1fxURZZ+5YW5@8eFe5Sclh^%&3P72UFPa{7H0cLK@uLUJ&Bp!*-o(`#1s{`F8dzH}H2Rk@aogEqOA zczZ9C29jLOnv2zQ4ucg(4+uY$+IPb00msGs;JI(VMP3lukIe zB?$*mU!8kmXV3^R#{BJ0PO5t5g0&>p`Pm6+vHZyi8L`UAiOqk_Y$l2KV8Q9Y19YLQ zbDQAL{mLDLXGh%L^h?}3Ioe3Z#7?+@;G69=7Cd^i=9bYUr5;CEu3_cYFC})7_CG&f z_g>8&5*fK~`A^)5r>5IUb^1hLIi4i!+CrvZ3w}_3C&VE9g!4K5*2da6(d6vx+}GKb zyXs$ct3=qCl2J7Ao21Vtuhh{^WcmvlN*h*jB`ngx zaboO(wUT{p%zzeM@0ZuEoE$TnIM5D>iIv*>unJv7A|^jAxD^tK+hm|IX&kAk;R6y| z1>R0p7+|^mXu2ngPsY7cf|K5J@f9MT>!(tw(61*6Y#jXna4;qpetB`FGNs0!q76&I zwBhmXaNS(95cZ3C_txW=O;;2g($e4~L;vFvw~j96W0&B?N5Y5t7|L<62kiztO@JT@ zMY76F=VEcY!dFBO(o#A=l2W=F2XQXstJ54Ieo5Tr1NKwldY&dD$u;+hQyS*3!^U#} zC;=HduR^_vH(l{elXjYTo%@`s?DLNJMX$|ltgL~s9z~dPB()=)je@b}C!rcVT)DL3 zH#EK+CclHRJCgVa+Z+#Ebwa7|$leaH>?|qfwP-!IRD{+7^2TPl@@vFzkX}0hZ22pw zt7Nkt781IMrEQ#?TiXO1gQ+;$Oirx8BJyATp1x(@iTC5ZH6QF>7=K8F*HBfI@HLDz zn8K)gq&?3vf!L+BdK!t#n<~XV@YqT4`Y>IOZLqoli*n6ie-Zh0xMdv)0O>J%`h>xC$a6nYz}!PL|y@2moa2i56(y<4<*GE zd3qY|%NrM!NUYt0hEs`+YP5bTFmjxq<8v1C;aIt5JK}SDI-UFJcZG)Y+dRgW<#UdB zN=f`aTw1GM%cGJwesXvfCmHj8e}q-3L-=aGz%CiG$)kCVuU4+vZn!zC;!pkcg%agp zbvq;^6zT1?ayR*n%WiGT*pQY)*tdSArbr_|yay(u(1iszTEJN1Cr~^!d2$~-mNce) zZRVLF@9yu5%$CaZwbN{RLOWzS7hXE zXGpQ#y4FSusU!811J1gKNity(4gx>pZuY?N7>w9& z-VPgS2a&Sp(T2kl@I6)o${mEykhfF_p_#o1Q3*1CR+wDfPu{BV*q5X|I~Do|HOS(~ zIMP?DaTh<_VM9B7(LFi=B|+F%yWA#Ub|ET`9k4y{kWA>KPOOv8d+VRJ>@aMRdKmbN z?`*NR=7kIU_1vdIK0UqIqP=$*4HLIBmr)kfz<}HPo;e^G+qe|4g_2nlaxE^1F3lJ^ zKLogGMzEPrx z6)x(`_9)*yT)Gw>44w;P;@)R-^@Y+AXP}DeF{apq(RE2#LFABfvh49UtSbwK^rkUL z;!2c_w``2CCaT@br`ZNuGQ$86^+XpZm1l7Y6JhCe6}gHXV4Mg$6+V0}Q|8x3cI@Ij zVnjuvRC6KP-0$ByBD6-mR;}rQMUA&BI(u?%5*Y(Y*fEU@mA2G9L0+R?oyZ^Ui3u2A zYtU;Y_x}7*DD!?mK>^F6!FT7V0fgZ*TA*6Eb{YBcEm4r?q???tgU9 z>~lq0M0Ag6Y8?wlo0QrA(A&_aSq;aQlZ1(nR67&>VAl^vB9)*Q;}1_Z2~q_3>n1oQ z|DdS=nM#>(YyxO5#Pd>H4cyiHOYLy>B(yoqh)HtFJ-JuytfYGBf9z}6V7*SgkATspOv^pFHH)SD$|J}~3|I?h% z()L;~=dY#ab;)%9*{dZobf3?z;XCfz;?3z=wQ34n+P;0J(@Q}t71x6mv z=xyIA$OYjh-k}{YkXy*cn3=0x(;RZY!QQFH~T zs+DI0WR{dh&G8`zZ3iuJQ{EEvim$Lo5Xl2A1yAiKuSN&>x6vmw z%?Z)-;a(X<;`w8{pslUlYiQuKH8=%nAwdrx8tSGL1*+#P1cWLoA?BEexj-8Mti6uj zX43z(5acokR}C+~xcoMSl7b>FsvbQW0;Axy7FafH%(Kh>S2HKx;_(lnu^`ElYb4^w zzxNh6$SF$h$E9nL`)CZ>i2KrO(k$A+j9|O&8xiD|cd#m8m&ptWE#^!+l@NE1c|#i6 zHF76|pmet0a6FfDGoDW)m%;p{N&lIeb*5DZqt!Jd7FwJ=k>6t6p|#Bk*&4~dlwzd!T;4PFQB%KpJ61(N7q`tns+snf( z(oODiS*SvcsV3ERohvYbHpi6Nb8%4b%O!Cd0#k|iVCIHY9irA}mVLJDJ520Ez%v~S zV$phnZ_PSSpvCZOsX0H<7DO}?Mr!2&!9Jm(IXn32mkwzzb8EV(`QMiQ?r7e~)x0Mx z`Zea!lgPp`brX;I47*;5HWF}wRT@ZB@Y|bE;S=sJYjl^hsSaiZ3-rQ%K#54F?ZrWw zn00;a7hbI7I}!gMnfCQnr?%RX#0#Q5<^~$E6QrtVG7Mf1&N2He{jA^z#jXfrD(Kau z*E+rlcUlsKT?I2)f7zl1@uO_OzLRy6VxN$9yx+X#nNh;3O$7MzdXN517dMyp4-U{o z*5hIAZmMbyutZx#>Z?s)4a^-}=`ep}%(PfJV%W{La5!P=7Ba%+wu+KA9^WFGp_R)f z%Cv9r`enYW9beZb6Z6ecEK+VEa1lRva^0~3)23wAnS!(%d;>+v#Af=QIDqRtmtI6U zbvTb_dM?%k=j!EKMKAnzDrJ7X?I5`zWU|CL7qV3P~zDL7TYe-sPA~QdVP1pp9@T3ouNnyHX=Uj;HM&ei{x?X}^ zhA>0nFfkp1&5dKY$fUTHKn3!G0|zIBiqpkCGY>ubL_i|s8h;rq#Eh7GG~CJ~=ReBJ zfMRBK=e;)iea3KSIqPx3Sop=uWpU|05RIHrET-0&2H$Wuv>0 zMpW|YjsTb}+GMxEr}?$(gx$qHJx}OZm!hxazFZ6gcM#_rH0PLf*g5cSTXg#zcNur& zLq#o`d(~(W!QN%(P(mB^siDIDuV!B6d!`>|$yhWpBqXn@DA%WYj;H3CgSH<}Z3u6ho||n2|7!MBk~+^W!yR!(inD;BvaIJE ze#ZM$BdG2WVapC7AN*d_#fM#R3u@3g$AJm9zS=lqZP6DJVSY=CX#l;I$CLVU71YA* zwUs}KhW*n!z*M|7t-i@4xa66x6$?YHM3~ zKWcuEw4R2~x`C+v^du$6KMKv3EKXmX@O1C|+yXFlwKkw6RF~xwWsuQ;j+cn*G;g`# z5wwEDmM#uoHFXWpMhzI=k}Ma=-N=A7XXth-=L`s~6JqFJy0(Ah4>rWsD>)wCVY~k` zs(s?O{^F!y579$%nyc+dL+lxX-^V@CA*N$U>!lxVp$cQyG_YFuSV^F$UVp1+rx=RE z#pk^VM20%G=IeRV85%NX7oZokKNj!T`aDE>q@?*(l;PB6q-a~7+u5)+z@I{yL9San&F3&j^?}~c_YuoV^-_ zg2`_cmH>~yM7^G$CLAt%o#o2+4wwY&)xGwHJ=5_eNW9Cs(5;n#UK?45nAfTmKJ|gbRNo8(vlv_c5d+5Ov8kRtAK!W$!HCJVj&pu zXgw$2$0tr7RnOIQ{xsxkb^aSU(-(Iutl8nRL%E;8%}P$gtYq9QxH`)FXv7Iivm3N% zcz!mUAwxwOtAbI7$QgW8e}f2SGggVru2Fh8T`-*2j-Z3$bj22(n=x~<8O#|bUaEgV z=H`iQ#mu~p9&xb^F2CcLTYeVS?pD{9=F#IZJvmQ0_T1YY`b_9i=< z&8?d8GWOooI)H#?6Fp_d^n?d$_8*kz4G`en{4~;{qv(sUuAJd`m3FHu9&ed-Y&!?; z=pXN{49J{xu(vOeokN$VB0>%i504QvgI4F;@0;5-FQeQa8$g^HH$#+EB6Ck~e}AOu zmPYdHd088hnZW&P7g$~d@^2$;1bJf<5|C=K(Sp8FYp`T+(B#YO?Eej;u4n%jMr{Z> zW6|H(u32OBj*5y(MId&dDaGzPfu!$b$Z9+F2r^r&c-^cuhTC!_1h_~Ixi;PBcn;>S zr{m3ub7;Hk=hrwrr{yhW{>q#TEs37q31a;Gha%!6t!D2)&+>oWf|?XgZb98Di!$t} znAHQRe(q#fO`h2{Qczfx`E~6px9+ddJzI~mvv2M#BAsdapTHy&M*^>TGdp7DFA~k( z#wE~ljva_V8fP`Z01ezZaw4Y^C-NUH^*p=T;fMEvf_83|CoW~+!~gJhB(K+Ckp62_ zC?Pn~npM8gj`ktjg;6m@t=A%Mu&XYvz{m|FK zCRy{*@?_HeE$sr$qF`LO^`ZZIW%nPrXB$+c(w2tF5=nJULC$j0uV6n6BKL*hFT{NV z3>+J1NRX^~qL}dGx}UvPp>5JoTW*c)A5;mAl?+JcN5@O3^{>v-(%Em>Mm0S_GMrg2 zMFbs(sAFRwa}rSAKg4VfiaaK-(M9NrMJ6QTg|2;Sx z0BczT)+2I~`%sX-QFtogw3{8&tG0*Oq4clL$SPVIGyg>YNtsosSJ? z?LUQJWlZom{8ACXJOsH-ho?|*$$&$ecKMCGNM>S*GbjF>2>!q5ZiKWMt$BoAAm#b< zj|=jpPp%=hvG-)@tlYbn@^`~uUpkm8`^%WpJiBpYwKFi(k9HyBjv{Ac8icLBSp|~& z!WN>N`6~g_76vi0EeL9CMBo+smuUOzyE;b=L(T(ocOtP^OfU6frH4F)Pw3XBU6(;> z++Q9B7Z!%OJf|>B-DD{<-nSG@h}pn_#kwgNdch5JSBQ}iJ;*{}b<#xyhQjTHI-sGw zeJM;tVe9lU)PcYw+be;~dNGLP0lEMmb*lfV>y5~(#G*z4FNTnWKo}rk?WVC`v+~$X*rEc~`|y1iGOnf8%)ab9tAo$?!MP8Ocjl`P zS2fx`CQ36m1h-_{_DWB@lGrAqf>Ai^NOLx?6;NgpS#J0~ig4mXfVClzMb4+lN3*%P zZ_yqs{1Pb1zzQ~#M(ISDV)wULiO~YzAYXdvd5@xIkRr?wK|FmjH-JE@@%%CUhxWx_B!gsr?H>r+O0a?nxv(ufeb;r@KF7!7 zR6MR5PyKu77_~3aULHQx;@HTg%3aKmXLTjXN!Wa!Feuo=?-P30@_tIVe!$&*@kc6X z47Yf2vD1&4XH93+>aVPDidq!oApTDF3ld4&G+Umti|EY`U-dL+*rf~|g$M-NBr;f! zeV66Rxe#lUhCas+QS(24`ssPhCT$uC&PDq& zjqtVS=(THSS4Uq#F7ihrkG)v>dHyDCW3!#G$e&kaa*;$*s~RsbB9rVtK#$tk9Z=!& z+DgNHYyGNuA+O+y-?D$^voBtlSV!8wxj!}ao^Zk{T@JBXbVOH{vugdeL0+=)974Le znHz(Xt_Ko9mP^$19M1`vhnJRK_Du7!=ib3n4!peX2)KMS z9!zNStY=fNhn&&MRw@^hE`Lizmh`eCiPGp?azjhAqJ^1l#~AqKM~dsFa_wpOerh)i z+Ip1RP?Annk-PGVg9Q&|kIDYClHpQxpL=nO?kSkh){MvOqO7BH_@sDPJK+rtq&@R< z^^t-OX{_ZcG#sC)DC-a&(s1wf-lMycGVLHeL?})L`=>og*b(aRH`6wW3d;E0qKrLS z;4z*dv{Lr)cO{xFYfY`st&yD55?mecKb|ttGD{*|q9nIf5+8-;!e{!Sffx{*3isR9C>SS#*|sTWgxLV4_KE zeo4}XhxlA4f9gvco290J)m8qt;0~EfXxVKF_V8;k<)BGQ=p#PEIU-xc}voRQ-C7A3hHXoscczF za!3L=bw5n%zfE0$cD>@tTKV*!Qm&6%-cvj)Hm3rZ?X!u)eu2rR*#Z|iS~16fB&rs@ljY^RZy6cu!aa8 zeIkNrLD!F_-qO68`q*n>M_hnpS!L&6EtywO3*$;X{1ACEvfqRz1w*i&6L0&Ms7-#` zz&>Z)`%5uHhTvf=Zg9;hKWtG%&_gJas7?$x)Iw9~ioOi@!6_8NZ~SrP?pgfXmBULY zR{YzOK~f403E3Sh@Ax)KMHdUEbj4vrekam{92kp)fa*yqD;=FHf9#dGd(R$0@*f{0 z_l>XoG5%Lv7MeuyKXhx)^$vNOpO(B!AxPs z51eO4I=<~VdA;_a6!!t2e$At5L;N;B-U`g0IVkmRU+0QObis-Uf?oOgfB*dd$8}IW z@t5LG+J5>r#qR8Gq@6@=pO6)ZC)=LMAE`IAnp~6PU+7MxJ$Td~B&cxP$U}xP1T_E3 z4@F&0#zroFa|ky0S!^egtAN3V2tPv#A7@@cIma3HMHG5 z*JAgwYix&zP7e{EfzT>*G7$C=506N^=kiiKcsbXMQlpyCk04n`p&i|V6V@9luNbds z!<|kttOkED{vgd!^3In z?>W=uV-0BB?;`(W>^_|UH!*A64fT)dvwgfK+uear3$AZ8jn_q`rsJiUH|;<0@-gz z5i(?nG(kjrSZ!2IQ<0iiRk^-(!tH0DfVZB@^icTfGqE0XrZXtbB;ZGw&?cvvq}P|BHN7NVjn*e2}Tg{q31bs*;PWu_!S)9coN8aWFDP){p;Pp_06m4yd)>iN6EE zRdD{mGCbC&ajwA$yRQr`r!>88&P5!@iEV(1(Ck)OZ_j3p8Tvl`qzR^I<;^~Oiipxlb(6K z2)8bPo;KsI@^ua1#zRgs9{;$bf^-@+Q5hsTC85ZLx1lG)NvAC;PzZmrn15UljjX$4 zvfFckdqZ{WvBq2C(oHG1&^JW@R`FHlBbC3~+tWJwxEWy=TV3Y$xjq;jlVqe~yGS zwWks9(5o;h`loWycR0g70Tx{{=t2eTU!Ni?+L;P1LldeUD zw+plgXt>r(D%M}o{MQ~kB$=@}8|zv{ss{p$z|Y|iQ35<E=utORFH zi3z%+9|)>XHHL^Lq{bu*~aU#|zoSf4@+!G@;bP&Ag7O?BsEB`^8g3#U@KKZqe30Zs;$foe>Revzlt_{eDZ`p%^ccIV7hK&e&?j&;>z52N zSey9s%urjY%|Kl$mpT$1Jl%b%ck?>{v-sA&7wrF9j7<|E9C#7ZRQdXay;xR0vQ!Ha4`3ulGUZAw^t zLai#BMUdzu_ecGiwm|1FqNlj_m1&f?Ih%msA_kLAr|M>7Kl~Jw0uST71@kk;n}@P~ zoX@xs)I`uBA93w?83b%EYqbc6MLXAhiD6xDVi4CWUdD5LW@q|)5Fi{M&KA9;IC1>m zBvP`H9dHnrNX}pF%MC(6hliLyRTaB=03 zG($)7z-dwCS$x?^(5cVu2O2R8Gc0NQ8AtJXFQe%s|J-0j3M!e_g&}Vws{T4zF5X%ITv<# zf}R`R@sTxcmYwTgCvKC$)cx6s{*+J=SeB$$-DO#S*kE@M3~K$f+3!C*I3UqzXz)3R zdXKNA-3g1mzPYIdRMaZRwwure1L>6K`OU zZBXHN3??Yb1d!AE4!dp0V=tTAg)of0Mu|9F{sO9VXRW5 znagjMSeV!FFXiYvDnkHVQ`W+8=aMBhP{RVyy=5TWFFxsJq3jpn5korJR+tjD5jG7i zHJlE_qxZ2C1|iXsC&MEBw?#_UI7bhQ>;+}ysF7=?s-=d8ok=Z1X*rFr;^$tvZMul6 zr+{)?3nKP^1fff05Ni62K+7xC?^@#OuH znD9dE{jAo3ojx;)3*SpYv~=MdmCZk@niiZl0e(11=4&&^r(Gz<^Xm=OGc9Ed)zLQ;VHZZbJ zFLI_$C_U(|li6H4IrN2x{!dD*2QA^G_z0y)xWyBzs_FPUag6aGzB$P#5X+d32|Lmz zLNYIaXmk2LEnj1{hQJR3@S-`(xV6aHE{$nNdT38SIDCacQ6TCrWHN6=B)NRMZ3qc{!LKC~L1AGv+4WT{tgDXDe(6-&L0Zl%u078keW%D?gMsQTvm zGd9cQ>lMeIWAOx7C(MJ&rNv?-nblFN`LzXM0w} zTcFkF_1y-pVfQ*0e><`A@2Uu8&q{j>aO*d8t>x*(u+y8M;Ojp-;8j*9nNctXqfp`) zYf4m5OgA=kc?<)caO4Bpsn z?XFDu-LBBzJ1L1#8g-wBMX_Pxc%Bl86@bKX%R+_G;ouhCnh@Y#EV{xm$v8q=?y z)XV61>IqB@G#$~Ylore~leaQBnjbYt_Opv?5)(oXo$tH3v_NF()z7!(S?*)QgZi#e zRoBDl5sgWYlWkf+~Ms9QIWidmO^UguMP5=)03F{2Kva zpW*hCxw+6MtchVvOxQnQI#5fzqFE_xPVQXB*IiS;zX`SPL8mx=s+n*&@t+|o9Bb%4 zw}4nLhgJMKaD1cU1L=e7cISsp2&T055t9cfhzwMvB;T1Lv4v3yiUtDj;5_A-RcmJ1 zG?9fUXLtY4&UNk{6b9h656!vT9h(p1c^=$peyHF5>~7mO*HW2Z&V}&rD_=Y8_cZC; zecF(3owDhv1?0__6l{d!&3Yp-m7$Aqsf#f?AMFLr)~GmrczdgGUe>zZv@bxrK zLBbCkTs%%U@v3u?^D6-HK=~Ln>6B^~0#^}*#mhQP_s5AJBs09S0O5K4SKSPvieueG z94}dq&u^9pIVZ4&JxfqJ-m~GUwgBV=_tMOes8b;~Q=bQQdW3zN*x5OVeL^PW3ihkm zH026+dKkngya*$Qt4iN03<6scdgc1ZYS$0pu)&s#&hBDFYeK4vuEo?#&?S?vY%QE< z%3p&dom!7IxnF@esHsZfcH$QzPQ`M>sb*jIdprr|`xef(;f%&>&$(*k|kfah%xoJ7-QrnQofIoY1hgKQ;LKLG-9p(>}IW&1yl1l!_Uo zH<3vy8*-8oL3 ze0~gTqDQh9Yho=C7e7?MFLsZ3lpX0x^)T26P6g9Afr+ znheINM|gx!Y@~GAL!;2v=o+YmaxN4QN`E}6XpRlQ#vY&FgvWWv+z8D)@nDVT-Alk) z?5^<$>zUY@-bIuH0}{y^_u14U2=^LMU#PI@iIM1N*%lwQ1o0lhVZ3FV@TfSgp5qrI z*7qJieAUC(4*cx}IFd{enOQuoHAi3h6<7QL!L)tfei7iOB;PL2qv`|Lep{Uq;K^ga zmb{QSy30e@R} zgFxk_MDsUi;KL zXMqPTE*4F}sr*v}Q-uS}7<0Aac<(%o;5L}5q>l2%9Srf{ibQO!6tP_N$PYtLhVc%u zsDM*`)G^n+mrRH8Z=Ggp{3&mSZJy1lqZQ9#W2R3#a1p& zrig99F{iLw=|}hD*10D@XI~s_y_LDazX#J-ZfmxqJV2K=YXVP20Uo-h87LbHl~hOj zExu%^emkKJj_Q;DQ9sLqh?7@iN-QG~ws#Hmw0 z9`k;1rY-+!Z1tezSZ>6{N9l1tw1rW`n--yf8AZ^w@O)c9mOV9wgN3nS3vF=OnJjzv&G+9nP95L8L+nv&p5?_>JR16* z3c}zlW*PK^)z3D}{lc6e*-AG=8YkvSK?3x6Hdry=U9`L3gRy$THZF6DTG|{-?h&NN zm+mMAeQ>8{y0%!8ev~fy-@K_B)3#~%WUkr+0oL<;(oYHf<9z^u+g1arNyqzPM1sit z)AvYuNZvMWxce?q*ro=Z2WeSOuwH|X21XCz#7o?M&Vr91(Nq+fJZ2b<$^o0v$HV08 z{JRo2Qb{!wJ%!2Js!m$A1vBgu<0YJq5}00V>#hxOO@^WC?t)REoAg;Ydz=wr__FiZ z(q={>O(hxn4qy2(R_P30>|z$9q?AZ~15qT>p@)jw{n(Cnii!&gn-$*lBv1~t~ znk_&#E>uFzZU(Cxw)byNo%CeJ5U@(c^6*5L^n#jg)Xi2U){+xjD?Av1Y9F<@Y`%uW z!UkR`>AOMOw?Y<)vrm8C-olBK_9s`sx+iZRD%a`p*@@=yE>dV|{h1f9U^|aaE;oXt zR-S({J_P&xd5-V?0)3B|QoYvdj;zbSHumFFGp8Em-KWzAly6&qaORcYJyk({UZndT z55?q!pxV5jegzc!q!S@oAqH?voyIArOwFz4QX}Kmp_p*)Hqy^i-2DRX$JfA_;sXQK zaD%^%=kkf)i&rZ<<_qyusn~F0*gY!IKN`!I`j`oOMHl`}LBCpKmYt!db7{CU+3TtW zk2Ar{SJ?!=n}`aJrG6d_Gt>-xuZ`K%#`pD!?y&yZnIChDar@ivS5lX^5@tXRZ2Vek zm|L!LmYcy&IAz_p(#OI}*lxWE1?_f);RRvu>xM?}sE>&~=sdEmC)aVmD$};9sGdI^ z>t8R|yq@0^*Q4mXp5(PUT`9>=iY4L4hJZjZE0Rys|6C1amHO#tRcjD5TbQ0lxK-r| zXB#1SH8fwowJb)R8IS8QFYJglnEIg;aU*{;81i>>K_Ar!blS6(>!*7L zZaQ_jnbVeZ*siy7Y}M5Uh&gs_)jmA#4VBxboWXhVVYtC?+`n^Neq=b`%My z+TKx>8Mnj3nc`sh;QK%24>7!^$)~d>j7y>ZIM{BL1I#JZ{8ekOJS$zAn>;l~AQlg` z5&|L^U6$XV^_eM!AV!+q3D1F&YGm=BUaW{bj@q?X43fgH4WT{6$jpu=-E@UkQlyhK z6|T?9?ZPqI#IM%nd!SL{z#%mUUyf5(Uk)Ts&VXy>SH0XmKjtH2@$}KAy1#XSR0D;t zBO0uS^6uQL%o987ypUC`u-TX3@xNTCA^<_jyXjzJz;@bsWxCAV$6wVH>#CMI+HrY; zg_rulr}b(tSc9y2iiE(~?Yq8P-`P!%XEUp^{;>vM4;DvVhyP~|3a0gkf8-g&G4(rQ zZfua1C!8S|y{p^WZuw+G5&VLvC-= z_L7hGSXj{q1fGGO#4jLa;;lVCJeza}8f%af&p? z(LP)(&IfzK;=C}jh2$l{l;>8hJ>*oiqy6DMdZ82av7vI}QoG9;XwaA1HZlh##>I^O zVdVc<-w^OEp!>sGuc-dzam?s3s>Ea}yA#(QDqGN~qDJ7YyLEVLew1o}71#>lmb;a~ zv5!TUS`V9zwAgHpq<>#1{MFAzo?^ZOSN{8GLmu*tBp&DFxv>pCO_K-7t27qBNBkW& zm_M)NlW8Tb{;q5C9$xGXXoe&_lL zVb|%Qp#p&7dG{D_2$^SUt03)VccY<~%0=j``vO{Zhfl@Uls|papU6U933OUOBj87T zv%uVa@;~hHh+ZsC_m!h1!50NuisfDK9ll|3F=R&DbsxxYm)`^qUC&gbMK05&Jj6x#hWbfk4hfR3v!c?#cz&7Q> z=q#!8C)mtiEiaqjS+O|?!d2X}gAEDyx6#35u zLd^tGAf){{U*{*eq3Ohv90pGtZlW4pu`v4(M&2;`&THNGE2f2E6s+@yR;e9VNr$=H zt||!xU*{VWfK&WRW!C55iLU}JvzmXwdYKQdi70WtjDgD=*S_lcCZf@0p`t1ZFTP@I z4Q7EpQ}t&WNMzi7;eUeN0!O_rtDtXRNVn+Pn0|CX>v~pZh7m~26bsrF&UA-*g^5B~ zB~69({`}OS(*;%Stw}(<#+AfWlV^h&8d*$4yMO0!aB#O+aAxiz>(fl)g8KQBB@k<( z1&33p1Pr6n119eyXmBaC1}QR<^&5NN_&2qMQ6aUUJF4oaLqa%VxTGLBd5%Yqv7&eh zOWeHhG{_QDLefclu#<6bMYAMysQPCQd7^@d29=>}=zC;+ZBx*f0D`>>2uQ9Q6_6;s zaz@k(T%#NdR0~}Jo(qOEU+O*7hAI_z*4tqlP!f8^lGkPSm-3L^FJuT8m?@(cgiNLm zW{k#ppVt!s82A&GQwJk*=05l89jvAuuHhsA@NiF{bn*_3Qn{2ys+ zKD7qXfJoMfgISf!vML!Oi!-qo;CHunrKLZU&Nnpq0g6!e`t@R9&7(y1+?CgEMTroO zs;NQ-%*+r@uX96%IuH~_l!#xkQ0Cc7(a@oE$8e(WLlDTGy1SB5emLch$L?E9*6{ckm;oL zqk|cuh^*b7@>9pZAJ;FtWnVRbmbHzL%5C|FbDD6cr1+N}d(_iqG|mvXH;&Akqw`G% zkVoms53KcVFa?~iA#CQq!CtB897K_#n|5%g#9H)G={{@s4Ut>Fnfk$L>MRE`Yj*bT z%&Kb{_BfcGZh=(jD`dR8heKLb6Nd80G*^)DtRi_Jbh-%g?X#F|6WpxFFmg=glp)+v z8x~KwD%MtlX=_^YXA~19Sc?G-;#s#}u!#ZkCvLS;y&W&qc-{@5*k$91G_GWTUz>k{ z-`lFvei{dikk`ga#|NL*^UGC1Il{lqg+mF9*QSGerV#$zgnH7TVp8jL$Od z@Q=ab3J72_GqtTfUU>_wYQwGXQ(NgC+)(*ZRTbMudOec*-JQ~U<}a1;Y$Bm+5ITW0 zxi<+f#RQuEIPs)hs8-?q+s#4>Rwr-t_+z}q#sBxu|NC_a`A2S{qutG>^4=d0f#qrG zhFP}X6OJsgcSZgYc1i#4*D;DPAWY+rf8I@ATW zVGAC3NN2OUk;S2?92Ra%XMuBi{!)=&oL@NiZqZ}Nc3wo^0O!FKzz-Ge2uDu-U=l!yjVOkfSo!Xedsu|wshegZ#$O#k+Fm`v58vw#9s&$hjK zZZ;YP*7|9!K|7A7-ou`F+Y=x@{UfL{swY*Z#F7syT`;1UdTZIQ9-aK0D2%9Le1ACT zc7+#k9T(nJ(Oq4GhDQbrBZ|5qs;+Hw_K9|(Ephr45E72{;kru9mD-6EnbJx(x*<0u z4}Ro%lYd4#4ZN7t!mBiIA6#$tx06VMj_f2V<2w$mB~J2hCsBLc!rSK4;c=1{&b&k= z5&7i*%%+d4Gvx#iQ`JdPv$ z{KWPOHXfUpi%5^Ms$@IKRWy1!u>MHz$_x(Tb1&q#YNbMncV$n9-_EfJ9E>}|uJq!| zU(tK*Y&DO%weC+L&u1;}LE{@t0u|E7fg2UNWk(IK63-&RAkl)k9oC1j*Ocz!E@H@7 z*AcNCXfr~5^-L+rq3hUmqxr+L^ zh_b%=$C2cFUsCJtg5yB7RE#rL`6Xm2^El# z?lw?b1VI|5yFoxw5mb=w6bYrJK?Fnzr9-5pL8QA`=YH05@Av(E-*>L>ob{Lc(hYOX z`OG`UJ;u13oBw~wLtz&GrhV&E>acndJtT(KwRN&A#QOTE{kI7qHcfPgNtI94{#xz` z)YSxV;*VkW7cf*XW;H&F;bgnv?Y4Auyqb-Dn>VuQmLMBsuAW#~F!GG2g= z-`#)GAKu9uS+gC0F>nK(?|9q>Oy5`r1FnU@X5pCmT!==M{oq%j%{!Zq`YyzX1)r@s zB|1Z>-qY9aK>@kmds|cNsFSWiq^bq|J0#^sR9X{Z+wpIO^GQJkB1(j9HR6q4-bT8M zbSlBou%$D`&*|kkbKUdPfZxi^5K@b}2Cl0~@Fa#2|EJhEtBp`xDClnh7NIDq2WDW? zA)T;m@su{Od93?P-c6Ke!${>h%(T7nshnt7v_5icqA7_vdLur-bnXLyIKtHBP-6a| zXUxHL$gs_k(7%M~7B#q$oKV`yaYC#>q ziM?HX!Nl4n!Q^p73c!6lN6%(f-f}K_@bs$`jMH$RH$BL11TnIcVBCX_3Lgn;TeA|6r-hKSXz@vOL{w?@X zM~c)4G`nb*<1r!%?ql#(npKz>zd54Q1vo>_A}pQu1_X!WT7UmPMKHYC7m-bLL|3*3 z9|V04l;D#9AgZk#da}^?|5YPn-UJAhh*8Y$m8vdH00Wo^Hm%;Z2pj!}zoc6m1zcNN z1lJr9ok9jJUl8{Q@if>$GO~!E^$CPqAui7s_%BKzDUUUyXYtwH0+8$?CgipJ71XL1 z&^vTcgmwSoEGqed13(BRtRoybpYMmIufSpRw530)3bQ@x%H8Eg`*P?u9syx@1WTSr z{KYm2z%-Tz7SY^~&qgMWnYHsJhnBog9p+E{>x@&Dx0%ho#$I&@!Du%>^N6pLI4v=E}h z4$aBgFKAVLrzkp9;@6wwh4{4If`ex3^n%`z)0p{UNcil)S6;0x-FzL1*a=^NDxTOh|Kl{0-P72`eLCZujFF^hov9O- zrRPTpjU8AUZ9q)4-vOvoCR`Wsmd_f$9OB=K^w^5j?O*tpt+Y$*lBL~=-sG}L;HV$x z8?;w)am}hjtkWA8AE*6k`PF5(?)YCEdl1$$KR0??>hT==zUPsc57$WuCFq=2*kA=w*f4stLl6d1WG6sRSQ};v?0D$k-M(KQvNAqRFBM~)A zB#nPvsQ7jR3@S2HAjGD@R?ZTV4Ud25M~Z&QU#K2mN8U&y;Ib$^rh1y*eT<$jZ%~nN zwPyIj*7hEtZ3V zVxe;rtSIE?nhr=a;SQw_CmNg2xS{c`W3xl^Mp!wP#qf=!)q|G-mg<%=#I6y51)GOc}aX$`_ldA7r~GHYb2BCm<$}*@Ez2`cqfiQ9Nyk zhJXj9D^Q3|@0^-qC}wFu+h7aERM)Ps2`t3IY%g#2zexJ-x-#kL{()eC`F^%K&udVX zOuNnNd~&jh2|Q1V^o&4(hwLb~63jKL1jNTemd+a>D#gP)erZ4Z54_WN#}FYFZBcJ^ z7>ld}orfQHfQ~w{?jblVUD%KYWwt-Ch5*C^#6QnX@wPjLBL|q0j&WP9_V*SZx6B## z(M=$+POWGwfP^v!V!&78lA8=eMA_>uD^A^sg!h1ZAZFg`7X&}Px%EOvzHzr=4$80A zV%t8A-6s#yI30FlH6QgQ9-@?Xmp*_Ol(`qK)!Yho?EVm2+}3VA|CE~mwNltl1$>#C zjsy6kbr-Cf0_=(-UhTw|#oNL5E^y!)(0x8uwNqXtGqy=r45W3Y?lout6La)p-#v9r zA{w?-zd>NxyE9(d9lDNHVHUh1iEX{n9V?pJoy zzZAo)h;?ojcFLasn7B~tkhCz;bbZ@~!Fhi4z4MR+ zv_>a)AVtV@bFgqhkmjc1GL-$Og0|)1d4~K3%LAzBtZz^t!=*=C%M(uq#9-z)y9wus z^jwXFcOm;;ju}(9@Z%`Zdy>$O4@L(>$~*S6oXXF7?iW z1W#Om3&PGKtR{C!L~MJx4GHMOh{1A+Wz`On76ai$L2fV;;Q|IL%WkLGo)QGNI?-0L z1wX{K%l@MHV`mWRc7!MtvLW6Kl&6GfO?qCl)qpQblCQ}?egah2ps9~}a!OFMe+8B- zDVS~!A`#Q9$uYL(6U@MEj6fsC-Q+c%oV17hK^(}~3ClSDt zH~V-XvUKliM9}M@SI(d%=oqt82Qb7m`Ufy7p2ZA7lW$PZL0ACfBiHU$oOB=vl91=9 z<3Cg^G&m|E9;kGCvb|vs(gh?yqlY4?CpWIk2te|foH5L`w~(S1+WRiPNkQlSO`P+1 z@SQKfmLx?}*O@)|SwmD_0bf3%T*xN}G=hZtAJ+f@Yjvn_!hj_Bl|$9o`WW9IYS0y& zoh+LLFDA)UD1A++xiDpH$8E%PKO6nU_`eq$G|XtsqG|w&tm7cDkS_r|ei?|I7uoK6 z9=w`+PVc0nJc7&j<@`shULt!fe&8=F@sylrf1Q0;W^{n+n|qDN7z&#IR)Wippjb{} zD?xth7h=Af5epE5_IM0?UB6)_neNM{& zSc+HG(Uc;bd2DEJJB}f9|zxZNlFa_XL*1 z;T*Z^v909Q-CF1(h&U*o_;~A%|B(Kli)}oRGw=W@Pw>TsTnk;3bB$l?#m1q;u4Q%) zW^wmoQF+vYm50gmj~os?6vl*_W$UO~Q~rDR3L6hzz1yIanWoB<{eJR_5x6fM@;NtxI7 z_ZKM)tk?!NZ

rPL?C|tx*uWbE0azo%&&qFbr8I>%FUpg_zBW&OLr`QiiXUK#0$ZkAsqQ zC|4u+AgqlFBsS_YyKq!fnEpq`J_*TJcO;4a{OD{I0kv4oCvf^h?DgZTQ3#9Z-#

yL@6)EjNkUjn610ZSqQx}87T;M`k8qZ~ekewQhXLA! z6QGrUfLyf^MCJ53sjY`~DgN;<0xXYUY4iV8pvO&~hhaa%QKR|In^UXT9qWR_Grg;p zXdR44o501?7T>Kcv+%r$Tq#GMo?tx&c#x%I@98^~!5KmSrH$?XkL+L{ znt{|tlo;VP`3hvcm<30u2pd_;Sy1?;v}@vE{D1IkZUCMvQ@cyr6<7175%{dsKXbG+ ze!Hau1X2p#5}gwekWN4!Et8Z2%?cObFP*Um@P^r6oHGKcz{jF})>TVB{@vBWL|^H1 zZo&j-6XVMry#p)vF<(l_H++=MFqiizUx@|!Xl{jkr`6eaI0y}zv>DCYEPMgPj`#qp zbl4O;bvq#Gm|KI-P7VPG%8o&Ll=|U_QjiqFp;wpUHV6a+Cs2(jNyPXc%03*Lh$YNO0iJ&o zK#8x^`-{G4(Bj%Xn20E0Fs(@4d%1H)gTHnwK-n7J9DCiyFxkvBAbcuQ2jpyv$r38e z>WVLXs#-X+KP5Gln!&{(PU1o3Ry?}bw&BlorU$s}YyG zZLV>@;~Wf2q{Z__WkD6}+nw@%29{yDYBz*#^T%x%AgV<+zllc=^5ssu^SvgQH;vL6cpPwfZQ zOr7<&U;inz+a$GhW8VYMaW;>on6lw2(Yf!ye{l!Lr3EgA=j|~0__5DeJl61HtdvEi z9?nXe+WObG_HOzUOzFxbpGQu4?AIjTj82pRNjAYy)+W9AV1C#52Vx6klkCZ91QYgN z8^GnDUV>4&Q9WSVLkrtT6;-(bUax<#?lWQ~5+V$F%1ZZ)A)7?O+=i-Am)&H+01qhJ z)V!{-IheHVyNV~yd48qc-+d|OTd7lWX-`uSFv>46)cbcc#8<>x`9aC&pGksU+1;TziwkRsZG0b3~neu0Rg|{iD`FE{6%Wn z{x`B3Z{eBur^F!UO+ysKx7fqD{Y-C~kP#tP@GIQiuk#`8zY9&CJj9;yDRB?{ckZ`g>=PK?)mQAq3g)Sil5rfdlnI!+GA`hgYoJF$9g-6Y!7r6Df#YDz)zv&kbBPkX8vg z&3Da698Yz{y->eham6W5w>Cv}>8;_%<>~PAS0yjqL_heSkEfGFKRxb0RM`~BZ%bqf z%KjFH`+17mlDgpA?oMNF`3;QG`OU=1A!zT|J+DJOs1~I86G55V&*%Ly;LZ4X;=^-*Y#FK|qPY(W-czBhID|LEvG1{|TSH|1L z-(OC-s6@XPwePMX`GkRic2DNeVEh$srZby1RU<3QpNPB_2To`6=FU>n@Lu6WEj`|7 zGvxn^aX-an`B#ZALU&jc{ZlLf)>=e*d9SVV6Yb_Lz=DjfUUm}b27x74`W>a_s^=jmyoFt6{f^4~v?LVm7;btsIW%cudBUvH&hR9G zyoa-^C{f0PW6pI;O!VpZXiUd*q z^8>e<+QyUvHB#&Is9M$9SHxTKQ>T0rP+W(P=MXN2i)+Hc;+Qi>2FAVRk8^jSHGq^J zE}JORMP4H)V);%s`iyWw!Ew($a9p2sRRF$2n!sK3BR&U)9N*Q_dpP3Z&H><8-s5M1 zZoEqYgt^g}X+O0Vw!)WpABqNwIw>#a)fp)pwjKC9Idp;$MHWw|)a+Pp;bb^F(I!rY zfYc%nz1Zn9bkb4c2Tqx-mUfLjhRip#*wD_w7ZSKBM@=>mFB$-Ep+T=#dTEl!H%WA$ z&(zyAts=R^NT9qpOWPQ9-XE8tl#Lxz3!FhL>t?&v&F&TPY3ilbUG$vrs+d%V7g{&G zq&ZH|4@J+J#b|bjH72?(^)^;de|Ba4575w$EAl@$Hskk!e zH^u?NjfByk44gf=^EdWj(2wN%-(ZXoJ0Z-iYSSslcVuA*dc|dU8Dg23whI7Y`*GOj zQj$k3!s?$rii3&aH>lK2ncf+n3y-y`RD&t`!=Gr8&7>87^by^{5dWMfFfec0gEp(r zdIlNHpbtt~`Qdoe>y2MWv8*~HJu{Sl zJS)e}19nE>ec1R-iU&qd*?ZNG9;R9^n8$JwzZWgv{R~3=XLCWE$=As$7%l2u+a<^* zN(r+sWsc=mlVj~0p-^Fl+U2;Y5l}o#>Mo0I962TP9y^Al$ua320PW??pSe0#(vyFv z0}dYac+-XpJbfyzl_fwMjZbPsu@(-Mbh`%HmCk`RLSJOL~+ z%aINvw#+dPP~J*Hs(iY^ll68ksH2mu)YyzM)hiJcBECEx+1#PgAeK!nqu%@ybpayS zIUL92)J9>)?cobt>h7vX`gj=mwzUsgwvRajNy8*y<+DxhIivjTn-|b!Zhl$H;ECfLV;uyqQpjxD1m;qCKFF<)Zr(_koBPDGY=9$$f|s z2Cz0Z?V{rQ)0b}_z9~x)*IumZ9K2t!58f^df8Z@TfU6T0tFLl!^z8Hs?B6LAk9q?I zJm^2(u}dxzi6pF*s(4XNdW~tzsF$ndP@r#eO5=vc_WSYiap6{=D8-+yqAxJL7VQiX zpX;#r>WTY(Ip3Kn5*QWUh%fGg69=a-!(x;uDyE&a4Yymjy{ev+m9gRVBc&63##Lw1 zfW4^i6qmuZcv&O|l5xniGx{6A+1D3_5_4C&nV6CH!H>zvurPgf{^uP`EZXk(G9c5z zzDF~Fj$_Ki+_vp|KRRTFUDNnE0G7~T(Wvs&fp-{bm3SF|eF+0Q0O|Nroortw!<%& z1AS@&7o282NZ}Fi!Zm;s!Ei6XsZhGO)9uVJ0kGW+R2tfL7(k>5MHhfd9oVo8MrDzY zng)N7dCuWVQ>yLl{=|u~vc?HtjAigp@q)g%uuA2vw?Blp7Q_;+?JV7OE}04?By>$z zOg}78usUS$_8r@f#ILxO!-q(GLhmv$Dl>$Z6G!*B<~6``QHxTakxpP& z!XH^Bo$uKMxCOerYid41my%XsT2kI*4`*8L1SmH5dj`5arJi zE|3%YnGYt=810VT68Q7tEK3kg<4+8&Z=fK26O(>w0>!c)FFh`fU3y6n;JVU@8JA?L zf5Ojev6Dz3CLfol+LEiKoKQLE!ua6hl|!g|s0lhr>|2~KqQX}vweli#(kRJxdpzuv zYeMJu%jR(>EHoA-Z;17lt<~4M>n5K3C zk*ndp1L~zdfmBB^OO*o^N4xNdCIyf?CQR`3jc3LqP)1{JM8#$P!|H=1w(SloFm3Vc z%kS_tD!dq`fr19E?1?n7p6v5ti}uSs!1!Itwu6AqwcxcpVeXIJ#K3T?pH&9o`}o() z`A2sv*6ch4nY><&q}~L7k0r`qPb-F@vSk2~8HL5yk zG(bVXan0u-qVp1tL<1X51?w?41uuu068UZB`1jS%@MR$Kra%d-R(bm-8-@4x2GGB= zz*xaA`sW%^lNk`3I)F3B1w%nz5>i<0^N~TX7iK?7Uk>Klzdw5gWJC5TW-F>iygO|=c*GFv#hVX1H2Ay#@T>cNdw@Z4;giGAGxT` zo6&_rqKSUf0M2H#_{3EH#+4MN0>E0+N6zEm#trQMmyqiE3i%XKyt5Hxs z^VF~`lL!g9R27Cn<C&Uf_%0+W>URU&CIZ}TlIWYf+?FBrjLV96 zo*`BGEYU(Oug6h3ev=)TmIGWpP6Q#Qu(oHXY zRv>w!_R*z+1v77y?&cx@hgP*IQWqa?$gbtCh=qun<-6-#y6&^wntbh{lKtqat6yDyTu*Nf$t$w( z{rLWd_|^cf4I@@fMjm-)wknHWCWc668Bdf@JlVoowbY>wXM%z=1Xb)b4G?f;Q^Oz* zX@D7!E6MTpMd>RPyyjP7oC-o3X9@bd3Fc4Pz24kj8m*lGU_J=N#6NuMM06rrzObRP z&fD=7=`|)06;+-Eirv?h!aofF^o*mKaJX`zbU>vgOp2pL#l)rsxsBVzBUseVxXyxT zB?7Rq2~&6Vdq!XsXEIcUVayW&_lcz`$h~5e_CG`&IKG*0J-QR%l4ReXeNvd0VdNR=bUlexkOZn z=CfH-ri*&u)0Q*)EN&IlUUE)`pFIzhC3HiR*nEv*IiJl_HS8O#hrq*|-?G?|Us;f1 z2xGSpv)#Xvuw!sKE^qhYhcYcC!hrbh*z4AHMT4e;Ht!ZDFjv(EWUY3FTB_z5qOCS8 zHWzO9=9~BtfQvSKY#FG&P$XT8C_F9)utN`-Cq6FCiH;ju``Gxm^wi#DzFc2B#ya00 zE-@14z+bYm>t13vg|=v4s0zdW3^f;^89(g=&&Lyo4mx=|!SVyVhs?3Ln!cKnXhkoKKw%Mn!Lror`T^k^SR&!)+q@-am(W|eqDxrOXZ@5*d*MNS zf*p-u=G3pesQT~|pIp0h26wfwV3t0TXdHP5KJj!fUust3fBO4FczN-S%ylA2H2Mv? zk|t`}ZO%M9u|8KeS5v*T6bYQ%rE=^=)dc0dK7Uws1gs$!ZY|nCdi|(iyWKqRw%RL_KJ^_$ zcO&G5ib}U0E7Tv&2}~Z_st(;4Yk6fyvzLFYrL@TOC)MLTCm@=j56$J6H1sEqmgZr9 zwvy(l{)w7p-ag8>JU2B`e4{Ke(u<>P*nf$)gbM->55?wo2?j7^PRBaRQRU=}wKvpA zSkvEb>2=Z(c?$DZ^f`u)oh#tw_73EH_pOdj zY!PMvUI5q=v2bC&Td!m8$jZtKax0pvpYHzw5QL5L(bG@Ibw=v}W{K|EQzfJ#}MK z(~K+h^tV0AkF_}EKfPs%yDhsfu}S112j4TU$^l;Dh>7*{q%ha%D>gH-ta!4Q=ua-f zw7J6PQEa^-iYiF-+7EZm>$%$fA6=aEUsJ~Rr~f_ zzpB`*!IbpKi7R#MIgR6aLi3-vsAy@)x33ovrJ#?S9tTd14=&XOrt{*UaQm zJnc=r4br0r9{s&<-(GG&sQn)PCyjQ9slM9_11`t>)t4v~_OR2zhG>4?#2e33oLBthV&BVaeU!GfwGEijNKvTf zp5buVmUUhWk8E}^Uc6IsXR1G|SE3`s;li||-UdqvV+8=;(az0LqH^wATT{b=+Sb=E zm!%jmbFo=ChYwy?%ChcTi{%{))tlj)QW7}NDeqM*o7CEBDq0>W_IM#dL~;5@=(836 z5pTuimAdATu&}-QRgh&$hIcYGPsg`UdhR(cJQ<1)6%jicUtNT9!#W+iX zttx4$-ML}OV!D0t%zLkBOD&nQV>qokr5nUxj}WoVVZWD>Oa5 z&Oec2oTuASX2wU(vD;I^21Zf7vI*Sxau#|R`^Owdy_c$oWuYb|Xz3|_iVg**`@R$- zBaB}j(%?Di?#wrb#JGfci3i})AnB5sb=}+n>(SNWX!iYVZsH>IUZ(m;lVi870L%#P z_Nicn8mduYkd8ee^jGxNlC=dg*WL94hbEHlQ1Nsrl3vrix-lT4pu(cV3Tv0yI&v(S z)$&)F)6WyWP3GFK12J-k?5ej3;Ww`RrQzvFG|d#%AqAu6j+?z?K$&BU%+!pnwoLY z@0ZWep*4Dm#m^t&V_)TB_Q(nT^hp&Oj_R)1mF^y)E&lz5s*N0zinDKM1A&zQR<=Ng;kl(SV}Z->R?-cCfbveB^?bOInt%3_;BPp8wiw7t1=F}p6+LYZ?NAHFp~ zTj4X48+t)do6PkS(33eWcMosXzhv;?!Hj&pBiWVFm9I75!;vgYL;vPUAf|C~7lb-e zRr`C-Hl|t=8T?3Dk3A7Ga^=*J7cB$8ZD+{wNz4w(FN(1J-;<4C?^=+csL&nn=U{E(}RPHXFde^T+{ z30%q}wH|d-J8X1Ggqi0zR zDRiY|o!H~7EgS7u*E3Hy&U{gqzY()$1IS@e(5W>G87ZmYFA}dLzaAw@?ThZ3$ZzbE zNv?anVjxVGmPunbsngg9`}n3>_Jmt!LPhTv?E6x4y8U{(WzsJYufsNl*SM+f!RW1cK76TsCQag^i3p>d-5C5%C zf^mV~>BTT%y||^X5vKZbPEO;#+fK*8T^(||%z8vh6=oCK6Aq;O?%Mx&u8(}_lai8> z$WSXqg0tl!4a_dymtiI^W*wm~CgXo3PO9tk%@F9K=I_PZ`ceeep$X zHF+IJ^3q13gM)|=QOu*ErAO_ym$zwR!&dI7LHoP9#>Y9t+QYu(h(U&LrPt8^Kw`~wTXG*ncMs?a0xnLiXP~kl;4=^9`Y$UyVLUTar|}&TcmhWpN_j8R=@J}1mLxpi4eMI zs>jR^+(Rdm0KuJd9%_!=agN!U>dH)Qqu2dt6X#P zKpyl%FmhEkq{@|qMOPMOH2T7OeK{}xDXs=^D_a&ho^s6=7+))>rHf1{!$9bObJ1Yc z;bZjCzMP}AKT=dUIoprZ?&iA|lleeOjxSwaL@aONxsQ_B=5kpXHRqwouv(3&u%g?-?P z<({0}PZV;L^z)1PZg*2V$dApE78I?)JM$G9D!J+g?m3T$-Q2Ila{NwbkSk9m({Y!O z7b$w0ZfRHV*{|O^KUh8WY4?vA;3aDt;XzD7+dQ$x_bZHEE;c%m zTF_pSv?|mLc(&Qs&ay}}$W87k4FnhhPxbli>`vd@NTa^n(e>n%bF77|6Zo8Wp`y@KH z?;^#I@8fY5d3RbLI?;>wi?99O@+f5X>)5&YPl1{8w^w-sr9DZ4t7(vI!frs;-n@_!Exmw% zT1$pn=l$1Z=^M>y6mtAu9rm|~^lLMCIL&{XEyG=m**bEAtM(OHB>1E^OdG|~g45J^ zu0tjJAH9^7gq5v>Wm7pqvd?2-U~KrL#V12+$2|Q3##OC&wQ*Pv^Kn#KU~AmA(CpQh z1_2dIEV6)y_X+n(y>K{eWIK^v-e3AL*0zhDN&o8xweXoDhu+9~XOp0@Az~48%l3iC zdsfsBE!*F~PTu*7p@AR3%jr1m@+DYF=-q5_cAc8h_dA`2lcs}Kf81nZ7G;MttSkreLW_|MF#`mhl<>$wl9C>F|Ba$EnK3 ze}0IxR&W%G@PDNiK|!D7=fnhWxOmf6-R?IxjU0Y2C0ZOvp!~Kiy~oPId zi0@w2sr&@g2L%|;8$V^`VlE#>L}3g|=Y+tc^T_787<1wl{s>Bp^ZD|rqr}JMAJ6pL|LIh~~3L9iF0M)?QC=89|4I;JZVGZ`Z zACW8IZ31#Ir6zk&D}S*(?EvCBNgy7}?a;gJ0TU_}knCB0JdWqszVuY`v6c@v_15_X z<~@WqYMO3;=DPwsgkYE^ zNH~xq+Y9UM?U~DFm$S0tVUP~eW@I#YUWiCs7FXQVgaE9$M-gYEH+$5En;3Bp1o*1BU$v>$RFb4WV-{YJVfst9p9;X+5hAsWjtx*DT4T8e@~(}es%O>cXLLszJOy63vZ zq)zs!{bUv@Sma4F_8C_(TjS`k|62W9z=hC}TI>O+6)i601P=uS4#P4NSy20)3U{XF zx2EBb4?EjyFy1x=`R!ZLlBA^Mx5+WO#4`tOEsEA*qi4j4tv3tZj&e2^;{L&pLdL|1 z^^B@DUWqJRzNacspG-7*HxGW7r;sS+fbVsFOK_M;>u5wTF9a|&w#xj;#={dHf0$+x z2Yi^{wx(y&o2otUQZ#bdXjZ^TL=69Jfy?|wzr#l8s%co%O(sF<#8Vv&19j|V1%}HW z2~!#%7!q*Z{17b)@#t2U(T&XJvy6&0wXJ2YoQFhdiDQ*pxCPvB@9 z042fD1z56Z0mKKLa%hK!?STs=e1Qz_TlOs;tmHqH6FBISK?>w`vFfjP;4TwKUmeeNs17m_ri0Is}>N?-1y4AoU-w;-y8%O?TFgy zXjSK`g1ya$*h7Bo4p7{lbpk=ZdA$tYR!$7C#snTTBCH;SRzGEPVPg#P&3flh1vZ#Z zJK?+f{Vsw%;l%RL19WxT9Pk`?16nbFzApqav2R{F^~lb;ZhfMUD$a(5>Sp6kriPY7 z-TE-06m}LzqAV}Q!9QryM%da-dj=8}k;)_NFw~~@oSNtcydGQ_r0FfwZiOjY1L!3f zA&Ex-d8q;BTroQqIf}LSKftK;EjS$9{{;eL^KP+W*oYN|NEOq-n26nS5@E$V#fWqE z;3X&vn#G+=8{uD%PY1+j?y$Zy5XiG>adAI+%V=#th*XcA|7HYggT&=QMs+3*iHIUv zh2ZckP9>ewu^j`K%Lr(sqNl-Wi{tK!3utCjK(1x@5pEkNs6osVtKj^u2xAE~@D?2*AWuiMaS}L5`_2iG#i|{}a_Y6WpRqy{%2(0^b-e*CLz%aLb-g;hW*XTySB$#LT#>K5mK7th1(6_K&b!c zM>?nbu9Mm)r#$n)k6pW2&}u1yy9exy2~Dp%BL{mqGt()O&plku02{P4x=@v8C^fuTrC}-?24k1#KO6!_j6PA40oaf0;LWJCrq?B6&tU^+_vEnuTw^{z zzusP+u^q0_d^-zf8ayQf9=ra#p=}_RNftzhH%7w+UZ@Z##G;rufeRjthJa9{F#u_s zCp+F8MTWnl*PD9pnj&qK$Vw|Ub#`BRRfW>rJ}G=s8MEV7&w3QaBXLcz`BIWSN1jcy z0*fKO0r4>v_7u>IcP8D$N7Ohui5MWiTWbHL>%>vNIK{f_LU@B`rULI5l@ zpJ@W$4K3M59>e2c*&7Vj@G<>Wm^~|`B|Luxj{}Dm4=3qL9GBVR#C))-y&68EcT$7+ z*4CSz^{RMVZl3TwR0*Am3<(WQ1skc!b=Zj$P4ikM4GuL;#9x}lkFvezlaogo{@k@U z;EitTv9VGMwuGJ1`+nB5n!o(BA}3VsPmVvD6(+w~57~lRrETfqGuwhD=53M78pTQy z*v%whI$&jqcgpMxIkwHa5D@s_)v*8b^5?^{m4WdLdd5!}$xmt(i5<|5)vOQuH!~76Hhxqc%=r!xOBtJH z;Ctd;jbXjRM&=ayGIgC}24xiwhg3RkU`j!C&HHatF7ApuyqjTcPq~T%li{bHV1CEX zO2rL5k-nRC-Q+6~T;>9EdIH=P5SNk1eIFvqEBzny%RQT^@BC-}>A*>GCG_@!4KHy?0$VP^m@r?2e@xYOcM5K@P>BV0bmWtQ z+xUW)k7Kzno_@;3YED)iJzy2te85N3TWq&4hmq{yLGOpZfpur*I!JsC{Z>f2F37@LNpT+^5T z-;up0t-qe-xIAVN1h+~Aq)1oma=cOLO0(s~WxeuC zT2)!=_kcx_0?a*dyN`UaeviAJ?o-v>#g`OIzPM^zZ-B66e8ER`Acyg2ealSqi|Aol zZ;xGC1ghMA^lX!h8r=~#*oSDe3}m)Oa9MfFdza|Z09eH$rwT$bA*ijgv@7}sAdAp~ zIwu08Zqeee$!7j^y9LF%g#qUzJv}|&1LF>kv8iQfyXRZC!!($`K*qN`Qxp!M0-b9t z65!X{$!CERjY$}-`LR`3iJpgU|90a3G5Nr%ci9XxZ6Q!KMNiZ13#7xc1tgcyRXXC9#xrn18J2T@Tx>b?mK8PPYn+(E2@4-udz-&DTDC_WS;L!`%;1S~v6w6fXuz$UU z9VIdEz|!{~gK`Ua>n~9XJ>_zwe%xzu3fJQlqk3c zpVW^N{FC*zOlD7IAMkW~Yrz2?i)MDTmatQX@EG2BGKo47p*#bbu;a@D1?lQxJ&EJz zI5DKx;?B5cIgRKAo?}-0y)bpr1G>xcVZG-{0dm9@d&}>0?BE=u@(#+I%b+}ofPvHZ zfxsGIOFipEJJ^30sXNm>gr;(+`fNdK!0#edRLire<$IG{Ts(zi+4^n0 z4S9+s0hpoqX`lx2b6>SkfS<%@p%M1axq*md^2Pw*ICDGkYuyX0pNa5>FItSOK(8G$ z4T}ws4EU1E9+VhORWR~Zgc-sMZH?sHM2Kn|vo${Taod4rjVK*PyaCKU$Zin{2-c;UI#ogUA+;Dp8OHyEL9H*oaAY z=qOV_92v_uBuRX8vJAss>1A- zlV{e{-0H1#D+h+erHuOP{9@F+=25`&yA4{LM?Y`&KSS1JlNWZ>+V_^hu;&}t-swYh zo8+ia=m*D(g2WsB_r|YuxTV!gLjS1`*QE$f6rJ;z%JpWUoeD-$5hQThf_Rw%JC!~? z!s8hKTJ5ImvIl&4vkZUZ%qr;08z2;2a&a>?HBE@fU6{eeBlpG`(W60pxH_Y8^AZGa zek`eGNMOH@_bC@gJ`1|JW)u&xJLZA5J6Tz5$q$pE-6=5)2VcbtZouWzVfS(Iidwm2 zHrmlVsjH*{uG6&6unn3^cpr{X)Whe$Ko}&7TpX9(DuDX7|L}>Af>(DSP?Ztl3C;m7 z2_-_z6zr_?t-T{Bh zaFF;7ct7p{GuY$-`%byExtBRm2H;tCGBJQVO$LDlNXOfDMSpBm#{J$2KgzK&*H5;@ z$>X22(8VMmATZS3mAgYT;FiLDpF(Oay3LfUESoi~yz1Vf6qzL2gNNa9r^Vwy*axLhXQH~`cEd@`Y=32_^lx0}7)_+(5Br!CRT8`1M z7n`rw{j%0gf?7YaNN9s(km=?~nadIga@uL0sW8J3G`I}$zN3y`q4?Zp?R^w$*zc;b z04?|(0N3@?ibh|n-$Cv{jlML@ zDspK8?-#@MJMzoUyp{t6-nyyEPGQs# zjH#=%)8yk#-K$J~-_Nv<2k)ic%1NkP_|6S-$0ePsTyoIlkGY18G`w0mztLtV(q(nDfSiZxo4FW?-6*j7b=Hne>+}C*|GI|8@2${ zPwoS#%K&go>zbqQO}6`{PmUpHyiUWbTrQ{Yex;=lZfHFbs@5+4N+p^g`_Egi7(5HL z@Ln_SZz=W{9EOao>DhmR=??cCdm)jM5 zoy7#|4oDMZD0r&jTeG7th#Rygb+S`Pj>V>IfcHq6b54I@k>d6o3rK#f1q)PY)#vEm zfD%NlMPuWp{ z_e3e)Qb4gByw;vafRTnKWA$ThWFtLg9~W%ZBbv#*G!LIQ?he}sw-fH8d6J<+WTX+SA0fxuExnlM<424&3XhYd3A|P)GyXnk564c6Hv{^OW=}5R#VLZo`O}Gl0 zp4d0d;KDE4crDv0<=l}lZR-}ZQ^!4@WW?=nEO^O3Gjysv+5WT8M2UpyBB(vV@aack zYU3*(hQj9~U>_`(DeRWpx$Yy-{w70ZRQQ*em*Y`L>ozm7peiaGwSbN_V~M-pBEoC%*r{>kspp@w4YX zd*8Lzy4G6P^=I{@<+eT&LH(!yBi262RVRS6P%{)Cgl3S61&2(>+u{)Kq&wUl*%bkX zcc|L_MV&wc*I8sspBBHi_B|mf>vD~|W^@;ysbciD*SO@asQE}W&MY-m0Lv@{=QU=0 zy@o`aEqw0gehvQyo;5p=Li++)ur%a0qV_-A?qb-Kpbd-=yu|C)R2Ph&U!+bn#w$3- zjZ9skc77oFnbDQsM%`{4fM^?2E$c+kQZ6xmAmOp6^5RLL7TGsvO|L#vHa^+(&h^M$ z%Ev55CK8UJP1&C6muug_=hBnV8VLxl+eBZXkU8nzkK88>x$ThbN683V#s@0&9Fcsu z^|O3@e66W1-hA8CH&{6$#CAK%@wTo3iC&87OF2mB$o2mSRgdBOJIt~+bLSo$rL4obBwpFUsm^pNXI`fPLblq>yPqoA zZ|pl_Um^3{f8v|QaN?xzd~g?(;-`agX_5seNp3I@7=D7y-;d{y?WzNFBm?R2i>57m zX(Nm3=eO(hMy5eiLD&OOWN3<%+&SF7mD;6C5Utcs?Mr?WdE5(rE?7gE zR}{km8f`d}rl0#3{GnFwfX*A8`Y*XH|cb^UWTv zthFC^KuwB+lBc*AMjAi+_<86-IBCw6R0M(TkU^TV%{3z-FW?EUl{Mjr0a#$zShTUr zAfFk;AwvQ~!QVmR@9FnHlQkD#>C`h)f=op%)?@q5aKV>gxc6G;1`?l{1%}2-=+&-S zBY5nE>@O#9Ql8&NW4aL4a+w@Xq7`u6U4; z)|Rj3>KJ|hCUuPyfUj&7ACBu#R~k|*qk_>bnIphfjqgV{=C6uu9tgDBnSW=L`aXBe z;@n$Ev4p0L2LzR2RMZ^2=H0@rbB$iiuG2nFtb&QtvLmzeI=8@}-sNpN_6412AWDtU zgxu>lpB!c7!+48u%6h{@vZCB<`vv1m3tttJ)$1)rCEKCJs$O=ytTQS5@{V)uoF(8RBKXf4?2=2grkBGYKr;kei$t_`EVybZ73x z0(#8}u59HayH%c;`WAN1m9%ch)p^Pk?`-Xgv$?)1`83;loVOga>suDD!p0Y9UVUkq z?6v<8QFR{F?K$upunF{539!kAo>&T~ugSVgL5C%uYXWelmkP(8yNL<_c#^j+d#Sfc>c&bP}^;5{t^lN zvKN60c<$U}gBL5x5`&68iehDjo_96btbrI@O{Uovh#ADFrs=4OYIpJ!0Y{I%`VQVB zM?71meeU)$LTB}d&DuNNLIpIkpZj%D{%MA zCi*~NRFzq~9rsB_-9H7T3t}%TP&XOs9dYAv5g@_F{FX^Ua%?=Wh`q8-|LWtxaB#tQ zVPAF{;Fb}ww=5&0X&|remp#q5rFKxNUyw{JKJ_m-$2AJW=Aj)4KQYlP+sYv(tE8f(7rF+~ zG+823Ok9f#Z>b_^r?%%=$JxE~D1aohy=lEa^MAAyk^CZlJ#kzrstx?gpO}PDP%#z3X$IOS%5LB|tWQWmhIB`z5p4 zRJsMhhv_*!c$59qRMDe22cmI|ohJ8JdXBqaWmQCr_7it*%Vj%${P@7R+WST4qRzbp zinIrawnmmC(xUuiq4w5#9?Rx=D1}5sH*Y!BF0!|z^%jSww)&b12}lS2N&lc!uKMs^ z+_yrOb84Ay>nAGcNO+RQUP9%DE%XCy*sh$x_phFn0V*;^x6u3 z`E&pZC0>-1(Du^O2-D$TXnR_s7k%RqocQJu@K2#Er(vf-CYUhzBSfNqnf`OK)d-Rw zbnd#t3;Lz9&^?25hwhnTjmrR5^aiP#F7z)kNJ4wUTcBJIoZJ(qhtk=&B~pf>uuqjQ zSXTcbbk9Im`=5yi^VSD*#jN-ppA2-eT3+{P&?&_$T!zN!@@cXdyjyxXaXKqfs{N1(p`?NDpbOB39FclBfcK|#fJC_k1ee%QIqI?3N z61R&T?3`FgNvB*NQc6Q&cG4>KAED-NcvE-n$u&4J&0X1BX5A*hC!_vFEL= zM^u^z0zN1uzN6#P4A8d1rX9!p>tp}OrLOxMubjDHWT$p8@wYD`QxX{U;kw>F?za(WSL>CEN+PX0Tuwq?c~rb+zfa0f9)9g1B-J`Gb`*MDrg&c3=n0 znI2}=JXpvwk7R}uog|- z&XcE3NySk4$Jl2%S7lEUD?4mV^Z;WYG7#HZ&&c!V*6x00Xefydi0c(0MG(*X_#p!- z914LI>EMVL#1^I!R7ws*tbGYkMxvp2Y=TmPls`{GRrkhIU_&}J3$`vG3@Gx|puEKK z5-{4z{SgacEtLOOaEp`1r~Nen2WXYN=H@21A3mL#?2 zE~n)m7^+T3JMyZFmz?tNwo z^U=!g)JMI3X{>nNCCm5U$=a35s?z$G>z`#CHFW|;BKyZR4LpoxTM0rYdLYze1)M@s zA%Zpt*Im~k(OUhwe~&Sv{p?wUijJUNGFu~A4C=|s@llnk-Q`*7NKShADJg}b z69T4-(1t2-SoPg__K_W0KSG%KPW9#1-%S=2q$w-C_}}$0PYc+Bm$crx^ORcr`nq44 zd?j=qNmg*?Nsr|H2~NRt6Nj&pvZ&={Ofr8D9zmM6G$^9FQ(jjlS7E1i^C8n?<(I4_ zf$?TA4|;OZC;!zUG9m)u~4E~0MaW} zoFkdXq?ugPSAOFxL(La;4JXpS^TW&Rdj%!#1+NPx_$yM_mDBhz#RbS!$zi|aqN)Qs z_w?cyNTUA(nLz6ff$QIe5!3X)#{Y;?-B$lmyz!7l9;R(Vi1aQ!zpT%8`0ZcS8zlFS zA%tPk2Njf%B4W#lC%-J9_&n(%dN^!p!8W{*@g(~{Q(X+q1Ej$%s4+hb*KTFC@!3IL zUvtmH2{esc=2LfF=Fe1%K-tmZ{Z_{bdv~UHQQf3TKjW%SdoYh|rz9PBxJh2jZgNcq z<+F5;F7Kn;XY&2i3564hZjmSAs&pf+xu&~_P*5b6srd^fCb4bby-i}jm3(Zg+2b#i zCqLH+^t5g~TAEVf^EV$_i|xq?E8aOGHl^s7md+4z+DsO`osTavjbEAAp;W}E z=IQ>fJw?hQHj>iz{tKNf=R}psu}47J2>FpmXhQcY$++{pG;ckLSN!(%ie|>Xan->9 zJ*KXtWE=EQI4kzht$|+Ic}rGugUHwZp4%R2mXDMKa$1N)ksG9c)I-c%;WB6`j|IWs zCq-HcC24sUOpod6EeK9sX}Mrk5PO8opf5@16jpF1zJNWOo3zW%NYdLsNo|b{|LZGG znJHj9He8JiQ3GuMkZXGL+f1;?k&J6ufWk+T8+=g{DhX^G{%$BlXF{LI`DI0WL5hZH zWPH4{=9GWC3j9waZ;)?&%&THD2v~hm#=h?*oSppWAvVSSLD$=jM^C<+^(j2&GL(ii zcdqV*a@?k<|TXJQB8D~+EJP0AL?MDhq<9xKz((8NMQTjV=P&6KqQ@5rt8 zt~j}1<@G$sHeQ(OA5uobJT6$ts7rz*RQQ35EQ0q_a+t_hC=h=yNf5jSe|gu2&EA5| z+mglAOdT{RRx9P5Za>pAE11mA1X`WFb3q`KwQmTGM1iI!T$-L7IMtk71v+PYWe;a1 zCcSdw(fWS8B+%1b!NOzaNx4wBFEg;uXM)Ozik4E$9vG=}dVF(p^Sn(5-& zr@a`nK&C2b8o%iJi&*G(D(F#vPxT^eOyOLubz?&e`|&FiAjB{V1Sj(5PdhuCAf50& zRzB=*rLgE+U_Bj2Ez;sJ0#Xsl&e(|Qn%TkXW=L#$wIUF~4}2<@Cd3>ru5=>D#EY3g z*=BWyW9AsP_1G5e1UhKSjJK3iJCu~Jk30uzMz&Jn;-#Xg7$gs@WjE+QdLV51s{Loi zZiRJW+G+$bA)?&TtW?Kj%ro^zr_<$F5Hn%4dtgV7$$r9F6XW~!1=3>yyNEulIVQ%p zEMikr%}bA0HUUFy6TOP2Z!z@C#sTPZ66s+<-t6w^caTq?t~#dMUWfRl=SSt81;0aX z&j?bxW%YM|3J_Q1kSs_uRNadn9RT*?n}S0Dx=m^ZA^zZZwa(cQ9k`&@!2r~C;=IC; zHckl0K#WGQY>Yfxd^%u|J^yrtiUanFqdNE|joD|y>J5QLl#hn)l>sGnclCpnD1R0i;rpogyOD4Pft%6zgbrRGdN9s;~G7y z%KNO^KnUXc_nXX4_<=VPO@LkIEC&`U)enm<<*BT%FA=vKS65q!cO4wZ6vL$7-?cZY zA9gI+bugOS;m7XO<&}mhXrfyf1;tEh2pxu>Ej^W)ovsEoEX|1}B|%G&;O}{d zZH=iA)hGJFHB}x5A_m%RMN^Jb9L2>Oljd=qW(CORG9KjP~)8SN)J{KtykiD>-ujQYd{i67hne zrw0xRC_xgJ%ecM7tD!KU2^1eILu=O{VrUb=`iVZ(;F~qJCg@g|7@C4SytM*>`AQ zp z6v8g%-hL*}A?qEmmmFuZZM$E#w32WJG>@9&J5laspVKAaiqqc5ZwHi%-bw~mE7Dwc z)uB+zUAU~d>HorTHjEmCz@XNef!OSAH=OM2;l^W^7!6cMSrl~xvy%gJ+He8PY(%{l zRnMdwdqgbn3wNiHhBj6089{B=Q|6Lcm+YQK2{-tWzg`6F^BUnX(oEk+xC8=h-XCjV z7tcUB!uovLYe!BkCIc)&(yT#W@he;D{8KIxK{rWux0KI$LN=S6psJyewTQ^uqV9i_4 zXw|fqlOGa+zL}q_EGrcj)B3=LFcbqF7Y9>cxbcQeEUAWo+D}>7inQQL!lhtq5Dze$ zZD+&x{lV(>PGx26vczobO8qRoE82w^f3$)xK3OU9AiD*&>nzC*1sx$6b?wxkBb9)mZYkO z6~^3&TN6qi!>?h%ra@tVrs8&K_qkyGq$sfQW7v# zspp)`fYs}BDnN8;p*2qjY+rPodZ`b=m`Lgz#7$nfT9x8i|Hxf;y4BgWH}r25Tgm?f zVjDRq*R$1u-xGhWhA91xa0XA4+w=Ym;NLI&ww zTpASIctpBVE95(bD9-a{X(=+g@mO{cDeHL4DsVEzg3@thWMoZH3FO^scSsMklYB4x zdnSFn*ikq)nF1(=>gXV2&+@eZ^4Ih2!bnA=rr z@T&zPZ+wJ_18qr0y{wLhga2U&ANDcQ5$s}+(B$V-TA_)LuW~Y=N{@!PIce@(P*(pk zC+7C)Ip&U^U>ulJy5mA@)n^Qt-{ryW?cIv@<4hb@<{U1J?z9GRwQ}=C!x~G|Gu|5Y zaE)1hyJ>g{`{@O4x;^{e*%=H%AS}qrh zWm)efj~EL{^~k8@@1#qeQoG!Uo8cz=vwI=s@ulN1rQs*BpFOVx#UKJJpC*HL z8dL?Tx6P&eDX3q<-H&`Be5*JwRNl1cI~Rk?@M8(AdnnR+cvX&M`xKp>ooDPJtOhZa zyB!lxR-VE+lSusd=xH}HmM?~_ppG>TNFL`ii&u_%2tza<<-~8^{0M9zLn>nFjDvDo z=UgY4XK^fk2)~>z_?i)US4p3sA!}F%`H=Rom+`hyRXa|u7;_@Eu_H&1au(0h%OmN$ zdEnhU7>2}jnjj7rV%7yhOnGFCW>&$}$Rg>md{`5Y@@f??yXN5TJ4s}I1(0lLhDMim zKf7V;%A7EbOv77(z>U@X+G#$jZ|S-{-1T1Xq|6=q8BgEo0TW;QId$%Q&5)Y}>&u7r zZ^;d3!{sxlWwo_?rdzLyBDm=m^%y|iXtxIW`t@yLF{CZ_Q z7w8Bdiol6G%>;>Q$!hHWS3P`+)^~s-b|A6fD9n@=<2azlvd9NPj*xeYekfFX_6@JF z^B~3F#@j}K>&Mir{VBsG1toX4^ZUFwnxK%<+ZG+QGk={!3Z;-H?6h^h5PS5pBozz>#ow)-ElC?*iZW~a5Ctb+8<_c(2Rfud=#pZWubKH zQ1cY@LB;Sb7&RBeEv&$VLd^Jxhkvn*H0J7d+?d9EBc`2)GEIV(2NJ02o>4x6*Sn&% zgF=q>CJ5i-k=}Hf)2leWX7GR2t$$`4X~Qm#e}&vS>^!lSZlj#Zv(bKqfOsVAS4SF!^a-tRmY$bu|u?&laiP5jrrmJ)HBciHE zWFBANp||;ZRe6{cO48%;2R1c*juJfY)^m{?sN0wt^zot*ZLkV#zBh8qJ4B8=mSv=5 zCRDPE+G@pX=?&`**vi4nkPhO5ZNEki!bXPo8(yPd8GTH?%_BA&MG0x4Zg3sraG7t= z13TZ_tn0u2k~E{LN88n=%%>)?lo)v#dhnexC`9PdbNLvsvOUqpg6&>)L{fRyxH?n$ zzd}y-n%fy2&yz7EEDL+d%S!wHub2elpvqFL`D5%R0*tm-jR~8fOE7Iaxxrsy-pG|7 zKa4I&PL%J#xm?4doO|h%&f(YlUm3BMz-NY8lRHzeA}7Md45`<;h?7=Q?t=l0(rYXC0|r*v`U9dVY!&ZN zDyEIW^x(v!FrRJj|F9z2XYh)P10)zOyb}xHU4CzJ%r!X#U$W6=b7{RX!9;@;#rtBB ztWNtgv4$wi@=V`eKnMDCTc39*+1|Z|MahaY5w+67AN9~;!HcdQKH3#ef%}Rz3f;M3 z5&Hs`^U`B-+8@CkDIcgy0?%_~P}DsVrA8BW=)GDq&}TY0l{Fg;cIZ)UzoXON>oMO~ zHO!yKUGfh5lsjt4{2D9&z1;Az_V<@2mzbS41~O>RQYd(qhdCWf?)cQ&Nf)By-1NA{W~&W)haWq( z9R1dA5B1C(#`?0a9@yyl0b%if#jMyDUt3)xityJ4W?i3I?JhqU>+CcTMz`yXl2cFR zlvv)n)7zf+;2F$RD|}^4ngRlE5Gz|Ev*V zqv@AYvamSz+|Cw`y`klCTQe1MqrP#Q2KKh?CnUGo>zA88mRXx{0P=xuaxecBC|wTO ztewyqoX0{A$v4p1Ks3nGi3S)^Fe%fd0)`Q93Q^I10@dby9gh3H5( zLP8XB{=!e|%ZK@O^DeP8{U~raCN~xqeN4PQ+2Ou~{gcM1;Ai?C4+|!1ezYow-^X+S z?ws9SJUTKNbmBF-3Ageqj4hp>3EMV;kHL%~xAyu~-xQl_OmpPqx$G_$W$MJZ;rs#X zl5yrS=_IBI&KW>GjM5>h$PnamCR5Zsa5Xu!e%xV1$pHNH^iQp}Xj!L4Z~K`*?_$s~ zXYr!eZs+&<4|znW=hwE@TxSQC2oN>Jv`&0<3<93q>H0Ocg_uBR9!1yXYP(2402O>W zr}Z_M31_2h{gHuA6r$7DV*u|W4(q#(0d5GZ4(p$xqj?5l89O-?l8fKo&G>9`+u50@ zuJ92dY`ixVHIm)}>ZH-~psvh}CQ_@tRA7YY59*R@102xinbFK-w$TON;Dv56kArrU${SIy_>(Gnfir*ir(*jS%m%dGoiw=3bqGB`|lm$r+ z8>9X&mtl!hh|aguwktc)y1hRDw;*nl-RhsV3Gg*zM~e)XCExwVr(c2Rr~6*))8bx6 z7m7^N?Kl^*k*d!fSj_qx7L07osQ&RN5w+$EL^<~JN2N+`{()L(g9w!$U*!CW@k!**#p>C?%af(iWCzmAeS=* zz#2L04YJtvqN&3C?H^I{f14r~OUw{{QiocL?XBmR)43urPyT^x>LhrEoV||GHm+T;I;)5B%ErzMi@0^%}4WTZ;G(=aj3MbJLQIFAnPn zkYkW)q{xykdL#i`)RIS&mrXw@9ZFA`dhmJ-U-w_jMzX5+wqw@P^WRK`s-;EjgnO`m z?u8QA>fq3lJc-f&u{Zy@Y>%+sJMU(43YiN;&N-f$Z)AO3)D@6VQ$ zgzwk}aLiiE^gyuWUVbW;V)XS(i*}*5(gGTvEax*WJ z9F%?s3U0h&X zR_Jo3@g~%LuCM%+K4|p$ONpoXdB6lYER&d9QrII@LOhuXAC?>RPcgS$M4tM??k{3J z)mxbkk~8)%CiPdnY2fF=J+N25>YTGi=&R2f=Z`Mf8f^45O&Tl-ylAYV#h*ZJnT|GVJho%b zG%_x>vldxy6?wIKZ%xgO!o62L8s@xW(YUCqxjp5tH${Dtl)5(a)oOOSF}W}JyhTg6 zCKTe&%lv&lq(9lpt%$6JI@_HLnQ1p^R;({pSf7~E789uLG+D~Dtu=OTM`!YDjSDhd zc?^WPsV1VxQo{WFpJMdef?jXDXKZ>~xx;8No2NYYc~Z+lHQ@^W?AvS|XZ2#8TqQ-b zxJd)(9h>RyTbPaE-m_JhDxVDF;l?oUSUP(n$+SuAuC4NF{d;GD?_0rJTI&xd^Qk2R z$Xx6zRS1>tJe{UOtjYF9lInR5?bA;;c5G&#u3vGcbsNyws)__h=$wjXpWZ%Fbdaugsf&rR!~_A3Yi? zoD5ss6B~Z3O_x(UStpA+O`1L_`!y?TnEJ0~f9+>w?2MYY$nwPC6m8ecUNz-z)j`?R z!Xr2DS*b}1-D&4*=-(0Sk6%f5=TY-KDEV#h65q`>ZQw~8ISLR0zH z>a$&czNMzB$9>geCbZu#XQD&T9K)lFm*S-PkId>6p}0YAE_tZdzBw+CBro-fES#Th zL0%g0KQ47XHA}ElxNv6lna2VkmBeeZnAC@68zS3eDQWCq;2+`|=!zu$Y4}~>1W^_i r;F115`4mQ5jQ&I17q)Q4ODD9gk6F>8@0F6gc{SzAJ-7b{Hc!nn literal 0 HcmV?d00001 diff --git a/sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.svg b/sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.svg new file mode 100644 index 000000000..2010e9435 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/img/uml/topology Class Diagram.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Schema + + + + vertexLabel : VertexLabel [*]{unique} + + + + + + + + + VertexLabel + + + + + + + EdgeLabel + + + + outIsOrdered : Boolean [1] + + outIsUnique : Boolean [1] + + inIsOrdered : Boolean [1] + + inIsUnique : Boolean [1] + + + + + + + + + Property + + + + + + + AbstractLabel + + + + + + + Index + + + + + + + IndexType + + + + UNIQUE + + NON_UNIQUE + + + + + + + schema_vertex + vertexLabel[*] + schema[1] + + + + + + + + out_edges + outEdgelabel[*] + vertexlabel[1..*] + + + + + + + + in_edges + inEdgelabel[*] + vertexlabel[1..*] + + + + + + + + + + + + + + + + abstractLabel_property + abstractLabel[1] + property[*] + + + + + + + property_index + index[*] + property[1..*] + + + + + + abstractLabel_index + abstractLabel[1] + index[*] + + + + + + + + abstractLabel_identifier + abstractLabel[1] + identifier[*] + + + + + + index_indexType + indexType[1] + index[*] + + + + + diff --git a/sqlg-doc/docs/2.1.4/include/architecture.adoc b/sqlg-doc/docs/2.1.4/include/architecture.adoc new file mode 100644 index 000000000..bfcaf396b --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/architecture.adoc @@ -0,0 +1,127 @@ +== Architecture + +TinkerPop's property graph semantics specifies that every vertex and edge has a single label. Modelling this in a RDBMS +is trivial. TinkerPop has no notion of cardinality nor of order. Every relationship between vertex labels is modelled as +`many to many` relationship with no specified order. + +This realizes itself as a classic `many to many` relationship in a RDBMS database. + +---- +VertexLabel <---- EdgeLabel ----> VertexLabel +---- + +=== Vertex tables +Every unique vertex label maps to a table. Vertex tables are prefixed with a `V_`. i.e. `V_Person`. The vertex table +stores the vertex's properties. + + +=== Edge tables +Every unique edge label maps to a table. Edge tables are prefixed with a `E_`. i.e. `E_friend`. The edge table stores +each edge's adjacent vertex ids and the edge properties. The column corresponding to each adjacent vertex id (`IN` and `OUT`) +has a foreign key to the adjacent vertex's table. The foreign key is optional, instead just an index on the adjacent vertex id +can be used. + +[NOTE] +By default, Sqlg will use an auto increment `ID` `bigint` for the primary key. You can however use the <> interface to define which properties to use as the primary key. + +[NOTE] +`sqlg.properties` `implement.foreign.keys = false` + +Edge foreign keys have a significant impact on performance. + +Edge foreign keys are enabled by default. + +From a rdbms' perspective each edge table is the classic `many to many` join table between vertices. + +=== TinkerPop-modern + +Taken from http://tinkerpop.apache.org/docs/current/reference/#intro[TinkerPop] + +image:sqlg/tinkerpop-modern-graph.png[image of tinkerpop-classic] + +.ER Diagram +image:sqlg/tinkerpop-modern-er.png[image of tinkerpop-classic] + +.V_person +image:sqlg/V_person.png[image of tinkerpop-classic] + +.V_software +image:sqlg/V_software.png[image of tinkerpop-classic] + +.E_knows +image:sqlg/E_knows.png[image of tinkerpop-classic] + +.E_created +image:sqlg/E_created.png[image of tinkerpop-classic] + +=== Namespacing and Schemas + +Many RDBMS databases have the notion of a `schema` as a namespace for tables. Sqlg supports schemas +for vertex labels. Distinct schemas for edge tables are unnecessary as edge tables are created in the schema of the adjacent `out` vertex. +By default schemas for vertex tables go into the underlying databases' default schema. For Postgresql, hsqldb and H2 this +is the `public` schema. + +To specify the schema for a label Sqlg uses the dot `.` notation. + +[source,java,options="nowrap"] +---- +@Test +public void testElementsInSchema() { + Vertex john = this.sqlgGraph.addVertex(T.label, "Manager", "name", "john"); # <1> + Vertex palace1 = this.sqlgGraph.addVertex(T.label, "continent.House", "name", "palace1"); # <2> + Vertex corrola = this.sqlgGraph.addVertex(T.label, "fleet.Car", "model", "corrola"); # <3> + palace1.addEdge("managedBy", john); + corrola.addEdge("owner", john); + this.sqlgGraph.tx().commit(); + assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Manager").count().next().intValue()); # <4> + assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("House").count().next().intValue()); # <5> + assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("continent.House").count().next().intValue()); <6> + assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("Car").count().next().intValue()); + assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("fleet.Car").count().next().intValue()); + assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("managedBy").count().next().intValue()); + assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("owner").count().next().intValue()); +} +---- +<1> 'Manager' will be in the default 'public' schema. +<2> 'House' will be in the 'continent' schema. +<3> 'Car' will be in the 'fleet' schema. +<4> Vertices in the public schema do not need to be qualified with the schema. +<5> Vertices not in the public schema must be qualified with its schema. In this case 'House' will not be found. +<6> As 'House' is qualified with the 'continent' schema it will be found. + +Table `V_manager` is in the `public` (default) schema. + +Table `V_house` is in the `continent` schema. + +Table `V_car` is in the `fleet` schema. + +Table `E_managedBy` is in the `continent` schema as its `out` vertex `palace1` is in the `continent` schema. + +Table `E_owner` is in the `fleet` schema as its `out` vertex is in the `fleet`schema. + +.postgresql schemas +image:sqlg/schemas.png[image of tinkerpop-classic] +image:sqlg/continent.png[image of tinkerpop-classic] +image:sqlg/fleet.png[image of tinkerpop-classic] +image:sqlg/public.png[image of tinkerpop-classic] + +==== Edge label + +An edge label can have many different out vertex labels. +This means that its possible for a single edge label to be stored in multiple schemas and tables. +One for each distinct out vertex label. Gremlin queries will work as per normal. +However it is possible to target the edges per out vertex schema directly. + +.eg. +[source,java,options="nowrap"] +---- +@Test +public void testEdgeAcrossSchema() { + Vertex a = this.sqlgGraph.addVertex(T.label, "A.A"); + Vertex b = this.sqlgGraph.addVertex(T.label, "B.B"); + Vertex c = this.sqlgGraph.addVertex(T.label, "C.C"); + a.addEdge("specialEdge", b); + b.addEdge("specialEdge", c); + this.sqlgGraph.tx().commit(); + assertEquals(2, this.sqlgGraph.traversal().E().hasLabel("specialEdge").count().next().intValue()); # <1> + assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("A.specialEdge").count().next().intValue()); # <2> + assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("B.specialEdge").count().next().intValue()); # <3> +} +---- +<1> Query 'specialEdge' +<2> Query 'specialEdge' with, out vertex labels in the 'A' schema. +<3> Query 'specialEdge' with, out vertex labels in the 'B' schema. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/batchMode.adoc b/sqlg-doc/docs/2.1.4/include/batchMode.adoc new file mode 100644 index 000000000..99a66fe20 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/batchMode.adoc @@ -0,0 +1,257 @@ +== Batch Mode + +Sqlg supports 3 distinct batch modes. Normal, streaming and streaming with lock. Batch modes are only implemented on Postgresql. +Batch mode is activated on the transaction object itself. After every `commit` the batchMode needs to be reactivated. + +Sqlg introduces an extra method on the transaction, `flush()`. + +* In normal batch mode `flush()` will send all the data to Postgresql, assign id(s) and clear the cache. +* In streaming mode `flush()` will close the OutputStream that the data has been written to. +* In streaming mode with lock `flush()` will close the OutputStream that the data has been written to and assign id(s). + +The Postgresql 'https://www.postgresql.org/docs/current/static/sql-copy.html[copy]' command is used to bulk insert data. + +=== Normal batch mode + +In normal batch mode the standard TinkerPop modification api can be used. Normal batch mode caches all modifications in memory +and on `commit()` or `flush()` sends the modifications to the server. + +Because all modifications are held in memory it is important to call `commit()` or `flush()` to prevent an `OutOfMemoryError`. + +In batch mode vertices and edges returned from `Graph.addVertex` and `vertex.addEdge` respectively do *not* yet have their id(s) assigned to them. +This is because the new vertices and edges are cached in memory and are only sent to Postgresql on `commit()` or `flush()`. +After `commit()` or `flush()` the new vertices and edges have their id(s) assigned. + +The transaction must be manually placed in normal batch mode. i.e. `SqlgGraph.tx().normalBatchModeOn()` must occur before any batch processing. +After every `commit()` the transaction reverts to a regular transaction and must be placed in normal batch mode again +for batch processing to continue. + +Vertices and edges can be created and updated and removed as per normal making normal batch mode easy to use. + +[NOTE] +Sqlg does not query the cache. If a gremlin query is executed while in batch mode the batch is first flushed. +Take care not to query the graph while in batch mode as flushing often will defeat the purpose of batching in the first place. + +[source,java,options="nowrap"] +.custom api +---- +sqlgGraph.tx().normalBatchModeOn(); +sqlgGraph.tx().flush(); +---- + +Create 10 000 000 Persons each with a car. 20 000 000 vertices and 10 000 000 edges in total. + +[source,java,options="nowrap"] +---- +@Test +public void showNormalBatchMode() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + this.sqlgGraph.tx().normalBatchModeOn(); + for (int i = 1; i <= 10_000_000; i++) { + Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John" + i); + Vertex car = this.sqlgGraph.addVertex(T.label, "Car", "name", "Dodge" + i); + person.addEdge("drives", car); + if (i % 100_000 == 0) { # <1> + this.sqlgGraph.tx().flush(); # <1> + } + } + this.sqlgGraph.tx().commit(); + stopWatch.stop(); + System.out.println(stopWatch.toString()); +} +---- +<1> To preserve memory `commit` or `flush` every so often. + +.output without edge foreign keys +---- +Time taken: 0:05:48.889 +---- + +.output with edge foreign keys +---- +Time taken: 0:02:33.313 +---- + +.memory +image:sqlg/normalBatchModeMemory.png[image of tinkerpop-classic] + +=== Streaming batch mode + +Streaming batch writes any new vertex or edge immediately to Postgresql via its `stdin` api. I.e. the data is written +directly to a Postgresql jdbc driver OutputStream. + +Streaming batch mode does *not* use the `Graph.addVertex` method. Instead `SqlgGraph.streamVertex` is defined. + +The transaction must be placed in streaming batch mode manually before any streaming batch modification can happen. `SqlgGraph.tx().streamingBatchModeOn()` +After every `commit()` the transaction reverts to normal mode and must be placed into streaming batch mode again +for streaming batch mode to continue. + +The benefit of streaming mode is that the memory consumption is very low as nothing is cached. It is also somewhat faster than +the normal batch mode (+/- 25% faster). + +However the caveat is that, per transaction/thread only one label/table can be written between consecutive calls to `SqlgTransaction.flush()`. +Further it is not possible to assign an id to the vertex or element. As such the `SqlgGraph.streamVertex` method returns void. + +[source,java,options="nowrap"] +.custom api +---- +sqlgGraph.tx().streamingBatchModeOn(); +---- + +Create 10 000 000 Persons and 10 000 000 cars. + +[source,java,options="nowrap"] +---- +@Test +public void showStreamingBatchMode() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + //enable streaming mode + this.sqlgGraph.tx().streamingBatchModeOn(); + for (int i = 1; i <= 10_000_000; i++) { + this.sqlgGraph.streamVertex(T.label, "Person", "name", "John" + i); + } + this.sqlgGraph.tx().flush(); # <1> + for (int i = 1; i <= 10_000_000; i++) { + this.sqlgGraph.streamVertex(T.label, "Car", "name", "Dodge" + i); + } + this.sqlgGraph.tx().commit(); + stopWatch.stop(); + System.out.println(stopWatch.toString()); +} +---- +<1> flushing is needed before starting streaming Car. Only only one label/table can stream at a time. + +.output +---- +Time taken: 0:00:42.014 +---- + +.memory +image:sqlg/streamingBatchModeMemory.png[image of tinkerpop-classic] + +=== Bulk edge creation + +To create an edge via the normal api a handle to the `Vertex` is needed. +This is not always the case. In particula if the `SqlgGraph.streamVertex` api is used no handle to the `Vertex` is returned. + +For this scenario there is a bulk edge creation method. + +[source,java,options="nowrap"] +---- +public void bulkAddEdges(String outVertexLabel, String inVertexLabel, String edgeLabel, Pair idFields, Collection> uids) { +---- + +* `outLabel` and `inLabel` specifies the out and in vertex labels that the edges will be between. +* `edgeLabel` is the label of the edges to be created. +* `idFields` specifies the fields that uniquely identify the out and in vertex. +* `uids` are the actual unique identifies for each out/in vertex pairing. + +Sqlg will then first copy the `uids` into a temporary table. Then it joins the temporary table on the out and in vertex tables +to retrieve the in and out ids. +These ids are then inserted into the edge table. +All this happens on Postgresql, having minimal processing and memory impact on the java process. + +The unique identifiers still have to be kept in memory, but its is not necessary to have the actual out and in vertices in memory. + +[NOTE] +The unique identifiers do not need to be the vertices's id. It can be any property as long as it is unique. + +[source,java,options="nowrap"] +---- +@Test +public void showBulkEdgeCreation() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + int count = 0; + for (int i = 1; i <= 10; i++) { + List> identifiers = new ArrayList<>(); + this.sqlgGraph.tx().streamingBatchModeOn(); + for (int j = 1; j <= 1_000_000; j++) { + this.sqlgGraph.streamVertex(T.label, "Person", "name", "John" + count, "personUid", String.valueOf(count)); + } + this.sqlgGraph.tx().flush(); + for (int j = 1; j <= 1_000_000; j++) { + this.sqlgGraph.streamVertex(T.label, "Car", "name", "Dodge" + count, "carUid", String.valueOf(count)); + identifiers.add(Pair.of(String.valueOf(count), String.valueOf(count++))); + } + this.sqlgGraph.tx().flush(); + this.sqlgGraph.bulkAddEdges("Person", "Car", "drives", Pair.of("personUid", "carUid"), identifiers); + this.sqlgGraph.tx().commit(); + } + stopWatch.stop(); + System.out.println("Time taken: " + stopWatch.toString()); +} +---- + +.output (with edge foreign keys) +---- +Time taken: 0:10:03.397 +---- + +.output (without edge foreign keys) +---- +Time taken: 0:03:45.951 +---- + +.memory +image:sqlg/bulkAddEdgesMemory.png[image of tinkerpop-classic] + +=== Streaming with lock batch mode + +Streaming with lock batch mode is similar to streaming batch mode. The difference being that the label/table being written to is +locked. Locking the table ensures that no concurrent changes will occur on the table. This allows Sqlg to query the id sequence and +assigned ids to the elements. + +This means that the normal `Vertex vertex = graph.addVertex(...)` method can be used. This is useful if a pointer to the new vertices are needed. + +The transaction must be placed into streaming with lock batch mode manually before any streaming with lock batch modification can happen. +`SqlgGraph.tx().streamingWithLockBatchModeOn()` After every `commit()` the transaction reverts to normal mode and must +be placed into streaming batch mode again for streaming batch mode to continue. + +[source,java,options="nowrap"] +.custom api +---- +sqlgGraph.tx().streamingWithLockBatchModeOn(); +---- + +[source,java,options="nowrap"] +---- +@Test +public void showStreamingWithLockBulkEdgeCreation() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + int count = 0; + for (int i = 1; i <= 10; i++) { + List persons = new ArrayList<>(); + this.sqlgGraph.tx().streamingWithLockBatchModeOn(); + for (int j = 1; j <= 1_000_000; j++) { + Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John" + count); + persons.add(person); + } + this.sqlgGraph.tx().flush(); + List cars = new ArrayList<>(); + for (int j = 1; j <= 1_000_000; j++) { + Vertex car = this.sqlgGraph.addVertex(T.label, "Car", "name", "Dodge" + count++); + cars.add(car); + } + this.sqlgGraph.tx().flush(); + Iterator carIter = cars.iterator(); + for (Vertex person : persons) { + person.addEdge("drives", carIter.next()); + } + this.sqlgGraph.tx().commit(); + } + stopWatch.stop(); + System.out.println(stopWatch.toString()); +} +---- + +.output without edge foreign keys +---- +Time taken: 0:02:42.363 +---- + +.memory +image:sqlg/streamingBatchModeWithLockMemory.png[image of tinkerpop-classic] \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/dataTypes.adoc b/sqlg-doc/docs/2.1.4/include/dataTypes.adoc new file mode 100644 index 000000000..8bbf2ebaa --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/dataTypes.adoc @@ -0,0 +1,261 @@ +== Data types + +.Table Data types +|=== +|Java |Postgresql |HSQLDB |H2 |MariaDB | MSSqlServer + +|Boolean +|BOOLEAN +|BOOLEAN +|BOOLEAN +|BOOLEAN +|BIT + +|Byte +|*Not supported* +|TINYINT +|TINYINT +|TINYINT +|TINYINT + +|Short +|SMALLINT +|SMALLINT +|SMALLINT +|SMALLINT +|SMALLINT + +|Integer +|INTEGER +|INTEGER +|INT +|INTEGER +|INT + +|Long +|BIGINT +|BIGINT +|BIGINT +|BIGINT +|BIGINT + +|Float +|REAL +|*Not supported* +|REAL +|*Not supported* +|REAL + +|Double +|DOUBLE PRECISION +|DOUBLE +|DOUBLE +|DOUBLE +|DOUBLE PRECISION + +|String +|TEXT +|LONGVARCHAR +|VARCHAR +|LONGTEXT +|VARCHAR(2000) + +|String (fixed length) +|VARCHAR(x) +|VARCHAR(x) +|VARCHAR(x) +|VARCHAR(x) +|VARCHAR(x) + +|Boolean[] +|BOOLEAN[] +|BOOLEAN ARRAY DEFAULT ARRAY[] +|ARRAY +|BOOLEAN ARRAY DEFAULT ARRAY[] +|*Not supported* + +|Byte[] +|BYTEA +|LONGVARBINARY +|BINARY +|BLOB +|VARBINARY(max) + +|Short[] +|SMALLINT[] +|SMALLINT ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|Integer[] +|INTEGER[] +|INTEGER ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|Long[] +|BIGINT[] +|BIGINT ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|Float[] +|REAL[] +|*Not supported* +|ARRAY +|*Not supported* +|*Not supported* + +|Double[] +|DOUBLE PRECISION[] +|DOUBLE ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|String[] +|TEXT[] +|LONGVARCHAR ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.LocalDateTime +|TIMESTAMP +|TIMESTAMP +|TIMESTAMP +|DATETIME(3) +|DATETIME2(3) + +|java.time.LocalDate +|DATE +|DATE +|DATE +|DATE +|DATE + +|java.time.LocalTime +|TIME +|TIME +|TIME +|TIME +|TIME + +|java.time.ZonedDateTime +|TIMESTAMP, TEXT +|TIMESTAMP, LONGVARCHAR +|TIMESTAMP, VARCHAR +|DATETIME(3), TINYTEXT +|DATETIME2(3), VARCHAR(255) + +|java.time.Period +|INTEGER, INTEGER, INTEGER +|INTEGER, INTEGER, INTEGER +|INT, INT, INT +|INTEGER, INTEGER, INTEGER +|INT, INT, INT + +|java.time.Duration +|BIGINT, INTEGER +|BIGINT, INTEGER +|BIGINT, INT +|BIGINT, INTEGER +|BIGINT, INT + +|java.time.LocalDateTime[] +|TIMESTAMP[] +|TIMESTAMP ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.LocalDate[] +|DATE[] +|DATE ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.LocalTime[] +|TIME[] +|TIME ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.ZonedDateTime[] +|TIMESTAMP[], TEXT[] +|TIMESTAMP ARRAY DEFAULT ARRAY[], LONGVARCHAR ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.Period[] +|INTEGER[], INTEGER[], INTEGER[] +|INTEGER ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|java.time.Duration[] +|BIGINT[], INTEGER[] +|BIGINT ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[] +|ARRAY +|*Not supported* +|*Not supported* + +|com.fasterxml.jackson.databind.JsonNode +|JSONB +|LONGVARCHAR +|VARCHAR +|LONGTEXT +|VARCHAR(max) + +|com.fasterxml.jackson.databind.JsonNode[] +|JSONB[] +|ARRAY +|ARRAY +|*Not supported* +|*Not supported* + +|org.postgis.Point +|geometry(POINT) +|*Not supported* +|*Not supported* +|*Not supported* +|*Not supported* + +|org.umlg.sqlg.gis.GeographyPoint +|geography(POINT, 4326) +|*Not supported* +|*Not supported* +|*Not supported* +|*Not supported* + +|org.postgis.LineString +|geometry(LINESTRING) +|*Not supported* +|*Not supported* +|*Not supported* +|*Not supported* + +|org.postgis.Polygon +|geometry(POLYGON) +|*Not supported* +|*Not supported* +|*Not supported* +|*Not supported* + +|org.umlg.sqlg.gis.GeographyPolygon +|geography(POLYGON, 4326) +|*Not supported* +|*Not supported* +|*Not supported* +|*Not supported* +|=== + +[NOTE] +`java.time.LocalTime` drops the nano second precision. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gettingStarted.adoc b/sqlg-doc/docs/2.1.4/include/gettingStarted.adoc new file mode 100644 index 000000000..7fffd3e30 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gettingStarted.adoc @@ -0,0 +1,190 @@ +== Getting Started + +=== Maven coordinates + +.Postgresql + + org.umlg + sqlg-postgres + 2.1.4 + + +.HSQLDB + + org.umlg + sqlg-hsqldb + 2.1.4 + + +.H2 + + org.umlg + sqlg-h2 + 2.1.4 + + +.MariaDB + + org.umlg + sqlg-mariadb + 2.1.4 + + +.MySQL + + org.umlg + sqlg-mysql + 2.1.4 + + +.MSSqlServer + + org.umlg + sqlg-mssqlserver + 2.1.4 + + +This will include `gremlin-groovy`. If you have no need for that then use the following coordinates. + +.Postgresql + + org.umlg + sqlg-postgres-dialect + 2.1.4 + + +.HSQLDB + + org.umlg + sqlg-hsqldb-dialect + 2.1.4 + + +.H2 + + org.umlg + sqlg-h2-dialect + 2.1.4 + + +.MariaDB + + org.umlg + sqlg-mariadb-dialect + 2.1.4 + + +.MySQL + + org.umlg + sqlg-mysql-dialect + 2.1.4 + + +.MSSqlServer + + org.umlg + sqlg-mssqlserver-dialect + 2.1.4 + + +=== Start + +`SqlgGraph` is a singleton that can be shared among multiple threads. You instantiate `SqlgGraph` using the standard +TinkerPop static constructors. + +* `Graph g = SqlgGraph.open(final Configuration configuration)` +* `Graph g = SqlgGraph.open(final String pathToSqlgProperties)` + +The configuration object requires the following properties. + +.Postgresql + jdbc.url=jdbc:postgresql://localhost:5432/yourdb + jdbc.username=postgres + jdbc.password=****** + +.HSQLDB + jdbc.url=jdbc:hsqldb:file:/tmp/yourdb + jdbc.username=SA + jdbc.password= + +.H2 + jdbc.url=jdbc:h2:file:target/tmp/yourdb + jdbc.username=SA + jdbc.password= + +.MariaDB + jdbc.url=jdbc:mariadb://localhost:3306/?useSSL=false + jdbc.username=mariadb + jdbc.password=mariadb + +.MySQL + jdbc.url=jdbc:mysql://localhost:3306/?useSSL=false + jdbc.username=mysql + jdbc.password=mysql + +.MSSqlServer + jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=yourdb; + jdbc.username=SA + jdbc.password=***** + +In the case of Postgresql and MSSqlServer the database must already exist. + +Once you have access to the graph you can use it as per normal. +[source,java,options="nowrap"] +---- +@Test +public void useAsPerNormal() { + Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John"); + Vertex address = this.sqlgGraph.addVertex(T.label, "Address", "street", "13th"); + person.addEdge("livesAt", address, "since", LocalDate.of(2010, 1, 21)); + this.sqlgGraph.tx().commit(); # <1> + List addresses = this.sqlgGraph.traversal().V().hasLabel("Person").out("livesAt").toList(); + assertEquals(1, addresses.size()); +} +---- +<1> It is very important to always commit or rollback the transaction. +If you do not, connections to the database will remain open and eventually +the connection pool with run out of connections. + +=== Gremlin Console + +.Postgresql +pieter@pieter-Precision-7510:~/Downloads/tinkerpop-console/apache-tinkerpop-gremlin-console-3.4.10-bin/apache-tinkerpop-gremlin-console-3.4.10/bin/$ ./gremlin.sh + + \,,,/ + (o o) +-----oOOo-(3)-oOOo----- +plugin activated: tinkerpop.server +plugin activated: tinkerpop.utilities +plugin activated: tinkerpop.tinkergraph +gremlin> :install org.umlg sqlg-postgres 2.1.4 +==>Loaded: [org.umlg, sqlg-postgres, 2.1.4] - restart the console to use [sqlg.postgres] +gremlin> :x +pieter@pieter-Precision-7510:~/Downloads/tinkerpop-console/apache-tinkerpop-gremlin-console-3.4.10-bin/apache-tinkerpop-gremlin-console-3.4.10/bin/$ ./gremlin.sh + + \,,,/ + (o o) +-----oOOo-(3)-oOOo----- +plugin activated: tinkerpop.server +plugin activated: tinkerpop.utilities +plugin activated: tinkerpop.tinkergraph +gremlin> :plugin list +==>tinkerpop.server[active] +==>tinkerpop.gephi +==>tinkerpop.utilities[active] +==>tinkerpop.sugar +==>tinkerpop.credentials +==>sqlg.postgres +==>tinkerpop.tinkergraph[active] +gremlin> :plugin use sqlg.postgres +==>sqlg.postgres activated +gremlin> graph = SqlgGraph.open('/pathTo/sqlg.properties') +==>sqlggraph[SqlGraph] (jdbc:postgresql://localhost:5432/sqlgraphdb) (user = postgres) +gremlin> g = graph.traversal() +==>sqlggraphtraversalsource[sqlggraph[SqlGraph] (jdbc:postgresql://localhost:5432/sqlgraphdb) (user = postgres), standard] +gremlin> graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).readGraph("/pathTo/grateful-dead-v3d0.json") +==>null +gremlin> g.V().count() +==>808 +gremlin> \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/predicates.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/predicates.adoc new file mode 100644 index 000000000..6e1c936de --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/predicates.adoc @@ -0,0 +1,199 @@ +=== Predicates + +TinkerPop's http://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/Compare.html[Compare] and +http://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/Contains.html[Contains] predicates are optimized +to execute on the database. + +==== Compare predicate + +[source,java,options="nowrap"] +---- +@Test +public void showComparePredicates() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b1.addEdge("bc", c2); + b2.addEdge("bc", c3); + b2.addEdge("bc", c4); + this.sqlgGraph.tx().commit(); + + List result = this.sqlgGraph.traversal() + .V().hasLabel("A") + .out().has("name", P.eq("b1")) + .out().has("name", P.eq("c2")) <1> + .values("name") + .toList(); + for (String name : result) { + System.out.println(name); + } +} +---- +<1> The `P` predicates will resolve on the database as a `sql` `where` clause. + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE + ( "public"."V_B"."name" = ?) AND ( "public"."V_C"."name" = ?) +---- + +The same pattern is used for all the +http://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/Compare.html[Compare] predicates. + +==== Contains predicate + +Sqlg's implementation of http://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/Contains.html[Contains] +is slightly more complex. + +For Postgresql, MSSqlServer and HSQLDB a join onto a `values expression` is used. + +For H2 and MariaDB a regular `in` clause is used. + +[source,java,options="nowrap"] +---- +@Test +public void showContainsPredicate() { + List numbers = new ArrayList<>(10000); + for (int i = 0; i < 10000; i++) { + this.sqlgGraph.addVertex(T.label, "A", "number", i); + numbers.add(i); + } + this.sqlgGraph.tx().commit(); + + List persons = this.sqlgGraph.traversal().V() + .hasLabel("A") + .has("number", P.within(numbers)) + .toList(); + + assertEquals(10000, persons.size()); +} +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."number" AS "alias2" +FROM + "public"."V_A" INNER JOIN + (VALUES (0::INTEGER), (1::INTEGER), ... (9998::INTEGER), (9999::INTEGER)) as tmp1(within) on "public"."V_A"."number" = tmp1.within +---- + +This pattern makes `P.within` and `p.without` very fast even with millions of values being passed into the query. +For the case of there being only one value Sqlg will use an `equals` instead of a values statement or an `in` statement. + +==== Text predicate + +[NOTE] +Sqlg assumes a case-sensitive collation. +MSSqlServer does not default to a case-sensitive collation. +Create the database with `CREATE DATABASE sqlgraphdb COLLATE sql_latin1_general_cp1_cs_as` + +Sqlg includes its own Text predicate for full text queries. + +* Text.contains (case sensitive string contains) +* Text.ncontains (case sensitive string does not contain) +* Text.containsCIS (case insensitive string contains) +* Text.ncontainsCIS (case insensitive string does not contain) +* Text.startsWith (case sensitive string starts with) +* Text.nstartsWith (case sensitive string does not start with) +* Text.endsWith (case sensitive string ends with) +* Text.nendsWith (case sensitive string does not end with) + +[source,java,options="nowrap"] +---- +@Test +public void showTextPredicate() { + Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John XXX Doe"); + Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "Peter YYY Snow"); + this.sqlgGraph.tx().commit(); + + List persons = this.sqlgGraph.traversal().V() + .hasLabel("Person") + .has("name", Text.contains("XXX")).toList(); + + assertEquals(1, persons.size()); + assertEquals(john, persons.get(0)); +} +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."ID" AS "alias1", + "public"."V_Person"."name" AS "alias2" +FROM + "public"."V_Person" +WHERE + ( "public"."V_Person"."name" like ?) +---- + +==== Full text search + +Full text search is supported on postgresql. + +This is shown under <> + +==== DateTime queries + +LocalDateTime, LocalDate and LocalTime queries are supported. + +[source,java,options="nowrap"] +---- +@Test +public void showSearchOnLocalDateTime() { + LocalDateTime born1 = LocalDateTime.of(1990, 1, 1, 1, 1, 1); + LocalDateTime born2 = LocalDateTime.of(1990, 1, 1, 1, 1, 2); + LocalDateTime born3 = LocalDateTime.of(1990, 1, 1, 1, 1, 3); + Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John", "born", born1); + Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "Peter", "born", born2); + Vertex paul = this.sqlgGraph.addVertex(T.label, "Person", "name", "Paul", "born", born3); + this.sqlgGraph.tx().commit(); + + List persons = this.sqlgGraph.traversal().V().hasLabel("Person") + .has("born", P.eq(born1)) + .toList(); + assertEquals(1, persons.size()); + assertEquals(john, persons.get(0)); + + persons = this.sqlgGraph.traversal().V().hasLabel("Person") + .has("born", P.between(LocalDateTime.of(1990, 1, 1, 1, 1, 1), LocalDateTime.of(1990, 1, 1, 1, 1, 3))) + .toList(); + //P.between is inclusive to exclusive + assertEquals(2, persons.size()); + assertTrue(persons.contains(john)); + assertTrue(persons.contains(peter)); +} +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."ID" AS "alias1", + "public"."V_Person"."born" AS "alias2", + "public"."V_Person"."name" AS "alias3" +FROM + "public"."V_Person" +WHERE + ( "public"."V_Person"."born" >= ?) AND ( "public"."V_Person"."born" < ?) +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/andStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/andStep.adoc new file mode 100644 index 000000000..d3e242ea2 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/andStep.adoc @@ -0,0 +1,82 @@ +==== And Step + +link:{tinkerpop-docs}#and-step[`And Step`]s are folded into the <> or <>. + +[source,java,options="nowrap"] +---- +@Test +public void showAndStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1", "surname", "x", "address", "y"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2", "surname", "x", "address", "y"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3", "surname", "x", "address", "y"); + Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4", "surname", "x", "address", "y"); + Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5", "surname", "x", "address", "y"); + Vertex c6 = this.sqlgGraph.addVertex(T.label, "C", "name", "c6", "surname", "x", "address", "y"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b2.addEdge("bc", c2); + b2.addEdge("bc", c3); + b2.addEdge("bc", c4); + b2.addEdge("bc", c5); + b2.addEdge("bc", c6); + this.sqlgGraph.tx().commit(); + + GraphTraversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .out() + .out() + .and( + __.has("name", "c1"), + __.has("surname", "x"), + __.has("address", "y") + ); + + System.out.println(traversal); + traversal.hasNext(); + System.out.println(traversal); + List c = traversal.toList(); + assertEquals(1, c.size()); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-and-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex), AndStep([[HasStep([name.eq(c1)])], [HasStep([surname.eq(x)])], [HasStep([address.eq(y)])]])] +---- + +[[anchor-after-optimization-and-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]] +---- + +This example is similar to the <> example except for an additional `And Step` which in turn contains three `Has Step` s. +It shows the two `Vertex Step` s the `And Step` and the `Has Step` s being folded into the `SqlgGraphStep`. + +The link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] will generate the following `sql` to retrieve the data. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."address" AS "alias2", + "public"."V_C"."surname" AS "alias3", + "public"."V_C"."name" AS "alias4" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE +(("public"."V_C"."name" = ?) AND ("public"."V_C"."surname" = ?) AND ("public"."V_C"."address" = ?) +) <1> +---- + +<1> The `And Step` realizes itself as a sql `where` clause. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/chooseStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/chooseStep.adoc new file mode 100644 index 000000000..6d7d5cbb5 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/chooseStep.adoc @@ -0,0 +1,72 @@ +==== Choose Step + +link:{tinkerpop-docs}#choose-step[`Choose Step`] + +[source,java,options="nowrap"] +---- +@Test +public void showChooseStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("A") + .choose(__.out(), __.out()) + .path().by("name"); + + printTraversalForm(traversal); + + List paths = traversal.toList(); + for (Path path : paths) { + System.out.println(path); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-choose-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), ChooseStep([VertexStep(OUT,vertex), HasNextStep],{false=[[IdentityStep, EndStep]], true=[[VertexStep(OUT,vertex), EndStep]]}), PathStep([value(name)])] +---- + +[[anchor-after-optimization-choose-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], PathStep([value(name)])] +---- + +.output +---- +[a1, b1] +[a1, b2] +[a2] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" +DEBUG 2018-08-12 19:31:50,944 [main] org.umlg.sqlg.strategy.SqlgSqlExecutor: +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" LEFT JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" +WHERE + ("public"."E_ab"."public.A__O" IS NULL) +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/dropStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/dropStep.adoc new file mode 100644 index 000000000..bcf8af2d3 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/dropStep.adoc @@ -0,0 +1,172 @@ +==== Drop Step + +link:{tinkerpop-docs}#drop-step[`Drop Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testsDropStepTrivial() { + this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a3"); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal().V().hasLabel("A").drop(); + printTraversalForm(traversal); + + traversal.iterate(); + this.sqlgGraph.tx().commit(); + + assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-drop-step-trivial]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), DropStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-drop-step-trivial]] +.After optimization +---- +[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier] +---- + +.sql +[source,sql,options="nowrap"] +---- +TRUNCATE ONLY "public"."V_A" <1> +---- + +<1> As vertex label 'A' has no in or out edges nor are there any predicates the `TRUNCATE` command is used. + +[source,java,options="nowrap"] +---- +@Test +public void testsDropStepWithHas() { + this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a3"); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .has("name", P.within("a1", "a2")) + .drop(); + printTraversalForm(traversal); + + traversal.iterate(); + this.sqlgGraph.tx().commit(); + + assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-drop-step-with-has]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A), name.within([a1, a2])]), DropStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-drop-step-with-has]] +.After optimization +---- +[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier] +---- + +.sql +[source,sql,options="nowrap"] +---- +WITH todelete AS ( +SELECT + "public"."V_A"."ID" AS "alias1" +FROM + "public"."V_A" +WHERE + ( "public"."V_A"."name" in (?, ?)) +) +DELETE FROM "public"."V_A" a USING todelete +WHERE a."ID" = todelete."alias1" <1> +---- + +<1> `DELETE` with a where clause. + +[source,java,options="nowrap"] +---- +@Test +public void testDropStepWithEdges() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + a1.addEdge("ab", b3); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal().V().hasLabel("A").out().drop(); + printTraversalForm(traversal); + + traversal.iterate(); + this.sqlgGraph.tx().commit(); + + assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("B").count().next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-drop-step-with-edges]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), DropStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-drop-step-with-edges]] +.After optimization +---- +[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier] +---- + +.sql +[source,sql,options="nowrap"] +---- +SET CONSTRAINTS ALL DEFERRED <1> + +WITH todelete AS ( +SELECT + "public"."V_B"."ID" AS "alias1" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" +) +DELETE FROM "public"."V_B" a USING todelete +WHERE a."ID" = todelete."alias1" <2> + +WITH todelete AS ( +SELECT + "public"."E_ab"."ID" AS "alias1" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" LEFT JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" +WHERE + ("public"."V_B"."ID" IS NULL) AND + ("public"."E_ab"."public.B__I" IS NOT NULL) +) +DELETE FROM "public"."E_ab" a USING todelete +WHERE a."ID" = todelete."alias1" <3> + +SET CONSTRAINTS ALL IMMEDIATE <4> +---- + +<1> On postgresql we defer (disable) the foreign key constraints. +<2> Delete the 'B' vertices first. As the edge constraints are disabled this is possible. +<3> Delete the edges. +<4>. Enable the foreign key constraints. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/graphStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/graphStep.adoc new file mode 100644 index 000000000..71619b3ea --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/graphStep.adoc @@ -0,0 +1,71 @@ +==== Graph Step + +The link:{tinkerpop-docs}#graph-step[Graph Step] is the start of any traversal. +Sqlg optimizes the graph step by analysing subsequent steps and if possible folding them into a few steps as possible. +Often into only one step, `SqlgGraphStepCompiled`. + +[source,java,options="nowrap"] +---- +@Test +public void showGraphStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b2.addEdge("bc", c2); + this.sqlgGraph.tx().commit(); + + GraphTraversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .out() + .out(); + System.out.println(traversal); + traversal.hasNext(); + System.out.println(traversal); + List c = traversal.toList(); + assertEquals(2, c.size()); +} +---- + +[options="nowrap"] +[[anchor-before-optimization]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)] +---- + +[[anchor-after-optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]] +---- + +The <> output shows the steps that will execute if no optimization is performed. +Without optimization the query `this.sqlgGraph.traversal().V().hasLabel("A").out().out()` will +first get the `A` s, then for each `A` the `B` s and then for each `B` the `C` s. In the above example unoptimized it +would be at least five round trips to the db. Optimized it is only one trip to the db. + +For an embedded db like HSQLDB this is still ok but for a database server like postgresql the performance impact is +significant. + +<> there is only one link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] step. +All the steps have been folded into one step. + +The link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] will generate the following `sql` to retrieve the data. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/hasStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/hasStep.adoc new file mode 100644 index 000000000..2538d3865 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/hasStep.adoc @@ -0,0 +1,146 @@ +==== Has Step + +link:{tinkerpop-docs}#has-step[`Has Step`]s are folded into the <> or <>. + +[source,java,options="nowrap"] +---- +@Test +public void showHasStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b2.addEdge("bc", c2); + this.sqlgGraph.tx().commit(); + + GraphTraversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .out().has("name", "b1") + .out(); + System.out.println(traversal); + traversal.hasNext(); + System.out.println(traversal); + List c = traversal.toList(); + assertEquals(1, c.size()); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-has-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), HasStep([name.eq(b1)]), VertexStep(OUT,vertex)] +---- + +[[anchor-after-optimization-has-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]] +---- + +This example is similar to the <> example except for an additional `HasStep`. +It shows the two `Vertex Step` s and the `Has Step` being folded into the `SqlgGraphStep`. + +The link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] will generate the following `sql` to retrieve the data. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE + ( "public"."V_B"."name" = ?) <1> +---- + +<1> The `Has Step` realizes itself as a sql `where` clause. + +==== Or Step + +link:{tinkerpop-docs}#or-step[`Or Step`]s are folded into the <> or <>. + +[source,java,options="nowrap"] +---- +@Test +public void showOrStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4"); + Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5"); + Vertex c6 = this.sqlgGraph.addVertex(T.label, "C", "name", "c6"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b2.addEdge("bc", c2); + b2.addEdge("bc", c3); + b2.addEdge("bc", c4); + b2.addEdge("bc", c5); + b2.addEdge("bc", c6); + this.sqlgGraph.tx().commit(); + + GraphTraversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .out() + .out() + .or( + __.has("name", "c1"), + __.has("name", "c3"), + __.has("name", "c6") + ); + + System.out.println(traversal); + traversal.hasNext(); + System.out.println(traversal); + List c = traversal.toList(); + assertEquals(3, c.size()); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-or-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex), OrStep([[HasStep([name.eq(c1)])], [HasStep([name.eq(c3)])], [HasStep([name.eq(c6)])]])] +---- + +[[anchor-after-optimization-or-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]] +---- + +This example is similar to the <> example except for an additional `Or Step` which in turn contains three `Has Step` s. +It shows the two `Vertex Step` s the `Or Step` and the `Has Step` s being folded into the `SqlgGraphStep`. + +The link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] will generate the following `sql` to retrieve the data. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE +(("public"."V_C"."name" = ?) OR ("public"."V_C"."name" = ?) OR ("public"."V_C"."name" = ?) +) <1> +---- + +<1> The `Or Step` realizes itself as a sql `where` clause. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/limitStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/limitStep.adoc new file mode 100644 index 000000000..fa77bd5cf --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/limitStep.adoc @@ -0,0 +1,61 @@ +==== Limit Step + +link:{tinkerpop-docs}#limit-step[`Limit Step`] + +Sqlg optimizes `.limit(x)` + +[source,java,options="nowrap"] +---- +@Test +public void testLimitOnVertexLabels() { + for (int i = 0; i < 100; i++) { + this.sqlgGraph.addVertex(T.label, "Person", "name", "person" + i); + } + this.sqlgGraph.tx().commit(); + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("Person") + .order().by("name") + .limit(3) + .values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-limit-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), OrderGlobalStep([[value(name), incr]]), RangeGlobalStep(0,3), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-limit-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], PropertiesStep([name],value)] +---- + +.output +---- +person0 +person1 +person10 +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."ID" AS "alias1", + "public"."V_Person"."name" AS "alias2" +FROM + "public"."V_Person" +ORDER BY + "alias2" ASC +LIMIT 3 OFFSET 0 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/notStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/notStep.adoc new file mode 100644 index 000000000..5553cc00b --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/notStep.adoc @@ -0,0 +1,3 @@ +==== Not Step + +link:{tinkerpop-docs}#not-step[`Not Step`]s are folded into the <> or <>. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/optionalStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/optionalStep.adoc new file mode 100644 index 000000000..96c9f2826 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/optionalStep.adoc @@ -0,0 +1,103 @@ +==== Optional Step + +link:{tinkerpop-docs}#optional-step[`Optional Step`] + +Sqlg optimizes the OptionalStep. + +[source,java,options="nowrap"] +---- +@Test +public void showOptionalStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b1.addEdge("bc", c2); + b1.addEdge("bc", c3); + this.sqlgGraph.tx().commit(); + + List paths = this.sqlgGraph.traversal() + .V().hasLabel("A") + .optional( + __.out().optional( + __.out() + ) + ) + .path().by("name") + .toList(); + for (Path path : paths) { + System.out.println(path); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-optional-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OptionalStep([VertexStep(OUT,vertex), OptionalStep([VertexStep(OUT,vertex)])]), PathStep([value(name)])] +---- + +[[anchor-after-optimization-optional-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], PathStep([value(name)])] +---- + +.output +---- +[a1, b1, c3] +[a1, b1, c2] +[a1, b1, c1] +[a2] +[a1, b2] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4", + "public"."V_B"."ID" AS "alias5", + "public"."V_B"."name" AS "alias6" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" <1> + +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" LEFT JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" +WHERE + ("public"."E_ab"."public.A__O" IS NULL) <2> + +SELECT + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" LEFT JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" +WHERE + ("public"."E_bc"."public.B__O" IS NULL) <3> +---- +<1> Get the 'C's +<2> Get the 'A's that do not have 'B's +<3> Get the 'B's that do not have 'C's \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/orderStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/orderStep.adoc new file mode 100644 index 000000000..efe92ec22 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/orderStep.adoc @@ -0,0 +1,66 @@ +==== Order Step + +link:{tinkerpop-docs}#order-step[`Order Step`] + +Sqlg optimizes the OrderGlobalStep if the data that the order applies to can be retrieved in one sql statement. +If not then order the ordering occurs in java via the OrderGlobalStep as per normal. + +[source,java,options="nowrap"] +---- +@Test +public void testOrderBy() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "a"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "b"); + Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "c"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "a"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "b"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "c"); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal().V().hasLabel("A") + .order().by("name", Order.incr).by("surname", Order.decr); + printTraversalForm(traversal); + + List vertices = traversal.toList(); + for (Vertex v : vertices) { + System.out.println(v.value("name") + " " + v.value("surname")); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-order-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OrderGlobalStep([[value(name), incr], [value(surname), decr]])] +---- + +[[anchor-after-optimization-order-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel]] +---- + +.output +---- +a c +a b +a a +b c +b b +b a +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."surname" AS "alias2", + "public"."V_A"."name" AS "alias3" +FROM + "public"."V_A" +ORDER BY + "alias3" ASC, + "alias2" DESC +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/rangeStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/rangeStep.adoc new file mode 100644 index 000000000..3002c946d --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/rangeStep.adoc @@ -0,0 +1,61 @@ +==== Range Step + +link:{tinkerpop-docs}#range-step[`Range Step`] + +Sqlg optimizes the `RangeGlobalStep` + +[source,java,options="nowrap"] +---- +@Test +public void testRangeOnVertexLabels() { + for (int i = 0; i < 100; i++) { + this.sqlgGraph.addVertex(T.label, "Person", "name", "person" + i); + } + this.sqlgGraph.tx().commit(); + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("Person") + .order().by("name") + .range(1, 4) + .values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-range-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), OrderGlobalStep([[value(name), incr]]), RangeGlobalStep(1,4), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-range-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], PropertiesStep([name],value)] +---- + +.output +---- +person1 +person10 +person11 +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."ID" AS "alias1", + "public"."V_Person"."name" AS "alias2" +FROM + "public"."V_Person" +ORDER BY + "alias2" ASC +LIMIT 3 OFFSET 1 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/countStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/countStep.adoc new file mode 100644 index 000000000..eebd89a1a --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/countStep.adoc @@ -0,0 +1,41 @@ +===== Count Step + +link:{tinkerpop-docs}#count-step[`Count Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testCount() { + this.sqlgGraph.addVertex(T.label, "A", "name", "a"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a"); + this.sqlgGraph.addVertex(T.label, "A", "name", "a"); + this.sqlgGraph.tx().commit(); + DefaultTraversal traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().count(); + printTraversalForm(traversal); + Assert.assertEquals(4, traversal.next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-count-step]] +.Before optimization +---- +[GraphStep(vertex,[]), CountGlobalStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-count-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([count],value), SqlgCountGlobalStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + COUNT(1) +FROM + "public"."V_A" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByCountStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByCountStep.adoc new file mode 100644 index 000000000..dc914dbad --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByCountStep.adoc @@ -0,0 +1,121 @@ +===== Group By and Count Step + +[source,java,options="nowrap"] +---- +@Test +public void testGroupByCount() { + this.sqlgGraph.addVertex(T.label, "A", "name", "a", "age", 1); + this.sqlgGraph.addVertex(T.label, "A", "name", "a", "age", 2); + this.sqlgGraph.addVertex(T.label, "A", "name", "b", "age", 3); + this.sqlgGraph.tx().commit(); + DefaultTraversal> traversal = (DefaultTraversal>) this.sqlgGraph.traversal().V().hasLabel("A") + .group().by("name").by(__.count()); + List> result = traversal.toList(); + Assert.assertEquals(1, result.size()); + Assert.assertTrue(result.get(0).containsKey("a")); + Assert.assertTrue(result.get(0).containsKey("b")); + Assert.assertEquals(2L, result.get(0).get("a"), 0); + Assert.assertEquals(1L, result.get(0).get("b"), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbycount-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), GroupStep(value(name),[CountGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbycount-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + COUNT(1) AS "count", + "public"."V_A"."name" AS "alias1" +FROM + "public"."V_A" +GROUP BY + "public"."V_A"."name" +---- + +[source,java,options="nowrap"] +---- +@Test +public void testDuplicatePathGroupCountQuery() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "age", 1); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 1); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 2); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 3); + Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 3); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 1); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 2); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 3); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + a1.addEdge("ab", b3); + a1.addEdge("ab", b4); + a1.addEdge("ac", c1); + a1.addEdge("ac", c2); + a1.addEdge("ac", c3); + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V(a1).out("ab", "ac").group().by("name").by(__.count()); + Assert.assertEquals(2, traversal.getSteps().size()); + Assert.assertTrue(traversal.getSteps().get(0) instanceof SqlgGraphStep); + Assert.assertTrue(traversal.getSteps().get(1) instanceof SqlgGroupStep); + Map result = traversal.next(); + Assert.assertEquals(1, result.size()); + Assert.assertTrue(result.containsKey("b")); + Assert.assertEquals(7, result.get("b"), 0); + Assert.assertFalse(traversal.hasNext()); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbycount2-step]] +.Before optimization +---- +[GraphStep(vertex,[v[public.A:::1]]), VertexStep(OUT,[ab, ac],vertex), GroupStep(value(name),[CountGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbycount2-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + COUNT(1) AS "count", + "public"."V_C"."name" AS "alias1" +FROM + "public"."V_A" INNER JOIN + "public"."E_ac" ON "public"."V_A"."ID" = "public"."E_ac"."public.A__O" INNER JOIN + "public"."V_C" ON "public"."E_ac"."public.C__I" = "public"."V_C"."ID" +WHERE + ( "public"."V_A"."ID" = ?) +GROUP BY + "public"."V_C"."name"; + +SELECT + COUNT(1) AS "count", + "public"."V_B"."name" AS "alias1" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" +WHERE + ( "public"."V_A"."ID" = ?) +GROUP BY + "public"."V_B"."name"; +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByJoinStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByJoinStep.adoc new file mode 100644 index 000000000..a8109bb9a --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByJoinStep.adoc @@ -0,0 +1,69 @@ +===== Group By with join + +[source,java,options="nowrap"] +---- +@Test +public void testGroupOverOnePropertyWithJoin() { + Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "A"); + Vertex address1 = this.sqlgGraph.addVertex(T.label, "Address", "name", "A", "year", 2); + Vertex address2 = this.sqlgGraph.addVertex(T.label, "Address", "name", "A", "year", 4); + Vertex address3 = this.sqlgGraph.addVertex(T.label, "Address", "name", "C", "year", 6); + Vertex address4 = this.sqlgGraph.addVertex(T.label, "Address", "name", "D", "year", 8); + Vertex address5 = this.sqlgGraph.addVertex(T.label, "Address", "name", "D", "year", 7); + Vertex address6 = this.sqlgGraph.addVertex(T.label, "Address", "name", "D", "year", 6); + person.addEdge("livesAt", address1); + person.addEdge("livesAt", address2); + person.addEdge("livesAt", address3); + person.addEdge("livesAt", address4); + person.addEdge("livesAt", address5); + person.addEdge("livesAt", address6); + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) this.sqlgGraph.traversal() + .V().hasLabel("Person") + .out("livesAt") + .group() + .by("name") + .by(__.values("year").max()); + + printTraversalForm(traversal); + + Map result = traversal.next(); + Assert.assertFalse(traversal.hasNext()); + Assert.assertEquals(3, result.size()); + Assert.assertTrue(result.containsKey("A")); + Assert.assertTrue(result.containsKey("C")); + Assert.assertTrue(result.containsKey("D")); + Assert.assertEquals(4, result.get("A"), 0); + Assert.assertEquals(6, result.get("C"), 0); + Assert.assertEquals(8, result.get("D"), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbyjoin-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), VertexStep(OUT,[livesAt],vertex), GroupStep(value(name),[PropertiesStep([year],value), MaxGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbyjoin-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + MAX("public"."V_Address"."year") AS "alias1", + "public"."V_Address"."name" AS "alias2" +FROM + "public"."V_Person" INNER JOIN + "public"."E_livesAt" ON "public"."V_Person"."ID" = "public"."E_livesAt"."public.Person__O" INNER JOIN + "public"."V_Address" ON "public"."E_livesAt"."public.Address__I" = "public"."V_Address"."ID" +GROUP BY + "public"."V_Address"."name" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMaxStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMaxStep.adoc new file mode 100644 index 000000000..1979f5ae0 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMaxStep.adoc @@ -0,0 +1,135 @@ +===== Group By and Max Step + +[source,java,options="nowrap"] +---- + @Test + public void testGroupByLabelMax() { + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 10); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 20); + this.sqlgGraph.addVertex(T.label, "Person", "name", "C", "age", 100); + this.sqlgGraph.addVertex(T.label, "Person", "name", "D", "age", 40); + + this.sqlgGraph.addVertex(T.label, "Dog", "name", "A", "age", 10); + this.sqlgGraph.addVertex(T.label, "Dog", "name", "B", "age", 200); + this.sqlgGraph.addVertex(T.label, "Dog", "name", "C", "age", 30); + this.sqlgGraph.addVertex(T.label, "Dog", "name", "D", "age", 40); + + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().group().by(T.label).by(__.values("age").max()); + printTraversalForm(traversal); + + Map result = traversal.next(); + Assert.assertFalse(traversal.hasNext()); + Assert.assertEquals(2, result.size()); + Assert.assertTrue(result.containsKey("Person")); + Assert.assertTrue(result.containsKey("Dog")); + Assert.assertEquals(100, result.get("Person"), 0); + Assert.assertEquals(200, result.get("Dog"), 0); + } +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbymax-step]] +.Before optimization +---- +[GraphStep(vertex,[]), GroupStep(label,[PropertiesStep([age],value), MaxGlobalStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbymax-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + MAX("public"."V_Person"."age") AS "alias1" +FROM + "public"."V_Person" + +SELECT + MAX("public"."V_Dog"."age") AS "alias1" +FROM + "public"."V_Dog" +---- + +[source,java,options="nowrap"] +---- +@Test +public void testGroupOverTwoPropertiesWithValues() { + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "surname", "C", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "surname", "D", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "surname", "C", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "surname", "E", "age", 4); + this.sqlgGraph.addVertex(T.label, "Person", "name", "C", "surname", "E", "age", 5); + this.sqlgGraph.tx().commit(); + + DefaultTraversal, Integer>> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person") + ., Integer>group() + .by(__.values("name", "surname").fold()) + .by(__.values("age").max()); + + printTraversalForm(traversal); + + Map, Integer> result = traversal.next(); + Assert.assertTrue(result.containsKey(Arrays.asList("A", "C")) || result.containsKey(Arrays.asList("C", "A"))); + Assert.assertTrue(result.containsKey(Arrays.asList("B", "D")) || result.containsKey(Arrays.asList("D", "B"))); + Assert.assertTrue(result.containsKey(Arrays.asList("B", "E")) || result.containsKey(Arrays.asList("E", "B"))); + Assert.assertTrue(result.containsKey(Arrays.asList("C", "E")) || result.containsKey(Arrays.asList("E", "C"))); + Assert.assertEquals(4, result.size()); + Assert.assertFalse(traversal.hasNext()); + + if (result.containsKey(Arrays.asList("A", "C"))) { + Assert.assertEquals(3, result.get(Arrays.asList("A", "C")), 0); + } else { + Assert.assertEquals(3, result.get(Arrays.asList("C", "A")), 0); + } + if (result.containsKey(Arrays.asList("B", "D"))) { + Assert.assertEquals(2, result.get(Arrays.asList("B", "D")), 0); + } else { + Assert.assertEquals(2, result.get(Arrays.asList("D", "B")), 0); + } + if (result.containsKey(Arrays.asList("B", "E"))) { + Assert.assertEquals(4, result.get(Arrays.asList("B", "E")), 0); + } else { + Assert.assertEquals(4, result.get(Arrays.asList("E", "B")), 0); + } + if (result.containsKey(Arrays.asList("C", "E"))) { + Assert.assertEquals(5, result.get(Arrays.asList("C", "E")), 0); + } else { + Assert.assertEquals(5, result.get(Arrays.asList("E", "C")), 0); + } +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbymax2-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep([PropertiesStep([name, surname],value), FoldStep],[PropertiesStep([age],value), MaxGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbymax2-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."surname" AS "alias1", + "public"."V_Person"."name" AS "alias2", + MAX("public"."V_Person"."age") AS "alias3" +FROM + "public"."V_Person" +GROUP BY + "public"."V_Person"."name", + "public"."V_Person"."surname" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMeanStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMeanStep.adoc new file mode 100644 index 000000000..9fe74f11e --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMeanStep.adoc @@ -0,0 +1,50 @@ +===== Group By and Mean Step + +[source,java,options="nowrap"] +---- +@Test +public void testGroupOverOnePropertyMean() { + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4); + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) sqlgGraph.traversal() + .V().hasLabel("Person") + .group().by("name").by(__.values("age").mean()); + printTraversalForm(traversal); + Map result = traversal.next(); + Assert.assertFalse(traversal.hasNext()); + Assert.assertTrue(result.containsKey("A")); + Assert.assertTrue(result.containsKey("B")); + Assert.assertEquals(2.0, result.get("A"), 0D); + Assert.assertEquals(3.0, result.get("B"), 0D); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbymean-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), MeanGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbymean-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."name" AS "alias1", + AVG("public"."V_Person"."age") AS "alias2", COUNT(1) AS "alias2_weight" +FROM + "public"."V_Person" +GROUP BY + "public"."V_Person"."name" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMinStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMinStep.adoc new file mode 100644 index 000000000..30c2f438b --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupByMinStep.adoc @@ -0,0 +1,50 @@ +===== Group By and Min Step + +[source,java,options="nowrap"] +---- +@Test +public void testGroupOverOnePropertyMin() { + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4); + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) sqlgGraph.traversal() + .V().hasLabel("Person") + .group().by("name").by(__.values("age").min()); + printTraversalForm(traversal); + Map result = traversal.next(); + Assert.assertFalse(traversal.hasNext()); + Assert.assertTrue(result.containsKey("A")); + Assert.assertTrue(result.containsKey("B")); + Assert.assertEquals(1, result.get("A"), 0); + Assert.assertEquals(2, result.get("B"), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbymin-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), MinGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbymin-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."name" AS "alias1", + MIN("public"."V_Person"."age") AS "alias2" +FROM + "public"."V_Person" +GROUP BY + "public"."V_Person"."name" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupBySumStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupBySumStep.adoc new file mode 100644 index 000000000..45df76311 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/groupBySumStep.adoc @@ -0,0 +1,50 @@ +===== Group By and Sum Step + +[source,java,options="nowrap"] +---- +@Test +public void testGroupOverOnePropertySum() { + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4); + this.sqlgGraph.tx().commit(); + + DefaultTraversal> traversal = (DefaultTraversal) sqlgGraph.traversal() + .V().hasLabel("Person") + .group().by("name").by(__.values("age").sum()); + printTraversalForm(traversal); + Map result = traversal.next(); + Assert.assertFalse(traversal.hasNext()); + Assert.assertTrue(result.containsKey("A")); + Assert.assertTrue(result.containsKey("B")); + Assert.assertEquals(4, result.get("A"), 0L); + Assert.assertEquals(6, result.get("B"), 0L); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-groupbysum-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), SumGlobalStep])] +---- + +[options="nowrap"] +[[anchor-after-optimization-groupbysum-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_Person"."name" AS "alias1", + SUM("public"."V_Person"."age") AS "alias2" +FROM + "public"."V_Person" +GROUP BY + "public"."V_Person"."name" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/maxStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/maxStep.adoc new file mode 100644 index 000000000..9c6cc351a --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/maxStep.adoc @@ -0,0 +1,42 @@ +===== Max Step + +link:{tinkerpop-docs}#max-step[`Max Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testMax() { + this.sqlgGraph.addVertex(T.label, "Person", "age", 1, "x", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 2, "x", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 3, "x", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 0, "x", 1); + this.sqlgGraph.tx().commit(); + + DefaultTraversal traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").max(); + printTraversalForm(traversal); + Assert.assertEquals(3, traversal.next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-max-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MaxGlobalStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-max-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgMaxGlobalStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + MAX("public"."V_Person"."age") AS "alias1" +FROM + "public"."V_Person" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/meanStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/meanStep.adoc new file mode 100644 index 000000000..ed4813f00 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/meanStep.adoc @@ -0,0 +1,42 @@ +===== Mean Step + +link:{tinkerpop-docs}#mean-step[`Mean Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testMean() { + this.sqlgGraph.addVertex(T.label, "Person", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "age", 0); + this.sqlgGraph.tx().commit(); + DefaultTraversal traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").mean(); + printTraversalForm(traversal); + Double d = traversal.next(); + Assert.assertEquals(1.5, d, 0D); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-mean-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MeanGlobalStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-mean-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgAvgGlobalStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + AVG("public"."V_Person"."age") AS "alias1", COUNT(1) AS "alias1_weight" +FROM + "public"."V_Person" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/minStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/minStep.adoc new file mode 100644 index 000000000..8879b76ce --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/minStep.adoc @@ -0,0 +1,42 @@ +===== Min Step + +link:{tinkerpop-docs}#min-step[`Min Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testMin() { + this.sqlgGraph.addVertex(T.label, "Person", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "age", 0); + this.sqlgGraph.tx().commit(); + + DefaultTraversal traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").min(); + Assert.assertEquals(0, traversal.next(), 0); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-min-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MinGlobalStep] +---- + + +[options="nowrap"] +[[anchor-after-optimization-min-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgMinGlobalStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + MIN("public"."V_Person"."age") AS "alias1" +FROM + "public"."V_Person" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/sumStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/sumStep.adoc new file mode 100644 index 000000000..cc01d2f12 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducing/sumStep.adoc @@ -0,0 +1,42 @@ +===== Sum Step + +link:{tinkerpop-docs}#sum-step[`Sum Step`] + +[source,java,options="nowrap"] +---- +@Test +public void testSum() { + this.sqlgGraph.addVertex(T.label, "Person", "age", 1); + this.sqlgGraph.addVertex(T.label, "Person", "age", 2); + this.sqlgGraph.addVertex(T.label, "Person", "age", 3); + this.sqlgGraph.addVertex(T.label, "Person", "age", 0); + this.sqlgGraph.tx().commit(); + + DefaultTraversal traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").sum(); + printTraversalForm(traversal); + Assert.assertEquals(6, traversal.next(), 0L); +} +---- + +[options="nowrap"] +[[anchor-before-optimization-sum-step]] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), SumGlobalStep] +---- + +[options="nowrap"] +[[anchor-after-optimization-sum-step]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgSumGlobalStep] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + SUM("public"."V_Person"."age") AS "alias1" +FROM + "public"."V_Person" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducingSteps.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/reducingSteps.adoc new file mode 100644 index 000000000..e69de29bb diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/repeatStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/repeatStep.adoc new file mode 100644 index 000000000..39d96379a --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/repeatStep.adoc @@ -0,0 +1,166 @@ +==== Repeat Step + +link:{tinkerpop-docs}#repeat-step[`Repeat Step`] + +Sqlg optimizes the `RepeatStep` so long as the `until` modulator is *not* present. +`RepeatStep` can be optimized with the modulator `emit` and `times`. + +===== Repeat Step with emit first + +[source,java,options="nowrap"] +---- +@Test +public void showRepeatStepEmitFirst() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b1.addEdge("bc", c2); + b1.addEdge("bc", c3); + this.sqlgGraph.tx().commit(); + + List paths = this.sqlgGraph.traversal().V().hasLabel("A") + .emit() + .times(2) + .repeat( + __.out() + ) + .path().by("name") + .toList(); + for (Path path : paths) { + System.out.println(path); + } +} +---- + +.output +---- +[a1, b1, c3] +[a1, b1, c2] +[a1, b1, c1] +[a1] +[a2] +[a1, b1] +[a1, b2] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4", + "public"."V_B"."ID" AS "alias5", + "public"."V_B"."name" AS "alias6", + "public"."E_ab"."ID" AS "alias7" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" <1> + +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" <2> + +SELECT + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4", + "public"."E_ab"."ID" AS "alias5" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" <3> +---- +<1> Get the 'A's to emit. +<2> Get the 'B's to emit. +<3> Get the 'C's to emit. + +===== Repeat Step with emit last + +[source,java,options="nowrap"] +---- +@Test +public void showRepeatStepEmitLast() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b1.addEdge("bc", c2); + b1.addEdge("bc", c3); + this.sqlgGraph.tx().commit(); + + List paths = this.sqlgGraph.traversal().V().hasLabel("A") + .repeat( + __.out() + ) + .emit() + .times(2) + .path().by("name") + .toList(); + for (Path path : paths) { + System.out.println(path); + } +} +---- + +.output +---- +[a1, b1, c3] +[a1, b1, c2] +[a1, b1, c1] +[a1, b1] +[a1, b2] +---- + +.sql +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4", + "public"."V_B"."ID" AS "alias5", + "public"."V_B"."name" AS "alias6", + "public"."E_ab"."ID" AS "alias7", + "public"."E_bc"."ID" AS "alias8" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" <1> + +SELECT + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2", + "public"."V_A"."ID" AS "alias3", + "public"."V_A"."name" AS "alias4", + "public"."E_ab"."ID" AS "alias5" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" <2> +---- +<1> Get the 'C's to emit. +<2> Get the 'B's to emit. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/vertexStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/vertexStep.adoc new file mode 100644 index 000000000..d3d341488 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy1/vertexStep.adoc @@ -0,0 +1,58 @@ +==== Vertex Step + +Consecutive link:{tinkerpop-docs}#vertex-steps[`Vertex Step`] are folded into the <>. + +[source,java,options="nowrap"] +---- +@Test +public void showVertexStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + b2.addEdge("bc", c2); + this.sqlgGraph.tx().commit(); + + GraphTraversal traversal = this.sqlgGraph.traversal().V() + .hasLabel("A") + .out() + .out(); + System.out.println(traversal); + traversal.hasNext(); + System.out.println(traversal); + List c = traversal.toList(); + assertEquals(2, c.size()); +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)] +---- + +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]] +---- + +This example is the same as the <>. It shows the two `Vertex Steps` being folded into the `SqlgGraphStep`. + +The link:{apidocs}/org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`] will generate the following `sql` to retrieve the data. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/andStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/andStep.adoc new file mode 100644 index 000000000..2c8e99406 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/andStep.adoc @@ -0,0 +1,80 @@ +==== And Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2AndStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + a1.addEdge("ab", b1); + a1.addEdge("abb", b1); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + a2.addEdge("abb", b2); + Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + a3.addEdge("abbb", b3); + + Traversal traversal = this.sqlgGraph.traversal().V().hasLabel("A").and( + __.out("ab"), + __.out("abb") + ).values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), AndStep([[VertexStep(OUT,[ab],vertex)], [VertexStep(OUT,[abb],vertex)]]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-and-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgAndStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2),(3, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_abb" ON "public"."V_A"."ID" = "public"."E_abb"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_abb"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2),(3, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" +---- + +.output +---- +a1 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/chooseStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/chooseStep.adoc new file mode 100644 index 000000000..a49a509a2 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/chooseStep.adoc @@ -0,0 +1,54 @@ +==== Choose Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2ChooseStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "a3"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "a4"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V() + .hasLabel("A") + .choose( + v -> v.label().equals("A"), + __.out(), + __.in() + ).values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- + +---- + +[options="nowrap"] +[[anchor-after-optimization-choose-step-strategy2,after optimization]] +.After optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), ChooseStep([LambdaFilterStep(lambda), HasNextStep],{false=[[VertexStep(IN,vertex), EndStep]], true=[[VertexStep(OUT,vertex), EndStep]]}), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgChooseStepBarrier([LambdaFilterStep(lambda)],{false=[[SqlgVertexStep, EndStep]], true=[[SqlgVertexStep@[~gremlin.incidentToAdjacent], EndStep]]}), PropertiesStep([name],value)] +---- + +.output +---- +a4 +a3 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/localStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/localStep.adoc new file mode 100644 index 000000000..dcee9d9f3 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/localStep.adoc @@ -0,0 +1,104 @@ +==== Local Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2LocalStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + Vertex c11 = this.sqlgGraph.addVertex(T.label, "C", "name", "c11"); + Vertex c12 = this.sqlgGraph.addVertex(T.label, "C", "name", "c12"); + Vertex c13 = this.sqlgGraph.addVertex(T.label, "C", "name", "c13"); + Vertex c21 = this.sqlgGraph.addVertex(T.label, "C", "name", "c21"); + Vertex c22 = this.sqlgGraph.addVertex(T.label, "C", "name", "c22"); + Vertex c23 = this.sqlgGraph.addVertex(T.label, "C", "name", "c23"); + Vertex c31 = this.sqlgGraph.addVertex(T.label, "C", "name", "c31"); + Vertex c32 = this.sqlgGraph.addVertex(T.label, "C", "name", "c32"); + Vertex c33 = this.sqlgGraph.addVertex(T.label, "C", "name", "c33"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + a1.addEdge("ab", b3); + b1.addEdge("bc", c11); + b1.addEdge("bc", c12); + b1.addEdge("bc", c13); + b2.addEdge("bc", c21); + b2.addEdge("bc", c22); + b2.addEdge("bc", c23); + b3.addEdge("bc", c31); + b3.addEdge("bc", c32); + b3.addEdge("bc", c33); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V(a1) + .local( + __.out().limit(1).out() + ).values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[v[public.A:::1]]), LocalStep([VertexStep(OUT,vertex), RangeGlobalStep(0,1), VertexStep(OUT,vertex)]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-local-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], LocalStep([SqlgVertexStep@[sqlgPathOrderRangeLabel], SqlgVertexStep@[sqlgPathFakeLabel]]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- + +---- + +.output +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" +WHERE + ( "public"."V_A"."ID" = ?) + +SELECT + 1 as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" +WHERE + "public"."V_A"."ID" = 1 +ORDER BY + "index" +LIMIT 1 OFFSET 0 <1> + +SELECT + 1 as "index", + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE + "public"."V_B"."ID" = 1 +ORDER BY + "index" +---- + +<1> In this case the query is simple enough for the `LIMIT` to be executed on the database. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/notStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/notStep.adoc new file mode 100644 index 000000000..6098fbf85 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/notStep.adoc @@ -0,0 +1,63 @@ +==== Not Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2NotStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + a1.addEdge("ab", b1); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("A") + .not( + __.out() + ).values("name"); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), NotStep([VertexStep(OUT,vertex)]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-not-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgNotStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" +---- + +.output +---- +a2 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/optionalStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/optionalStep.adoc new file mode 100644 index 000000000..b43f2ad63 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/optionalStep.adoc @@ -0,0 +1,99 @@ +==== Optional Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2OptionalStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + b1.addEdge("bc", c1); + + + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("A") + .optional( + __.repeat( + __.out() + ).times(2) + ) + .values("name"); + printTraversalForm(traversal); + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OptionalStep([RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(2)),emit(false))]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-repeat-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgOptionalStepBarrier([SqlgRepeatStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel], SqlgRepeatEndStepBarrier],until(loops(2)),emit(false))]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" + +SELECT + 3 as "index", + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE + "public"."V_B"."ID" = 2 +ORDER BY + "index" + +SELECT + 4 as "index", + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" +WHERE + "public"."V_B"."ID" = 1 +ORDER BY + "index" +---- + +.output +---- +a2 +c1 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/orStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/orStep.adoc new file mode 100644 index 000000000..19d9d1036 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/orStep.adoc @@ -0,0 +1,100 @@ +==== Or Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2OrStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + a1.addEdge("ab", b1); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + a2.addEdge("abb", b2); + Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + a3.addEdge("abbb", b3); + Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4"); + Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b4"); + a4.addEdge("abbbb", b4); + + + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("A") + .or( + __.out("ab"), + __.out("abb"), + __.out("abbb") + ).values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OrStep([[VertexStep(OUT,[ab],vertex)], [VertexStep(OUT,[abb],vertex)], [VertexStep(OUT,[abbb],vertex)]]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-or-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgOrStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2),(3, 3),(4, 4)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_abb" ON "public"."V_A"."ID" = "public"."E_abb"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_abb"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(2, 1),(3, 2),(4, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_abbb" ON "public"."V_A"."ID" = "public"."E_abbb"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_abbb"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(3, 1),(4, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" +---- + +.output +---- +a1 +a2 +a3 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/repeatStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/repeatStep.adoc new file mode 100644 index 000000000..c63f43f1d --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/repeatStep.adoc @@ -0,0 +1,177 @@ +==== Repeat Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2RepeatStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b4"); + Vertex b5 = this.sqlgGraph.addVertex(T.label, "B", "name", "b5"); + Vertex b6 = this.sqlgGraph.addVertex(T.label, "B", "name", "b6"); + Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1"); + Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2"); + Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3"); + Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4"); + Vertex x = this.sqlgGraph.addVertex(T.label, "X", "name", "hallo"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + a1.addEdge("ab", b3); + a2.addEdge("ab", b4); + a2.addEdge("ab", b5); + a2.addEdge("ab", b6); + + b1.addEdge("bx", x); + + b4.addEdge("bc", c1); + b4.addEdge("bc", c2); + b4.addEdge("bc", c3); + + c1.addEdge("cx", x); + + this.sqlgGraph.tx().commit(); + + Traversal t = this.sqlgGraph.traversal() + .V().hasLabel("A") + .repeat(__.out()) + .until(__.out().has("name", "hallo")) + .values("name"); + printTraversalForm(t); + + List names = t.toList(); + for (String name: names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until([VertexStep(OUT,vertex), HasStep([name.eq(hallo)])]),emit(false)), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-repeat-step-strategy1,after optimization]] +.After optimization +---- +post-strategy:[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgRepeatStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel], SqlgRepeatEndStepBarrier],until([SqlgVertexStep@[sqlgPathFakeLabel]]),emit(false)), PropertiesStep([name],value)] +---- + + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" <1> + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" <2> + +SELECT + "index" as "index", + "public"."V_X"."ID" AS "alias1", + "public"."V_X"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bx" ON "public"."V_B"."ID" = "public"."E_bx"."public.B__O" INNER JOIN + "public"."V_X" ON "public"."E_bx"."public.X__I" = "public"."V_X"."ID" INNER JOIN + (VALUES(3, 1),(2, 2),(1, 3),(6, 4),(5, 5),(4, 6)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId" +WHERE + ( "public"."V_X"."name" = ?) +ORDER BY + "index" <3> + +SELECT + "index" as "index", + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" INNER JOIN + (VALUES(3, 1),(2, 2),(1, 3),(6, 4),(5, 5),(4, 6)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId" +WHERE + ( "public"."V_C"."name" = ?) +ORDER BY + "index" <4> + +SELECT + "index" as "index", + "public"."V_X"."ID" AS "alias1", + "public"."V_X"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bx" ON "public"."V_B"."ID" = "public"."E_bx"."public.B__O" INNER JOIN + "public"."V_X" ON "public"."E_bx"."public.X__I" = "public"."V_X"."ID" INNER JOIN + (VALUES(3, 3),(2, 4),(6, 5),(5, 6),(4, 7)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId" +ORDER BY + "index" <5> + +SELECT + "index" as "index", + "public"."V_C"."ID" AS "alias1", + "public"."V_C"."name" AS "alias2" +FROM + "public"."V_B" INNER JOIN + "public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN + "public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" INNER JOIN + (VALUES(3, 3),(2, 4),(6, 5),(5, 6),(4, 7)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId" +ORDER BY + "index" <6> + +SELECT + "index" as "index", + "public"."V_X"."ID" AS "alias1", + "public"."V_X"."name" AS "alias2" +FROM + "public"."V_C" INNER JOIN + "public"."E_cx" ON "public"."V_C"."ID" = "public"."E_cx"."public.C__O" INNER JOIN + "public"."V_X" ON "public"."E_cx"."public.X__I" = "public"."V_X"."ID" INNER JOIN + (VALUES(3, 7),(2, 8),(1, 9)) AS tmp ("tmpId", "index") ON "public"."V_C"."ID" = tmp."tmpId" +WHERE + ( "public"."V_X"."name" = ?) +ORDER BY + "index" <7> + +SELECT + "index" as "index", + "public"."V_X"."ID" AS "alias1", + "public"."V_X"."name" AS "alias2" +FROM + "public"."V_C" INNER JOIN + "public"."E_cx" ON "public"."V_C"."ID" = "public"."E_cx"."public.C__O" INNER JOIN + "public"."V_X" ON "public"."E_cx"."public.X__I" = "public"."V_X"."ID" INNER JOIN + (VALUES(3, 8),(2, 9)) AS tmp ("tmpId", "index") ON "public"."V_C"."ID" = tmp."tmpId" +ORDER BY + "index" <8> +---- + +<1> Get all the `A` s. +<2> Get all the `B` s for the incoming `A` s. This represent the first `out` iteration of the `repeat`. +<3> The `until` traversal executed for all the incoming `B` s going out to `X`. +<4> The `until` traversal executed for all the incoming `B` s going out to `C`. +<5> Get all the `X` for the incoming `B` s. This is the second `out` iteration of the `repeat`. +<6> Get all the `C` for the incoming `B` s. This is the second `out` iteration of the `repeat`. +<7> The `until` traversal executed for all the incoming `C` s going out to `X`. +<8> Get all the `X` for the incoming `C` s. This is the third `out` iteration of the `repeat`. + +.output +---- +b1 +c1 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/vertexStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/vertexStep.adoc new file mode 100644 index 000000000..1500da49c --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/vertexStep.adoc @@ -0,0 +1,78 @@ +==== Vertex Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2VertexStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + a1.addEdge("ab", b1); + a2.addEdge("ab", b2); + a3.addEdge("ab", b3); + this.sqlgGraph.tx().commit(); + + Traversal t = this.sqlgGraph.traversal() + .V().hasLabel("A") + .limit(2) + .out() + .values("name"); + printTraversalForm(t); + List result = t.toList(); + for (String name : result) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.output +---- +b1 +b2 +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), RangeGlobalStep(0,2), VertexStep(OUT,vertex), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-vertex-step,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], SqlgVertexStep@[sqlgPathFakeLabel], PropertiesStep([name],value)] +---- + +<> shows that there is a link:{apidocs}/org/umlg/sqlg/step/SqlgVertexStep.html[`SqlgVertexStep`] +after the `SqlgGraphStep`. The `SqlgVertexStep` will barrier the incoming `A` s and execute the next traversal for all +the incoming elements in one `sql` statement. + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" +LIMIT 2 OFFSET 0 <1> + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" <2> +---- + +<1> Get all the `A` s. +<2> For all the previously fetched `A` s get the `B` s. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/whereStep.adoc b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/whereStep.adoc new file mode 100644 index 000000000..8fe6cc825 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/gremlin/strategy2/whereStep.adoc @@ -0,0 +1,64 @@ +==== Where Step + +[source,java,options="nowrap"] +---- +@Test +public void testStrategy2WhereStep() { + Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1"); + Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2"); + Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1"); + Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2"); + Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3"); + a1.addEdge("ab", b1); + a1.addEdge("ab", b2); + a1.addEdge("ab", b3); + a2.addEdge("ab", b1); + this.sqlgGraph.tx().commit(); + + Traversal traversal = this.sqlgGraph.traversal() + .V().hasLabel("A") + .where( + __.out() + ).values("name"); + printTraversalForm(traversal); + + List names = traversal.toList(); + for (String name : names) { + System.out.println(name); + } +} +---- + +[options="nowrap"] +.Before optimization +---- +[GraphStep(vertex,[]), HasStep([~label.eq(A)]), TraversalFilterStep([VertexStep(OUT,vertex)]), PropertiesStep([name],value)] +---- + +[options="nowrap"] +[[anchor-after-optimization-where-step-strategy2,after optimization]] +.After optimization +---- +[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgTraversalFilterStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel]]), PropertiesStep([name],value)] +---- + +[source,sql,options="nowrap"] +---- +SELECT + "public"."V_A"."ID" AS "alias1", + "public"."V_A"."name" AS "alias2" +FROM + "public"."V_A" + +SELECT + "index" as "index", + "public"."V_B"."ID" AS "alias1", + "public"."V_B"."name" AS "alias2" +FROM + "public"."V_A" INNER JOIN + "public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN + "public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN + (VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId" +ORDER BY + "index" +---- diff --git a/sqlg-doc/docs/2.1.4/include/indexes.adoc b/sqlg-doc/docs/2.1.4/include/indexes.adoc new file mode 100644 index 000000000..fafe5a318 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/indexes.adoc @@ -0,0 +1,159 @@ +== Indexes + +=== Basic indexing + +Sqlg supports adding a unique or non-unique index to any property or properties. + +To add an index one has to use Sqlg's topology interface. + +[source,java,options="nowrap"] +---- +@Test +public void testIndex() { + VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", new HashMap() {{ + put("name", PropertyType.STRING); + }}); # <1> + Optional namePropertyOptional = personVertexLabel.getProperty("name"); + assertTrue(namePropertyOptional.isPresent()); + Index index = personVertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(namePropertyOptional.get())); $ <2> + this.sqlgGraph.tx().commit(); # <3> + + this.sqlgGraph.addVertex(T.label, "Person", "name", "John"); + List johns = this.sqlgGraph.traversal().V() + .hasLabel("Person") + .has("name", "John") + .toList(); # <4> + + /* This will execute the following sql. + SELECT + "public"."V_Person"."ID" AS "alias1", + "public"."V_Person"."name" AS "alias2" + FROM + "public"."V_Person" + WHERE + ( "public"."V_Person"."name" = ?) + */ # <5> + + assertEquals(1, johns.size()); +} +---- +<1> Create the 'Person' VertexLabel. +<2> On the 'Person' VertexLabel create a non unique index on the 'name' property. +<3> Index creation is transactional on Postgresql. +<4> The given gremlin query will use the index. +<5> The underlying RDBMS will use the index for the executed sql. + +.postgresql V_Person sql definition +image:sqlg/V_Person_name_index.png[image of tinkerpop-classic] + +==== Composite indexes + +It is possible to create composite indexes. + +[source,java,options="nowrap"] +---- +@Test +public void testCompositeIndex() { + VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", new HashMap() {{ + put("firstName", PropertyType.STRING); + put("lastName", PropertyType.STRING); + }}); # <1> + personVertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, new ArrayList<>(personVertexLabel.getProperties().values())); # <2> + this.sqlgGraph.tx().commit(); + this.sqlgGraph.addVertex(T.label, "Person", "firstName", "John", "lastName", "Smith"); + List johnSmiths = this.sqlgGraph.traversal().V() + .hasLabel("Person") + .has("firstName", "John") + .has("lastName", "Smith") + .toList(); + assertEquals(1, johnSmiths.size()); +} +---- +<1> Create the 'Person' VertexLabel with 2 properties, 'firstName' and 'lastName'. +<2> Create a composite index on 'firstName' and 'lastName' + +.postgresql V_Person composite index sql definition +image:sqlg/postgresql_composite_index.png[image of tinkerpop-classic] + +Outside of creating the index Sqlg has no further direct interaction with the index. However gremlin queries with a +`HasStep` targeting a property with an index on it will translate to a sql `where` clause on that property and +the underlying RDBMS will utilize the index. + +[NOTE] +The index does not need to be created upfront. It can be added any time. + + +[[anchor-full-text-indexing, full text indexing]] +=== Full-text indexing + +On postgresql full text indexing is supported. + +[source,java,options="nowrap"] +---- +@Test +public void testFullTextIndex() { + Vertex v0 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "a fat cat sat on a mat and ate a fat rat"); + Vertex v1 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "fatal error"); + Vertex v2 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "error is not fatal"); + + VertexLabel vl = this.sqlgGraph.getTopology().getVertexLabel("public", "Sentence").get(); + vl.ensureIndexExists(IndexType.getFullTextGIN("english"), Collections.singletonList(vl.getProperty("name").get())); <1> + this.sqlgGraph.tx().commit(); + + List vts = this.sqlgGraph.traversal() + .V().hasLabel("Sentence") + .has("name", FullText.fullTextMatch("english", "fat & rat")) <2> + .toList(); + Assert.assertEquals(1, vts.size()); + Assert.assertTrue(vts.contains(v0)); +} +---- +<1> Create a full-text gin index. +<2> Query the full-text index using Sqlg's custom FullText predicate. + +=== Global unique indexing + +Global unique indexing is a way of specifying that multiple properties across different labels are unique. +For every `GlobalUniqueIndex` Sqlg maintains a separate table with a unique index defined on it. +Every property that partakes in the GlobalUniqueIndex will have its value duplicated in this table. +These tables are kept in the `gui_schema` + +[source,java,options="nowrap"] +---- +@Test +public void testPersonAndDogDoNotHaveTheSameName() { + Map properties = new HashMap() {{ + put("name", PropertyType.STRING); + }}; # <1> + VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", properties); # <2> + VertexLabel dogVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Dog", properties); # <3> + PropertyColumn personName = personVertexLabel.getProperty("name").get(); # <4> + PropertyColumn dogName = dogVertexLabel.getProperty("name").get(); # <5> + this.sqlgGraph.getTopology().ensureGlobalUniqueIndexExist(new HashSet() {{ + add(personName); + add(dogName); + }}); # <6> + this.sqlgGraph.tx().commit(); + + this.sqlgGraph.addVertex(T.label, "Person", "name", "Tyson"); # <7> + try { + //This will fail + this.sqlgGraph.addVertex(T.label, "Dog", "name", "Tyson"); # <8> + fail("Duplicate key violation suppose to prevent this from executing"); + } catch (RuntimeException e) { + //swallow + this.sqlgGraph.tx().rollback(); + } +} +---- +<1> A map of the properties to add. +<2> Create the 'Person' VertexLabel with its properties. +<3> Create the 'Dog' VertexLabel with its properties. +<4> Get the `PropertyColumn` for the 'name' property of 'Person'. +<5> Get the `PropertyColumn` for the 'name' property of 'Dog'. +<6> Create the `GlobalUniqueIndex` on the 'name' property of 'Person' and 'Dog'. This will ensure that 'Person's and 'Dog's do not have the same name. +<7> Add a 'Person' with the name "Tyson". +<8> Try to add a 'Dog' with the name "Tyson". This will fail as the `GlobalUniqueIndex' will prevent 'Person's and 'Dog's from having the same name. + + +GlobalUniqueIndexes do not support composite indexes. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/introduction.adoc b/sqlg-doc/docs/2.1.4/include/introduction.adoc new file mode 100644 index 000000000..49ad13b32 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/introduction.adoc @@ -0,0 +1,11 @@ +== Introduction + +Sqlg primary challenge is to reduce latency by combining TinkerPop +{tinkerpop-docs}#graph-traversal-steps[steps] into as few as possible database calls. +The fine-grained nature of graph traversals makes this crucial, +otherwise the database call latency has prohibitively high performance impact. + +Sqlg supports various bulk modes to reduce latency when modifying the graph. + +[NOTE] +Hsqldb and H2 do not suffer the same latency as Postgresql, MSSqlServer and MariaDB as it runs embedded in the jvm. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/license.adoc b/sqlg-doc/docs/2.1.4/include/license.adoc new file mode 100644 index 000000000..866c17635 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/license.adoc @@ -0,0 +1,3 @@ +== License + +image:github/SVG/law.svg[MIT] https://github.com/pietermartin/sqlg/blob/master/LICENSE[MIT] \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/limitations.adoc b/sqlg-doc/docs/2.1.4/include/limitations.adoc new file mode 100644 index 000000000..d3ba740a2 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/limitations.adoc @@ -0,0 +1,3 @@ +== Limitations + +Postgresql schema, table and column names can not be more than 63 characters long. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/multipleJvm.adoc b/sqlg-doc/docs/2.1.4/include/multipleJvm.adoc new file mode 100644 index 000000000..f69533c86 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/multipleJvm.adoc @@ -0,0 +1,19 @@ +== Multiple JVMs + +It is possible to run many Sqlg instances pointing to the same underlying database. These instances can be in the same jvm +but is primarily intended for separate jvm(s) pointing to the same underlying database. + +To make multiple graphs point to the same underlying database it is important to add in the `distributed` property to `sqlg.properties`. + +.sqlg.properties +---- +distributed = true +---- + +[NOTE] +Multiple JVMs is only supported for Postgresql. +Hsqldb and H2 are primarily intended to run embedded so multiple JVMs do not make sense for them. +Multiple JVM support has not been implemented for MariaDB and MSSqlServer. + +Postgresql's https://www.postgresql.org/docs/current/static/sql-notify.html[*notify*] mechanism is used to distribute the cached schema +across multiple JVMs. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/postgresqlPartitioning.adoc b/sqlg-doc/docs/2.1.4/include/postgresqlPartitioning.adoc new file mode 100644 index 000000000..beb39b8d4 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/postgresqlPartitioning.adoc @@ -0,0 +1,170 @@ +== Postgresql Partitioning + +Sqlg supports `postgresql` partitioning. To partition a table it needs to be created upfront using the `Topology` api. +Sqlg currently supports `RANGE`, `LIST` and `HASH` partitions. + +=== Range partitioning + +[source,java,options="nowrap"] +---- +@Test +public void testPartitioningRange() { + Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema(); # <1> + VertexLabel partitionedVertexLabel = publicSchema.ensurePartitionedVertexLabelExist( + "Measurement", + new LinkedHashMap() {{ + put("date", PropertyType.LOCALDATE); + put("temp", PropertyType.INTEGER); + }}, + ListOrderedSet.listOrderedSet(Collections.singletonList("date")), + PartitionType.RANGE, #<2> + "date"); # <3> + partitionedVertexLabel.ensureRangePartitionExists("measurement1", "'2016-07-01'", "'2016-08-01'"); # <4> + partitionedVertexLabel.ensureRangePartitionExists("measurement2", "'2016-08-01'", "'2016-09-01'"); # <5> + this.sqlgGraph.tx().commit(); + + LocalDate localDate1 = LocalDate.of(2016, 7, 1); + this.sqlgGraph.addVertex(T.label, "Measurement", "date", localDate1); + LocalDate localDate2 = LocalDate.of(2016, 8, 1); + this.sqlgGraph.addVertex(T.label, "Measurement", "date", localDate2); + this.sqlgGraph.tx().commit(); + + Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("Measurement").count().next(), 0); + Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate1).count().next(), 0); + Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate2).count().next(), 0); + + Partition partition = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("Measurement").get().getPartition("measurement1").get(); # <6> + partition.remove(); # <7> + this.sqlgGraph.tx().commit(); + + Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").count().next(), 0); + Assert.assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate1).count().next(), 0); + Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate2).count().next(), 0); + + Assert.assertEquals(1, this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PARTITION).count().next(), 0); # <8> +} +---- +<1> Get the 'public' schema object. +<2> Indicates a `RANGE` partition. +<3> Create a `VertexLabel` with a range partition on the `date` field. +<4> Create a named partition for the range '2016-07-01' to '2016-08-01'. +<5> Create a named partition for the range '2016-08-01' to '2016-09-01'. +<6> Using the `Topology` api get the `measurement1` partition. +<7> Remove the `measurement1` partition. +<8> Assert that `Sqlg`s topology only has one partition. + +=== List partitioning + +[source,java,options="nowrap"] +---- +//the partitionExpression 'left(lower(name), 1)' is to complex for the query planner to optimize. +//i.e. select * from Cities where name = 'asdasd' willscan all partitions. +@Test +public void testPartitioningList() { + Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema(); + VertexLabel partitionedVertexLabel = publicSchema.ensurePartitionedVertexLabelExist("Cities", + new LinkedHashMap() {{ + put("name", PropertyType.STRING); + put("population", PropertyType.LONG); + }}, + ListOrderedSet.listOrderedSet(Collections.singletonList("name")), + PartitionType.LIST, # <1> + "left(lower(name), 1)"); # <2> + partitionedVertexLabel.ensureListPartitionExists("Cities_a", "'a'"); # <3> + partitionedVertexLabel.ensureListPartitionExists("Cities_b", "'b'"); + partitionedVertexLabel.ensureListPartitionExists("Cities_c", "'c'"); + partitionedVertexLabel.ensureListPartitionExists("Cities_d", "'d'"); + this.sqlgGraph.tx().commit(); + + this.sqlgGraph.tx().normalBatchModeOn(); + for (int i = 0; i < 100; i++) { + this.sqlgGraph.addVertex(T.label, "Cities", "name", "aasbc", "population", 1000L); + } + this.sqlgGraph.addVertex(T.label, "Cities", "name", "basbc", "population", 1000L); + for (int i = 0; i < 100; i++) { + this.sqlgGraph.addVertex(T.label, "Cities", "name", "casbc", "population", 1000L); + } + this.sqlgGraph.addVertex(T.label, "Cities", "name", "dasbc", "population", 1000L); + this.sqlgGraph.tx().commit(); + + Assert.assertEquals(202, this.sqlgGraph.traversal().V().hasLabel("Cities").count().next(), 0); + Assert.assertEquals(100, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "aasbc").count().next(), 0); + Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "basbc").count().next(), 0); + Assert.assertEquals(100, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "casbc").count().next(), 0); + + Partition partition = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("Cities").get().getPartition("Cities_a").get(); + partition.remove(); + this.sqlgGraph.tx().commit(); + + Assert.assertEquals(102, this.sqlgGraph.traversal().V().hasLabel("Cities").count().next(), 0); + Assert.assertEquals(3, this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PARTITION).count().next(), 0); +} +---- + +<1> Indicates a `LIST` partition. +<2> The partition expression. +<3> Create a named partition for the list entry 'a'. + +=== Hash partitioning + +[source,java,options="nowrap"] +---- +@Test +public void testPartitioningHash() { + VertexLabel vertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensurePartitionedVertexLabelExist( + "A", + new LinkedHashMap<>() {{ + put("uid1", PropertyType.INTEGER); + put("name", PropertyType.STRING); + put("surname", PropertyType.STRING); + }}, + ListOrderedSet.listOrderedSet(List.of("uid1")), + PartitionType.HASH, <1> + "\"uid1\"" <2> + ); + for (int i = 0; i < 10; i++) { + vertexLabel.ensureHashPartitionExists("hashPartition" + i, 10, i); <3> + } + this.sqlgGraph.tx().commit(); + for (int i = 0; i < 1000; i++) { + this.sqlgGraph.addVertex(T.label, "A", "uid1", i, "name", "name" + i, "surname", "surname" + i); + } + this.sqlgGraph.tx().commit(); + Assert.assertEquals(1000, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0); + + Connection connection = this.sqlgGraph.tx().getConnection(); + try (Statement s = connection.createStatement()) { + ResultSet rs = s.executeQuery("select tableoid::regclass as partition_name, count(*) from \"V_A\" group by 1 order by 1;"); <4> + int count = 0; + Map partitionDistributionCount = new HashMap<>(); + while (rs.next()) { + count++; + partitionDistributionCount.put(rs.getString(1), rs.getLong(2)); + } + Assert.assertEquals(10, count); <5> + Assert.assertEquals(10, partitionDistributionCount.size()); + for (int i = 0; i < 10; i++) { + Assert.assertTrue(partitionDistributionCount.containsKey("\"hashPartition" + i + "\"")); + } + Assert.assertEquals(100, partitionDistributionCount.get("\"hashPartition0\""), 0); + Assert.assertEquals(92, partitionDistributionCount.get("\"hashPartition1\""), 0); + Assert.assertEquals(103, partitionDistributionCount.get("\"hashPartition2\""), 0); + Assert.assertEquals(88, partitionDistributionCount.get("\"hashPartition3\""), 0); + Assert.assertEquals(113, partitionDistributionCount.get("\"hashPartition4\""), 0); + Assert.assertEquals(90, partitionDistributionCount.get("\"hashPartition5\""), 0); + Assert.assertEquals(119, partitionDistributionCount.get("\"hashPartition6\""), 0); + Assert.assertEquals(92, partitionDistributionCount.get("\"hashPartition7\""), 0); + Assert.assertEquals(100, partitionDistributionCount.get("\"hashPartition8\""), 0); + Assert.assertEquals(103, partitionDistributionCount.get("\"hashPartition9\""), 0); + } catch (SQLException throwables) { + Assert.fail(throwables.getMessage()); + } + +} +---- + +<1> Indicates a `HASH` partition. +<2> The partition expression. +<3> Create a named partition for the hash entry with it `modulus` and `remainder`. +<4> Fetch the partitions for the assertion +<5> Assert that there are as many partitions as the `modulus` diff --git a/sqlg-doc/docs/2.1.4/include/sqlgui.adoc b/sqlg-doc/docs/2.1.4/include/sqlgui.adoc new file mode 100644 index 000000000..ad5764df5 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/sqlgui.adoc @@ -0,0 +1,86 @@ +== Sqlg ui + +Sqlg includes a basic ui to visualize and delete/remove schema elements. + +[WARNING] +Sqlg' ui is very dangerous as it allows for deletion of schema elements including RDBMS schemas. Use with care and ideally do not expose to a wide audience. + +=== Startup + +The ui uses http://sparkjava.com[*Sparkjava*] as its web framework. + +There are two ways in which to start the ui. + +.Embedded + +To use a completely standalone Jetty you can run the following code, + + //SqlgUI.initialize(); <1> + SqlgUI.initialize(8181); + SqlgUI.set(sqlgGraph); + +<1> The default port is `4567` + +To use an existing embedded Jetty you can use the following setup. + +---- + //Define your filer +FilterHolder filterHolderSqlgUI = contextHandler.addFilter("spark.servlet.SparkFilter", "/sqlg/*", EnumSet.of(DispatcherType.REQUEST)); +filterHolderSqlgUI.setInitParameter("applicationClass", "org.umlg.sqlg.ui.SparkResources"); + +//Websocket servlet +ServletHolder websocketServletHolder = new ServletHolder(new SqlgWebsocketServlet()); +websocketServletHolder.setName("Sqlg-ui websocket servlet"); +contextHandler.addServlet(websocketServletHolder, "/sqlg/data/v1/websocket"); + +... + +SqlgUI.set(sqlgGraph); +---- + +.Webserver + + SparkFilter + spark.servlet.SparkFilter + + applicationClass + com.company.YourApplication + + + + SparkFilter + /* + + +[WARNING] +The webserver mode has not been tested, nor do I know how the websocket will be made to work. + +The ui is accessible at + +---- +http://ip:port/sqlg/v1/ +---- + +=== Authentication + +The ui uses cookie authentication. + +To define the users that are allowed to use the ui there must be a corresponding property in `sqlg.properties` + +---- +sqlg.ui.username.john=john_password +sqlg.ui.username.peter=peter_password +---- + +For the user to be allowed to do any editing there must be the following property in `sqlg.properties` + +---- +sqlg.ui.username.john.edit=true +sqlg.ui.username.peter.edit=true +---- + +There is one additional property which specifies how long the cookie remains valid for. + +---- +sqlg.ui.cookie.expiry=3600 +---- \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/supportedFeatures.adoc b/sqlg-doc/docs/2.1.4/include/supportedFeatures.adoc new file mode 100644 index 000000000..af43aa474 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/supportedFeatures.adoc @@ -0,0 +1,56 @@ +== TinkerPop supported features + +Sqlg version 2.1.4 runs on https://tinkerpop.apache.org[TinkerPop 3.4.10]. + +Sqlg passes TinkerPop's `StructureStandardSuite` and `ProcessStandardSuite` test suites. + +.Graph Features *not* implemented. + +- Computer +- ThreadedTransactions +- Variables + +.Vertex Features *not* implemented. + +- MultiProperties +- MetaProperties +- UserSuppliedIds +- NumericIds +- StringIds +- UuidIds +- CustomIds +- AnyIds + +.Edge Features **not** implemented. + +- UserSuppliedIds +- NumericIds +- StringIds +- UuidIds +- CustomIds +- AnyIds + +.Vertex property features *not* implemented. + +- AddProperty +- RemoveProperty +- UserSuppliedIds +- NumericIds +- StringIds +- UuidIds +- CustomIds +- AnyIds +- MapValues +- MixedListValues +- SerializableValues +- UniformListValues + +.Edge property feature *not* implemented. + +- MapValues +- MixedListValues +- SerializableValues +- UniformListValues + +[NOTE] +Sqlg supports user supplied ids but not quite as defined by TinkerPop. This is explained <>. \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/include/topology.adoc b/sqlg-doc/docs/2.1.4/include/topology.adoc new file mode 100644 index 000000000..03e4945dc --- /dev/null +++ b/sqlg-doc/docs/2.1.4/include/topology.adoc @@ -0,0 +1,331 @@ +[[anchor-topology]] +== Topology + +Sqlg stores the graph's topology information in the graph itself as a graph. +The topology is stored in the `sqlg_schema` schema. + +.UML diagram of Sqlg's topology. +image:uml/topology Class Diagram.png[image of Sqlg's topology] + +TinkerPop has no notion of schema or topology. However any TinkerPop graph has an implicit schema. +Sqlg manages the schema as a first class construct. + +Sqlg follows the normal TinkerPop semantics in that the schema does not need to be defined upfront. +Every graph modification first checks to see if the element's schema (label,name) exists. +If not, it will create the element's schema. For `Postgresql` this works well as it supports transactional schema creation/modification. + +[WARNING] +Hsqldb, H2 and MariaDb do not support transactional schema creation/modification. They will both silently commit the +transaction and continue. This breaks the user's transaction boundaries. For Hsqldb, H2 and MariaDb it is recommended to +create the schema upfront. + +It is possible to query and traverse the topology as a normal TinkerPop graph. +To query the topology the `TopologyStrategy` is used. To facilitate ease of use, `SqlgGraph.topology()` method is added to enable the strategy. +Being able to query the topology is helpful to understand a graph's structure. + +[source,java,options="nowrap"] +---- +@Test +public void showTopologyTraversals() { + Io.Builder builder = GraphSONIo.build(GraphSONVersion.V3_0); <1> + final GraphReader reader = sqlgGraph.io(builder).reader().create(); + try (final InputStream stream = AbstractGremlinTest.class.getResourceAsStream("/tinkerpop-modern-v3d0.json")) { + reader.readGraph(stream, sqlgGraph); + } catch (IOException e) { + Assert.fail(e.getMessage()); + } + System.out.println("//All vertex labels"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) # <2> + .forEachRemaining( + v -> System.out.println(v.value(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME)) + ); + + System.out.println("//All edge labels"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) + .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE) # <3> + .forEachRemaining( + v -> System.out.println(v.value(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME)) + ); + + System.out.println("//'person' properties"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) + .has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "person") # <4> + .out(Topology.SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE) # <5> + .forEachRemaining( + v -> { + System.out.print(v.value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : "); + System.out.println(v.value(Topology.SQLG_SCHEMA_PROPERTY_TYPE)); + } + ); + + System.out.println("//'software' properties"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) + .has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "software") + .out(Topology.SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE) + .forEachRemaining( + v -> { + System.out.print(v.value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : "); + System.out.println(v.value(Topology.SQLG_SCHEMA_PROPERTY_TYPE)); + } + ); + + System.out.println("//'created' properties"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) # <6> + .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE) # <7> + .has(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "created") # <8> + .out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE) # <9> + .forEachRemaining( + v -> { + System.out.print(v.value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : "); + System.out.println(v.value(Topology.SQLG_SCHEMA_PROPERTY_TYPE)); + } + ); + + System.out.println("//'knows' properties"); + sqlgGraph.topology().V() + .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) + .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE) + .has(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "knows") + .out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE) + .forEachRemaining( + v -> { + System.out.print(v.value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : "); + System.out.println(v.value(Topology.SQLG_SCHEMA_PROPERTY_TYPE)); + } + ); + +} +---- +<1> Use TinkerPop's i.o. infrastructure to load the modern graph. +<2> Find all VertexLabels, they are in `sqlg_schema.vertex` +<3> Traverse out on the `out_edges` edge to find all the edges. 'WARNING' this may produce duplicates as a single edge label +may have many different distinct out vertex labels. +<4> Find the `person` vertex. +<5> Traverse out on the `vertex_property` edge to find the 'person' vertex labels properties. +<6> Find all vertex labels. i.e. vertices in `sqlg_schema.vertex` +<7> Traverse the `out_edges` edge. +<8> Filter the out edges for only the 'created' edges. +<9> Traverse the `edge_properties` edge to find the 'created' edge's properties. + + +.output +---- +//All vertex labels +person +software +//All edge labels +knows +created +//'person' properties +name : STRING +age : INTEGER +//'software' properties +name : STRING +lang : STRING +//'created' properties +weight : DOUBLE +//'knows' properties +weight : DOUBLE +---- + + +=== Topology eager creation + +It is often useful to create the topology upfront. The topology creation api is accessed via the `Topology` object. +It is a singleton. `Topology topology = sqlgGraph.getTopology();` +To create new topology objects use the `ensureXXX` methods. They will return the a topology object representing the specific +topology element. i.e. `Schema`, `VertexLabel`, `EdgeLabel`, `PropertyColumn`, `Index` or `GlobalUniqueIndex` + +[NOTE] +The `ensureXXX` methods will create the topology object if it does not exists. +If it does exist it will simply return the relevant topology object. +On any topology object one can call `isCommitted` or `isUncommitted` to check the state of the object. +`committed` indicates that it already exists. `uncommitted` indicates that it has been created in the current active transaction. + +.eg +[source,java,options="nowrap"] +---- +@Test +public void createModernTopology() { + Topology topology = this.sqlgGraph.getTopology(); # <1> + VertexLabel personVertexLabel = topology.ensureVertexLabelExist("public", "person", new HashMap() {{ + put("name", PropertyType.STRING); + put("age", PropertyType.INTEGER); + }}); # <2> + VertexLabel softwareVertexLabel = topology.ensureVertexLabelExist("public", "software", new HashMap() {{ + put("name", PropertyType.STRING); + put("lang", PropertyType.STRING); + }}); + EdgeLabel createdEdgeLabel = personVertexLabel.ensureEdgeLabelExist("created", softwareVertexLabel, new HashMap() {{ + put("weight", PropertyType.DOUBLE); + }}); # <3> + EdgeLabel knowsEdgeLabel = personVertexLabel.ensureEdgeLabelExist("knows", personVertexLabel, new HashMap() {{ + put("weight", PropertyType.DOUBLE); + }}); + this.sqlgGraph.tx().commit(); # <4> +} +---- +<1> Get the `Topology` object. +<2> Create the 'person' VertexLabel. The `HashMap` defines the 'person''s properties. +<3> Create the 'created' EdgeLabel. The format is outVertexLabel.ensureEdgeLabelExist(name, inVertexLabel, properties) +<4> Be sure to commit the transaction. Postgresql and MSSqlServer supports transactional schema creation. Hsqldb,H2 and MariaDB do not. + +[source,java,options="nowrap"] +---- +@Test +public void generalTopologyCreationWithSchema() { + Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("Humans"); # <1> + VertexLabel personVertexLabel = schema.ensureVertexLabelExist("Person", new HashMap() {{ + put("name", PropertyType.STRING); + put("date", PropertyType.LOCALDATE); + }}); # <2> + this.sqlgGraph.tx().commit(); +} +---- +<1> Create the 'Humans' schema +<2> Create the 'Person' VertexLabel via the Schema object. + +Sqlg keeps an in-memory cache of the graphs entire topology. It is possible query this cache directly. + +[source,java,options="nowrap"] +---- +@Test +public void queryCache() { + loadModern(); + Optional publicSchema = this.sqlgGraph.getTopology().getSchema(this.sqlgGraph.getSqlDialect().getPublicSchema()); # <1> + assertTrue(publicSchema.isPresent()); + Schema publicSchemaViaShortCut = this.sqlgGraph.getTopology().getPublicSchema(); # <2> + Optional personVertexLabel = publicSchema.get().getVertexLabel("person"); # <3> + assertTrue(personVertexLabel.isPresent()); + Optional createEdgeLabel = personVertexLabel.get().getOutEdgeLabel("created"); # <4> + assertTrue(createEdgeLabel.isPresent()); + Optional knowsEdgeLabel = personVertexLabel.get().getOutEdgeLabel("knows"); # <5> + assertTrue(knowsEdgeLabel.isPresent()); + + Optional namePropertyColumn = personVertexLabel.get().getProperty("name"); # <6> + assertTrue(namePropertyColumn.isPresent()); + assertEquals(PropertyType.STRING, namePropertyColumn.get().getPropertyType()); # <7> + Optional agePropertyColumn = personVertexLabel.get().getProperty("age"); + assertTrue(agePropertyColumn.isPresent()); + assertEquals(PropertyType.INTEGER, agePropertyColumn.get().getPropertyType()); + Optional weightPropertyColumn = createEdgeLabel.get().getProperty("weight"); + assertTrue(weightPropertyColumn.isPresent()); + assertEquals(PropertyType.DOUBLE, weightPropertyColumn.get().getPropertyType()); +} +---- +<1> Get the 'public' schema object. +<2> Because the 'public' schema will always exist there is a shortcut method to get it. +<3> Use the 'Schema' object the get the 'person' VertexLabel +<4> Use the 'person' VertexLabel to get its 'created' out edge. +<5> Use the 'person' VertexLabel to get its 'knows' out edge. +<6> Use the 'person' VertexLabel to get its 'name' property. Properties are represented by the `PropertyColumn` class. +<7> On the `PropertyColumn` object one can get the `PropertyType`. PropertyType is an enum representing all data types supported by Sqlg. + +[[anchor-user-supplied-identifiers]] +=== User supplied identifiers + +You can define your own identifiers for a VertexLabel or EdgeLabel. This will result in Sqlg generating primary keys on the specified identifiers instead of using an auto generated sequence. + +.eg. +[source,java,options="nowrap"] +---- +@Test +public void testUserSuppliedIds() { + VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist( + "Person", + new LinkedHashMap<>() {{ + put("name", PropertyType.STRING); + put("surname", PropertyType.STRING); + put("nickname", PropertyType.STRING); + }}, + ListOrderedSet.listOrderedSet(Arrays.asList("name", "surname")) # <1> + ); + personVertexLabel.ensureEdgeLabelExist( + "marriedTo", + personVertexLabel, + new LinkedHashMap<>() {{ + put("place", PropertyType.STRING); + put("when", PropertyType.LOCALDATETIME); + }}, + ListOrderedSet.listOrderedSet(List.of("place", "when")) # <2> + ); + this.sqlgGraph.tx().commit(); + + Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John", "surname", "Longfellow", "nickname", "Longboy"); + Vertex sue = this.sqlgGraph.addVertex(T.label, "Person", "name", "Sue", "surname", "Pretty"); + john.addEdge("marriedTo", sue, "place", "Timbuck2", "when", LocalDateTime.now()); + this.sqlgGraph.tx().commit(); + + List marriedTo = this.sqlgGraph.traversal().V().hasLabel("Person") + .has("name", "John") + .out("marriedTo") + .toList(); + Assert.assertEquals(1, marriedTo.size()); + Assert.assertEquals(sue, marriedTo.get(0)); +} +---- +<1> Specify the `name` and `surname` properties as the primary key for the `Person` vertex label. +<2> Specify the `place` and `when` properties as the primary key for the `marriedTo` edge label. + +This will generate a table with `name` and `surname`, and `place` and `when` as composite primary keys. + +[source,sql,options="nowrap"] +---- +CREATE TABLE public."V_Person" +( + name text COLLATE pg_catalog."default" NOT NULL, + surname text COLLATE pg_catalog."default" NOT NULL, + nickname text COLLATE pg_catalog."default", + CONSTRAINT "V_Person_pkey" PRIMARY KEY (name, surname) +); + +CREATE TABLE public."E_marriedTo" +( + place text COLLATE pg_catalog."default" NOT NULL, + "when" timestamp without time zone NOT NULL, + "public.Person.name__I" text COLLATE pg_catalog."default", + "public.Person.surname__I" text COLLATE pg_catalog."default", + "public.Person.name__O" text COLLATE pg_catalog."default", + "public.Person.surname__O" text COLLATE pg_catalog."default", + CONSTRAINT "E_marriedTo_pkey" PRIMARY KEY (place, "when"), + CONSTRAINT "E_marriedTo_public.Person.name__I_public.Person.surname__I_fkey" FOREIGN KEY ("public.Person.name__I", "public.Person.surname__I") + REFERENCES public."V_Person" (name, surname) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION + DEFERRABLE, + CONSTRAINT "E_marriedTo_public.Person.name__O_public.Person.surname__O_fkey" FOREIGN KEY ("public.Person.name__O", "public.Person.surname__O") + REFERENCES public."V_Person" (name, surname) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION + DEFERRABLE +) +---- + +The gremlin query will execute the following sql, +[source,sql,options="nowrap"] +---- +SELECT + a2."alias1", a2."alias2", a2."alias3" +FROM ( +SELECT + "public"."E_marriedTo"."public.Person.name__I" AS "public.E_marriedTo.public.Person.name__I", + "public"."E_marriedTo"."public.Person.surname__I" AS "public.E_marriedTo.public.Person.surname__I" +FROM + "public"."V_Person" INNER JOIN + "public"."E_marriedTo" ON "public"."V_Person"."name" = "public"."E_marriedTo"."public.Person.name__O" AND "public"."V_Person"."surname" = "public"."E_marriedTo"."public.Person.surname__O" +WHERE + ( "public"."V_Person"."name" = ?) +) a1 INNER JOIN ( +SELECT + "public"."V_Person"."name" AS "alias1", + "public"."V_Person"."surname" AS "alias2", + "public"."V_Person"."nickname" AS "alias3" +FROM + "public"."V_Person" +) a2 ON a1."public.E_marriedTo.public.Person.name__I" = a2."alias1" AND a1."public.E_marriedTo.public.Person.surname__I" = a2."alias2" +---- diff --git a/sqlg-doc/docs/2.1.4/index.html b/sqlg-doc/docs/2.1.4/index.html new file mode 100644 index 000000000..1e9018c37 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/index.html @@ -0,0 +1,7794 @@ + + + + + + + + + + +Sqlg Documentation + + + + + +
+
+
+
+

Sqlg mark github is a implementation of Apache TinkerPop on a +RDBMS. +Currently Postgresql, HSQLDB, H2, +MariaDB, MySQL and +MSSqlServer are supported.

+
+
+

Sqlg has a github discussions page.

+
+
+
+
+

1. Introduction

+
+
+

Sqlg primary challenge is to reduce latency by combining TinkerPop +steps into as few as possible database calls. +The fine-grained nature of graph traversals makes this crucial, +otherwise the database call latency has prohibitively high performance impact.

+
+
+

Sqlg supports various bulk modes to reduce latency when modifying the graph.

+
+
+ + + + + +
+
Note
+
+Hsqldb and H2 do not suffer the same latency as Postgresql, MSSqlServer and MariaDB as it runs embedded in the jvm. +
+
+
+
+
+

2. License

+
+
+

MIT MIT

+
+
+
+
+

3. TinkerPop supported features

+
+
+

Sqlg version 2.1.4 runs on TinkerPop 3.4.10.

+
+
+

Sqlg passes TinkerPop’s StructureStandardSuite and ProcessStandardSuite test suites.

+
+
+
Graph Features not implemented.
+
    +
  • +

    Computer

    +
  • +
  • +

    ThreadedTransactions

    +
  • +
  • +

    Variables

    +
  • +
+
+
+
Vertex Features not implemented.
+
    +
  • +

    MultiProperties

    +
  • +
  • +

    MetaProperties

    +
  • +
  • +

    UserSuppliedIds

    +
  • +
  • +

    NumericIds

    +
  • +
  • +

    StringIds

    +
  • +
  • +

    UuidIds

    +
  • +
  • +

    CustomIds

    +
  • +
  • +

    AnyIds

    +
  • +
+
+
+
Edge Features not implemented.
+
    +
  • +

    UserSuppliedIds

    +
  • +
  • +

    NumericIds

    +
  • +
  • +

    StringIds

    +
  • +
  • +

    UuidIds

    +
  • +
  • +

    CustomIds

    +
  • +
  • +

    AnyIds

    +
  • +
+
+
+
Vertex property features not implemented.
+
    +
  • +

    AddProperty

    +
  • +
  • +

    RemoveProperty

    +
  • +
  • +

    UserSuppliedIds

    +
  • +
  • +

    NumericIds

    +
  • +
  • +

    StringIds

    +
  • +
  • +

    UuidIds

    +
  • +
  • +

    CustomIds

    +
  • +
  • +

    AnyIds

    +
  • +
  • +

    MapValues

    +
  • +
  • +

    MixedListValues

    +
  • +
  • +

    SerializableValues

    +
  • +
  • +

    UniformListValues

    +
  • +
+
+
+
Edge property feature not implemented.
+
    +
  • +

    MapValues

    +
  • +
  • +

    MixedListValues

    +
  • +
  • +

    SerializableValues

    +
  • +
  • +

    UniformListValues

    +
  • +
+
+
+ + + + + +
+
Note
+
+Sqlg supports user supplied ids but not quite as defined by TinkerPop. This is explained below. +
+
+
+
+
+

4. Limitations

+
+
+

Postgresql schema, table and column names can not be more than 63 characters long.

+
+
+
+
+

5. Getting Started

+
+
+

5.1. Maven coordinates

+
+
Postgresql
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-postgres</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
HSQLDB
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-hsqldb</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
H2
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-h2</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MariaDB
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mariadb</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MySQL
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mysql</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MSSqlServer
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mssqlserver</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+

This will include gremlin-groovy. If you have no need for that then use the following coordinates.

+
+
+
Postgresql
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-postgres-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
HSQLDB
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-hsqldb-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
H2
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-h2-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MariaDB
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mariadb-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MySQL
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mysql-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
MSSqlServer
+
+
<dependency>
+    <groupId>org.umlg</groupId>
+    <artifactId>sqlg-mssqlserver-dialect</artifactId>
+    <version>2.1.4</version>
+</dependency>
+
+
+
+
+

5.2. Start

+
+

SqlgGraph is a singleton that can be shared among multiple threads. You instantiate SqlgGraph using the standard +TinkerPop static constructors.

+
+
+
    +
  • +

    Graph g = SqlgGraph.open(final Configuration configuration)

    +
  • +
  • +

    Graph g = SqlgGraph.open(final String pathToSqlgProperties)

    +
  • +
+
+
+

The configuration object requires the following properties.

+
+
+
Postgresql
+
+
jdbc.url=jdbc:postgresql://localhost:5432/yourdb
+jdbc.username=postgres
+jdbc.password=******
+
+
+
+
HSQLDB
+
+
jdbc.url=jdbc:hsqldb:file:/tmp/yourdb
+jdbc.username=SA
+jdbc.password=
+
+
+
+
H2
+
+
jdbc.url=jdbc:h2:file:target/tmp/yourdb
+jdbc.username=SA
+jdbc.password=
+
+
+
+
MariaDB
+
+
jdbc.url=jdbc:mariadb://localhost:3306/?useSSL=false
+jdbc.username=mariadb
+jdbc.password=mariadb
+
+
+
+
MySQL
+
+
jdbc.url=jdbc:mysql://localhost:3306/?useSSL=false
+jdbc.username=mysql
+jdbc.password=mysql
+
+
+
+
MSSqlServer
+
+
jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=yourdb;
+jdbc.username=SA
+jdbc.password=*****
+
+
+
+

In the case of Postgresql and MSSqlServer the database must already exist.

+
+
+

Once you have access to the graph you can use it as per normal.

+
+
+
+
@Test
+public void useAsPerNormal() {
+    Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
+    Vertex address = this.sqlgGraph.addVertex(T.label, "Address", "street", "13th");
+    person.addEdge("livesAt", address, "since", LocalDate.of(2010, 1, 21));
+    this.sqlgGraph.tx().commit(); # (1)
+    List<Vertex> addresses = this.sqlgGraph.traversal().V().hasLabel("Person").out("livesAt").toList();
+    assertEquals(1, addresses.size());
+}
+
+
+
+
    +
  1. +

    It is very important to always commit or rollback the transaction. +If you do not, connections to the database will remain open and eventually +the connection pool with run out of connections.

    +
  2. +
+
+
+
+

5.3. Gremlin Console

+
+
Postgresql
+

pieter@pieter-Precision-7510:~/Downloads/tinkerpop-console/apache-tinkerpop-gremlin-console-3.4.10-bin/apache-tinkerpop-gremlin-console-3.4.10/bin/$ ./gremlin.sh

+
+
+
+
         \,,,/
+         (o o)
+-----oOOo-(3)-oOOo-----
+plugin activated: tinkerpop.server
+plugin activated: tinkerpop.utilities
+plugin activated: tinkerpop.tinkergraph
+gremlin> :install org.umlg sqlg-postgres 2.1.4
+==>Loaded: [org.umlg, sqlg-postgres, 2.1.4] - restart the console to use [sqlg.postgres]
+gremlin> :x
+pieter@pieter-Precision-7510:~/Downloads/tinkerpop-console/apache-tinkerpop-gremlin-console-3.4.10-bin/apache-tinkerpop-gremlin-console-3.4.10/bin/$ ./gremlin.sh
+
+
+
+
+
         \,,,/
+         (o o)
+-----oOOo-(3)-oOOo-----
+plugin activated: tinkerpop.server
+plugin activated: tinkerpop.utilities
+plugin activated: tinkerpop.tinkergraph
+gremlin> :plugin list
+==>tinkerpop.server[active]
+==>tinkerpop.gephi
+==>tinkerpop.utilities[active]
+==>tinkerpop.sugar
+==>tinkerpop.credentials
+==>sqlg.postgres
+==>tinkerpop.tinkergraph[active]
+gremlin> :plugin use sqlg.postgres
+==>sqlg.postgres activated
+gremlin> graph = SqlgGraph.open('/pathTo/sqlg.properties')
+==>sqlggraph[SqlGraph] (jdbc:postgresql://localhost:5432/sqlgraphdb) (user = postgres)
+gremlin> g = graph.traversal()
+==>sqlggraphtraversalsource[sqlggraph[SqlGraph] (jdbc:postgresql://localhost:5432/sqlgraphdb) (user = postgres), standard]
+gremlin> graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).readGraph("/pathTo/grateful-dead-v3d0.json")
+==>null
+gremlin> g.V().count()
+==>808
+gremlin>
+
+
+
+
+
+
+

6. Data types

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Table Data types
JavaPostgresqlHSQLDBH2MariaDBMSSqlServer

Boolean

BOOLEAN

BOOLEAN

BOOLEAN

BOOLEAN

BIT

Byte

Not supported

TINYINT

TINYINT

TINYINT

TINYINT

Short

SMALLINT

SMALLINT

SMALLINT

SMALLINT

SMALLINT

Integer

INTEGER

INTEGER

INT

INTEGER

INT

Long

BIGINT

BIGINT

BIGINT

BIGINT

BIGINT

Float

REAL

Not supported

REAL

Not supported

REAL

Double

DOUBLE PRECISION

DOUBLE

DOUBLE

DOUBLE

DOUBLE PRECISION

String

TEXT

LONGVARCHAR

VARCHAR

LONGTEXT

VARCHAR(2000)

String (fixed length)

VARCHAR(x)

VARCHAR(x)

VARCHAR(x)

VARCHAR(x)

VARCHAR(x)

Boolean[]

BOOLEAN[]

BOOLEAN ARRAY DEFAULT ARRAY[]

ARRAY

BOOLEAN ARRAY DEFAULT ARRAY[]

Not supported

Byte[]

BYTEA

LONGVARBINARY

BINARY

BLOB

VARBINARY(max)

Short[]

SMALLINT[]

SMALLINT ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

Integer[]

INTEGER[]

INTEGER ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

Long[]

BIGINT[]

BIGINT ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

Float[]

REAL[]

Not supported

ARRAY

Not supported

Not supported

Double[]

DOUBLE PRECISION[]

DOUBLE ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

String[]

TEXT[]

LONGVARCHAR ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.LocalDateTime

TIMESTAMP

TIMESTAMP

TIMESTAMP

DATETIME(3)

DATETIME2(3)

java.time.LocalDate

DATE

DATE

DATE

DATE

DATE

java.time.LocalTime

TIME

TIME

TIME

TIME

TIME

java.time.ZonedDateTime

TIMESTAMP, TEXT

TIMESTAMP, LONGVARCHAR

TIMESTAMP, VARCHAR

DATETIME(3), TINYTEXT

DATETIME2(3), VARCHAR(255)

java.time.Period

INTEGER, INTEGER, INTEGER

INTEGER, INTEGER, INTEGER

INT, INT, INT

INTEGER, INTEGER, INTEGER

INT, INT, INT

java.time.Duration

BIGINT, INTEGER

BIGINT, INTEGER

BIGINT, INT

BIGINT, INTEGER

BIGINT, INT

java.time.LocalDateTime[]

TIMESTAMP[]

TIMESTAMP ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.LocalDate[]

DATE[]

DATE ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.LocalTime[]

TIME[]

TIME ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.ZonedDateTime[]

TIMESTAMP[], TEXT[]

TIMESTAMP ARRAY DEFAULT ARRAY[], LONGVARCHAR ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.Period[]

INTEGER[], INTEGER[], INTEGER[]

INTEGER ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

java.time.Duration[]

BIGINT[], INTEGER[]

BIGINT ARRAY DEFAULT ARRAY[], INTEGER ARRAY DEFAULT ARRAY[]

ARRAY

Not supported

Not supported

com.fasterxml.jackson.databind.JsonNode

JSONB

LONGVARCHAR

VARCHAR

LONGTEXT

VARCHAR(max)

com.fasterxml.jackson.databind.JsonNode[]

JSONB[]

ARRAY

ARRAY

Not supported

Not supported

org.postgis.Point

geometry(POINT)

Not supported

Not supported

Not supported

Not supported

org.umlg.sqlg.gis.GeographyPoint

geography(POINT, 4326)

Not supported

Not supported

Not supported

Not supported

org.postgis.LineString

geometry(LINESTRING)

Not supported

Not supported

Not supported

Not supported

org.postgis.Polygon

geometry(POLYGON)

Not supported

Not supported

Not supported

Not supported

org.umlg.sqlg.gis.GeographyPolygon

geography(POLYGON, 4326)

Not supported

Not supported

Not supported

Not supported

+
+ + + + + +
+
Note
+
+java.time.LocalTime drops the nano second precision. +
+
+
+
+
+

7. Architecture

+
+
+

TinkerPop’s property graph semantics specifies that every vertex and edge has a single label. Modelling this in a RDBMS +is trivial. TinkerPop has no notion of cardinality nor of order. Every relationship between vertex labels is modelled as +many to many relationship with no specified order.

+
+
+

This realizes itself as a classic many to many relationship in a RDBMS database.

+
+
+
+
VertexLabel <---- EdgeLabel ----> VertexLabel
+
+
+
+

7.1. Vertex tables

+
+

Every unique vertex label maps to a table. Vertex tables are prefixed with a V_. i.e. V_Person. The vertex table +stores the vertex’s properties.

+
+
+
+

7.2. Edge tables

+
+

Every unique edge label maps to a table. Edge tables are prefixed with a E_. i.e. E_friend. The edge table stores +each edge’s adjacent vertex ids and the edge properties. The column corresponding to each adjacent vertex id (IN and OUT) +has a foreign key to the adjacent vertex’s table. The foreign key is optional, instead just an index on the adjacent vertex id +can be used.

+
+
+ + + + + +
+
Note
+
+By default, Sqlg will use an auto increment ID bigint for the primary key. You can however use the topology interface to define which properties to use as the primary key. +
+
+
+ + + + + +
+
Note
+
+sqlg.properties implement.foreign.keys = false
+Edge foreign keys have a significant impact on performance.
+Edge foreign keys are enabled by default. +
+
+
+

From a rdbms' perspective each edge table is the classic many to many join table between vertices.

+
+
+
+

7.3. TinkerPop-modern

+
+

Taken from TinkerPop

+
+
+

image of tinkerpop-classic

+
+
+
ER Diagram
+

image of tinkerpop-classic

+
+
+
V_person
+

image of tinkerpop-classic

+
+
+
V_software
+

image of tinkerpop-classic

+
+
+
E_knows
+

image of tinkerpop-classic

+
+
+
E_created
+

image of tinkerpop-classic

+
+
+
+

7.4. Namespacing and Schemas

+
+

Many RDBMS databases have the notion of a schema as a namespace for tables. Sqlg supports schemas +for vertex labels. Distinct schemas for edge tables are unnecessary as edge tables are created in the schema of the adjacent out vertex. +By default schemas for vertex tables go into the underlying databases' default schema. For Postgresql, hsqldb and H2 this +is the public schema.

+
+
+

To specify the schema for a label Sqlg uses the dot . notation.

+
+
+
+
@Test
+public void testElementsInSchema() {
+    Vertex john = this.sqlgGraph.addVertex(T.label, "Manager", "name", "john"); # (1)
+    Vertex palace1 = this.sqlgGraph.addVertex(T.label, "continent.House", "name", "palace1"); # (2)
+    Vertex corrola = this.sqlgGraph.addVertex(T.label, "fleet.Car", "model", "corrola"); # (3)
+    palace1.addEdge("managedBy", john);
+    corrola.addEdge("owner", john);
+    this.sqlgGraph.tx().commit();
+    assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Manager").count().next().intValue()); # (4)
+    assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("House").count().next().intValue()); # (5)
+    assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("continent.House").count().next().intValue()); (6)
+    assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("Car").count().next().intValue());
+    assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("fleet.Car").count().next().intValue());
+    assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("managedBy").count().next().intValue());
+    assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("owner").count().next().intValue());
+}
+
+
+
+
    +
  1. +

    'Manager' will be in the default 'public' schema.

    +
  2. +
  3. +

    'House' will be in the 'continent' schema.

    +
  4. +
  5. +

    'Car' will be in the 'fleet' schema.

    +
  6. +
  7. +

    Vertices in the public schema do not need to be qualified with the schema.

    +
  8. +
  9. +

    Vertices not in the public schema must be qualified with its schema. In this case 'House' will not be found.

    +
  10. +
  11. +

    As 'House' is qualified with the 'continent' schema it will be found.

    +
  12. +
+
+
+

Table V_manager is in the public (default) schema.
+Table V_house is in the continent schema.
+Table V_car is in the fleet schema.
+Table E_managedBy is in the continent schema as its out vertex palace1 is in the continent schema.
+Table E_owner is in the fleet schema as its out vertex is in the `fleet`schema.

+
+
+
postgresql schemas
+

image of tinkerpop-classic +image of tinkerpop-classic +image of tinkerpop-classic +image of tinkerpop-classic

+
+
+

7.4.1. Edge label

+
+

An edge label can have many different out vertex labels. +This means that its possible for a single edge label to be stored in multiple schemas and tables. +One for each distinct out vertex label. Gremlin queries will work as per normal. +However it is possible to target the edges per out vertex schema directly.

+
+
+
eg.
+
+
@Test
+public void testEdgeAcrossSchema() {
+    Vertex a = this.sqlgGraph.addVertex(T.label, "A.A");
+    Vertex b = this.sqlgGraph.addVertex(T.label, "B.B");
+    Vertex c = this.sqlgGraph.addVertex(T.label, "C.C");
+    a.addEdge("specialEdge", b);
+    b.addEdge("specialEdge", c);
+    this.sqlgGraph.tx().commit();
+    assertEquals(2, this.sqlgGraph.traversal().E().hasLabel("specialEdge").count().next().intValue()); # (1)
+    assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("A.specialEdge").count().next().intValue()); # (2)
+    assertEquals(1, this.sqlgGraph.traversal().E().hasLabel("B.specialEdge").count().next().intValue()); # (3)
+}
+
+
+
+
    +
  1. +

    Query 'specialEdge'

    +
  2. +
  3. +

    Query 'specialEdge' with, out vertex labels in the 'A' schema.

    +
  4. +
  5. +

    Query 'specialEdge' with, out vertex labels in the 'B' schema.

    +
  6. +
+
+
+
+
+
+
+

8. Indexes

+
+
+

8.1. Basic indexing

+
+

Sqlg supports adding a unique or non-unique index to any property or properties.

+
+
+

To add an index one has to use Sqlg’s topology interface.

+
+
+
+
@Test
+public void testIndex() {
+    VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", new HashMap<String, PropertyType>() {{
+        put("name", PropertyType.STRING);
+    }}); # (1)
+    Optional<PropertyColumn> namePropertyOptional = personVertexLabel.getProperty("name");
+    assertTrue(namePropertyOptional.isPresent());
+    Index index = personVertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(namePropertyOptional.get())); $ (2)
+    this.sqlgGraph.tx().commit(); # (3)
+
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
+    List<Vertex> johns = this.sqlgGraph.traversal().V()
+            .hasLabel("Person")
+            .has("name", "John")
+            .toList(); # (4)
+
+    /* This will execute the following sql.
+    SELECT
+        "public"."V_Person"."ID" AS "alias1",
+        "public"."V_Person"."name" AS "alias2"
+    FROM
+        "public"."V_Person"
+    WHERE
+        ( "public"."V_Person"."name" = ?)
+    */ # (5)
+
+    assertEquals(1, johns.size());
+}
+
+
+
+
    +
  1. +

    Create the 'Person' VertexLabel.

    +
  2. +
  3. +

    On the 'Person' VertexLabel create a non unique index on the 'name' property.

    +
  4. +
  5. +

    Index creation is transactional on Postgresql.

    +
  6. +
  7. +

    The given gremlin query will use the index.

    +
  8. +
  9. +

    The underlying RDBMS will use the index for the executed sql.

    +
  10. +
+
+
+
postgresql V_Person sql definition
+

image of tinkerpop-classic

+
+
+

8.1.1. Composite indexes

+
+

It is possible to create composite indexes.

+
+
+
+
@Test
+public void testCompositeIndex() {
+    VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", new HashMap<String, PropertyType>() {{
+        put("firstName", PropertyType.STRING);
+        put("lastName", PropertyType.STRING);
+    }}); # (1)
+    personVertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, new ArrayList<>(personVertexLabel.getProperties().values())); # (2)
+    this.sqlgGraph.tx().commit();
+    this.sqlgGraph.addVertex(T.label, "Person", "firstName", "John", "lastName", "Smith");
+    List<Vertex> johnSmiths = this.sqlgGraph.traversal().V()
+            .hasLabel("Person")
+            .has("firstName", "John")
+            .has("lastName", "Smith")
+            .toList();
+    assertEquals(1, johnSmiths.size());
+}
+
+
+
+
    +
  1. +

    Create the 'Person' VertexLabel with 2 properties, 'firstName' and 'lastName'.

    +
  2. +
  3. +

    Create a composite index on 'firstName' and 'lastName'

    +
  4. +
+
+
+
postgresql V_Person composite index sql definition
+

image of tinkerpop-classic

+
+
+

Outside of creating the index Sqlg has no further direct interaction with the index. However gremlin queries with a +HasStep targeting a property with an index on it will translate to a sql where clause on that property and +the underlying RDBMS will utilize the index.

+
+
+ + + + + +
+
Note
+
+The index does not need to be created upfront. It can be added any time. +
+
+
+
+
+

8.2. Full-text indexing

+
+

On postgresql full text indexing is supported.

+
+
+
+
@Test
+public void testFullTextIndex() {
+    Vertex v0 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "a fat cat sat on a mat and ate a fat rat");
+    Vertex v1 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "fatal error");
+    Vertex v2 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "error is not fatal");
+
+    VertexLabel vl = this.sqlgGraph.getTopology().getVertexLabel("public", "Sentence").get();
+    vl.ensureIndexExists(IndexType.getFullTextGIN("english"), Collections.singletonList(vl.getProperty("name").get())); (1)
+    this.sqlgGraph.tx().commit();
+
+    List<Vertex> vts = this.sqlgGraph.traversal()
+            .V().hasLabel("Sentence")
+            .has("name", FullText.fullTextMatch("english", "fat & rat")) (2)
+            .toList();
+    Assert.assertEquals(1, vts.size());
+    Assert.assertTrue(vts.contains(v0));
+}
+
+
+
+
    +
  1. +

    Create a full-text gin index.

    +
  2. +
  3. +

    Query the full-text index using Sqlg’s custom FullText predicate.

    +
  4. +
+
+
+
+

8.3. Global unique indexing

+
+

Global unique indexing is a way of specifying that multiple properties across different labels are unique. +For every GlobalUniqueIndex Sqlg maintains a separate table with a unique index defined on it. +Every property that partakes in the GlobalUniqueIndex will have its value duplicated in this table. +These tables are kept in the gui_schema

+
+
+
+
@Test
+public void testPersonAndDogDoNotHaveTheSameName() {
+    Map<String, PropertyType> properties = new HashMap<String, PropertyType>() {{
+        put("name", PropertyType.STRING);
+    }}; # (1)
+    VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person", properties); # (2)
+    VertexLabel dogVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Dog", properties); # (3)
+    PropertyColumn personName = personVertexLabel.getProperty("name").get(); # (4)
+    PropertyColumn dogName = dogVertexLabel.getProperty("name").get(); # (5)
+    this.sqlgGraph.getTopology().ensureGlobalUniqueIndexExist(new HashSet<PropertyColumn>() {{
+        add(personName);
+        add(dogName);
+    }}); # (6)
+    this.sqlgGraph.tx().commit();
+
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "Tyson"); # (7)
+    try {
+        //This will fail
+        this.sqlgGraph.addVertex(T.label, "Dog", "name", "Tyson"); # (8)
+        fail("Duplicate key violation suppose to prevent this from executing");
+    } catch (RuntimeException e) {
+        //swallow
+        this.sqlgGraph.tx().rollback();
+    }
+}
+
+
+
+
    +
  1. +

    A map of the properties to add.

    +
  2. +
  3. +

    Create the 'Person' VertexLabel with its properties.

    +
  4. +
  5. +

    Create the 'Dog' VertexLabel with its properties.

    +
  6. +
  7. +

    Get the PropertyColumn for the 'name' property of 'Person'.

    +
  8. +
  9. +

    Get the PropertyColumn for the 'name' property of 'Dog'.

    +
  10. +
  11. +

    Create the GlobalUniqueIndex on the 'name' property of 'Person' and 'Dog'. This will ensure that 'Person’s and 'Dog’s do not have the same name.

    +
  12. +
  13. +

    Add a 'Person' with the name "Tyson".

    +
  14. +
  15. +

    Try to add a 'Dog' with the name "Tyson". This will fail as the `GlobalUniqueIndex' will prevent 'Person’s and 'Dog’s from having the same name.

    +
  16. +
+
+
+

GlobalUniqueIndexes do not support composite indexes.

+
+
+
+
+
+

9. Multiple JVMs

+
+
+

It is possible to run many Sqlg instances pointing to the same underlying database. These instances can be in the same jvm +but is primarily intended for separate jvm(s) pointing to the same underlying database.

+
+
+

To make multiple graphs point to the same underlying database it is important to add in the distributed property to sqlg.properties.

+
+
+
sqlg.properties
+
+
distributed = true
+
+
+
+ + + + + +
+
Note
+
+Multiple JVMs is only supported for Postgresql. +Hsqldb and H2 are primarily intended to run embedded so multiple JVMs do not make sense for them. +Multiple JVM support has not been implemented for MariaDB and MSSqlServer. +
+
+
+

Postgresql’s notify mechanism is used to distribute the cached schema +across multiple JVMs.

+
+
+
+
+

10. Gremlin

+
+
+

Sqlg optimizes a gremlin traversal by analyzing the +steps and where possible combining them into custom Sqlg steps. This can +significantly reduce the number of database calls.

+
+
+

Sqlg has two strategies for optimizing TinkerPop steps.

+
+
+
    +
  • +

    Starting with the GraphStep, +consecutive optimizable steps are folded into SqlgGraphStep. This +stops at the first unoptimizable step after which the second strategy is used.

    +
  • +
  • +

    The second strategy is to barrier the incoming elements to the unoptimizable step. This means to exhaust the traversal/iterator +up to the step and cache all the incoming elements for this step. From here the step is executed for all the incoming +elements at once. This strategy effectively changes the semantics to a breath first retrieval.

    +
  • +
+
+
+ + + + + +
+
Note
+
+Optimizing gremlin is an ongoing task as gremlin is a large language. +
+
+
+ + + + + +
+
Note
+
+Turn sql logging on by setting log4j.logger.org.umlg.sqlg=debug +
+
+
+

10.1. Optimization (strategy 1)

+
+

The following steps are optimized. Steps are

+
+ +
+

The combined step will then in turn generate the sql statements to retrieve the data. +It attempts to retrieve the data in as few distinct sql statements as possible.

+
+
+

10.1.1. Graph Step

+
+

The Graph Step is the start of any traversal. +Sqlg optimizes the graph step by analysing subsequent steps and if possible folding them into a few steps as possible. +Often into only one step, SqlgGraphStepCompiled.

+
+
+
+
@Test
+public void showGraphStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b2.addEdge("bc", c2);
+    this.sqlgGraph.tx().commit();
+
+    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .out()
+            .out();
+    System.out.println(traversal);
+    traversal.hasNext();
+    System.out.println(traversal);
+    List<Vertex> c = traversal.toList();
+    assertEquals(2, c.size());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]]
+
+
+
+

The Before optimization output shows the steps that will execute if no optimization is performed. +Without optimization the query this.sqlgGraph.traversal().V().hasLabel("A").out().out() will +first get the A s, then for each A the B s and then for each B the C s. In the above example unoptimized it +would be at least five round trips to the db. Optimized it is only one trip to the db.

+
+
+

For an embedded db like HSQLDB this is still ok but for a database server like postgresql the performance impact is +significant.

+
+
+

After optimization there is only one SqlgGraphStep step. +All the steps have been folded into one step.

+
+
+

The SqlgGraphStep will generate the following sql to retrieve the data.

+
+
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+
+
+
+
+

10.1.2. Vertex Step

+
+

Consecutive Vertex Step are folded into the Graph Step.

+
+
+
+
@Test
+public void showVertexStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b2.addEdge("bc", c2);
+    this.sqlgGraph.tx().commit();
+
+    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .out()
+            .out();
+    System.out.println(traversal);
+    traversal.hasNext();
+    System.out.println(traversal);
+    List<Vertex> c = traversal.toList();
+    assertEquals(2, c.size());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]]
+
+
+
+

This example is the same as the Graph Step. It shows the two Vertex Steps being folded into the SqlgGraphStep.

+
+
+

The SqlgGraphStep will generate the following sql to retrieve the data.

+
+
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+
+
+
+
+

10.1.3. Has Step

+
+

Has Steps are folded into the Graph Step or Vertex Step.

+
+
+
+
@Test
+public void showHasStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b2.addEdge("bc", c2);
+    this.sqlgGraph.tx().commit();
+
+    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .out().has("name", "b1")
+            .out();
+    System.out.println(traversal);
+    traversal.hasNext();
+    System.out.println(traversal);
+    List<Vertex> c = traversal.toList();
+    assertEquals(1, c.size());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), HasStep([name.eq(b1)]), VertexStep(OUT,vertex)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]]
+
+
+
+

This example is similar to the Graph Step example except for an additional HasStep. +It shows the two Vertex Step s and the Has Step being folded into the SqlgGraphStep.

+
+
+

The SqlgGraphStep will generate the following sql to retrieve the data.

+
+
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	( "public"."V_B"."name" = ?) (1)
+
+
+
+
    +
  1. +

    The Has Step realizes itself as a sql where clause.

    +
  2. +
+
+
+
+

10.1.4. Or Step

+
+

Or Steps are folded into the Graph Step or Vertex Step.

+
+
+
+
@Test
+public void showOrStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4");
+    Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5");
+    Vertex c6 = this.sqlgGraph.addVertex(T.label, "C", "name", "c6");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b2.addEdge("bc", c2);
+    b2.addEdge("bc", c3);
+    b2.addEdge("bc", c4);
+    b2.addEdge("bc", c5);
+    b2.addEdge("bc", c6);
+    this.sqlgGraph.tx().commit();
+
+    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .out()
+            .out()
+            .or(
+                    __.has("name", "c1"),
+                    __.has("name", "c3"),
+                    __.has("name", "c6")
+            );
+
+    System.out.println(traversal);
+    traversal.hasNext();
+    System.out.println(traversal);
+    List<Vertex> c = traversal.toList();
+    assertEquals(3, c.size());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex), OrStep([[HasStep([name.eq(c1)])], [HasStep([name.eq(c3)])], [HasStep([name.eq(c6)])]])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]]
+
+
+
+

This example is similar to the Graph Step example except for an additional Or Step which in turn contains three Has Step s. +It shows the two Vertex Step s the Or Step and the Has Step s being folded into the SqlgGraphStep.

+
+
+

The SqlgGraphStep will generate the following sql to retrieve the data.

+
+
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+(("public"."V_C"."name" = ?) OR ("public"."V_C"."name" = ?) OR ("public"."V_C"."name" = ?)
+) (1)
+
+
+
+
    +
  1. +

    The Or Step realizes itself as a sql where clause.

    +
  2. +
+
+
+
+

10.1.5. And Step

+
+

And Steps are folded into the Graph Step or Vertex Step.

+
+
+
+
@Test
+public void showAndStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1", "surname", "x", "address", "y");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2", "surname", "x", "address", "y");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3", "surname", "x", "address", "y");
+    Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4", "surname", "x", "address", "y");
+    Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5", "surname", "x", "address", "y");
+    Vertex c6 = this.sqlgGraph.addVertex(T.label, "C", "name", "c6", "surname", "x", "address", "y");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b2.addEdge("bc", c2);
+    b2.addEdge("bc", c3);
+    b2.addEdge("bc", c4);
+    b2.addEdge("bc", c5);
+    b2.addEdge("bc", c6);
+    this.sqlgGraph.tx().commit();
+
+    GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .out()
+            .out()
+            .and(
+                    __.has("name", "c1"),
+                    __.has("surname", "x"),
+                    __.has("address", "y")
+            );
+
+    System.out.println(traversal);
+    traversal.hasNext();
+    System.out.println(traversal);
+    List<Vertex> c = traversal.toList();
+    assertEquals(1, c.size());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), VertexStep(OUT,vertex), AndStep([[HasStep([name.eq(c1)])], [HasStep([surname.eq(x)])], [HasStep([address.eq(y)])]])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel]]
+
+
+
+

This example is similar to the Graph Step example except for an additional And Step which in turn contains three Has Step s. +It shows the two Vertex Step s the And Step and the Has Step s being folded into the SqlgGraphStep.

+
+
+

The SqlgGraphStep will generate the following sql to retrieve the data.

+
+
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."address" AS "alias2",
+	"public"."V_C"."surname" AS "alias3",
+	"public"."V_C"."name" AS "alias4"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+(("public"."V_C"."name" = ?) AND ("public"."V_C"."surname" = ?) AND ("public"."V_C"."address" = ?)
+) (1)
+
+
+
+
    +
  1. +

    The And Step realizes itself as a sql where clause.

    +
  2. +
+
+
+
+

10.1.6. Not Step

+
+

Not Steps are folded into the Graph Step or Vertex Step.

+
+
+
+

10.1.7. Repeat Step

+ +
+

Sqlg optimizes the RepeatStep so long as the until modulator is not present. +RepeatStep can be optimized with the modulator emit and times.

+
+
+
Repeat Step with emit first
+
+
+
@Test
+public void showRepeatStepEmitFirst() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b1.addEdge("bc", c2);
+    b1.addEdge("bc", c3);
+    this.sqlgGraph.tx().commit();
+
+    List<Path> paths = this.sqlgGraph.traversal().V().hasLabel("A")
+            .emit()
+            .times(2)
+            .repeat(
+                    __.out()
+            )
+            .path().by("name")
+            .toList();
+    for (Path path : paths) {
+        System.out.println(path);
+    }
+}
+
+
+
+
output
+
+
[a1, b1, c3]
+[a1, b1, c2]
+[a1, b1, c1]
+[a1]
+[a2]
+[a1, b1]
+[a1, b2]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4",
+	"public"."V_B"."ID" AS "alias5",
+	"public"."V_B"."name" AS "alias6",
+	"public"."E_ab"."ID" AS "alias7"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" (1)
+
+SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A" (2)
+
+SELECT
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4",
+	"public"."E_ab"."ID" AS "alias5"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" (3)
+
+
+
+
    +
  1. +

    Get the 'A’s to emit.

    +
  2. +
  3. +

    Get the 'B’s to emit.

    +
  4. +
  5. +

    Get the 'C’s to emit.

    +
  6. +
+
+
+
+
Repeat Step with emit last
+
+
+
@Test
+public void showRepeatStepEmitLast() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b1.addEdge("bc", c2);
+    b1.addEdge("bc", c3);
+    this.sqlgGraph.tx().commit();
+
+    List<Path> paths = this.sqlgGraph.traversal().V().hasLabel("A")
+            .repeat(
+                    __.out()
+            )
+            .emit()
+            .times(2)
+            .path().by("name")
+            .toList();
+    for (Path path : paths) {
+        System.out.println(path);
+    }
+}
+
+
+
+
output
+
+
[a1, b1, c3]
+[a1, b1, c2]
+[a1, b1, c1]
+[a1, b1]
+[a1, b2]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4",
+	"public"."V_B"."ID" AS "alias5",
+	"public"."V_B"."name" AS "alias6",
+	"public"."E_ab"."ID" AS "alias7",
+	"public"."E_bc"."ID" AS "alias8"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" (1)
+
+SELECT
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4",
+	"public"."E_ab"."ID" AS "alias5"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" (2)
+
+
+
+
    +
  1. +

    Get the 'C’s to emit.

    +
  2. +
  3. +

    Get the 'B’s to emit.

    +
  4. +
+
+
+
+
+

10.1.8. Optional Step

+ +
+

Sqlg optimizes the OptionalStep.

+
+
+
+
@Test
+public void showOptionalStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b1.addEdge("bc", c2);
+    b1.addEdge("bc", c3);
+    this.sqlgGraph.tx().commit();
+
+    List<Path> paths = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .optional(
+                    __.out().optional(
+                            __.out()
+                    )
+            )
+            .path().by("name")
+            .toList();
+    for (Path path : paths) {
+        System.out.println(path);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OptionalStep([VertexStep(OUT,vertex), OptionalStep([VertexStep(OUT,vertex)])]), PathStep([value(name)])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], PathStep([value(name)])]
+
+
+
+
output
+
+
[a1, b1, c3]
+[a1, b1, c2]
+[a1, b1, c1]
+[a2]
+[a1, b2]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4",
+	"public"."V_B"."ID" AS "alias5",
+	"public"."V_B"."name" AS "alias6"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" (1)
+
+SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A" LEFT JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O"
+WHERE
+	("public"."E_ab"."public.A__O" IS NULL) (2)
+
+SELECT
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" LEFT JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O"
+WHERE
+	("public"."E_bc"."public.B__O" IS NULL) (3)
+
+
+
+
    +
  1. +

    Get the 'C’s

    +
  2. +
  3. +

    Get the 'A’s that do not have 'B’s

    +
  4. +
  5. +

    Get the 'B’s that do not have 'C’s

    +
  6. +
+
+
+
+

10.1.9. Choose Step

+ +
+
+
@Test
+public void showChooseStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, Path> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .choose(__.out(), __.out())
+            .path().by("name");
+
+    printTraversalForm(traversal);
+
+    List<Path> paths = traversal.toList();
+    for (Path path : paths) {
+        System.out.println(path);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), ChooseStep([VertexStep(OUT,vertex), HasNextStep],{false=[[IdentityStep, EndStep]], true=[[VertexStep(OUT,vertex), EndStep]]}), PathStep([value(name)])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], PathStep([value(name)])]
+
+
+
+
output
+
+
[a1, b1]
+[a1, b2]
+[a2]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2",
+	"public"."V_A"."ID" AS "alias3",
+	"public"."V_A"."name" AS "alias4"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID"
+DEBUG 2018-08-12 19:31:50,944 [main] org.umlg.sqlg.strategy.SqlgSqlExecutor:
+SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A" LEFT JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O"
+WHERE
+	("public"."E_ab"."public.A__O" IS NULL)
+
+
+
+
+

10.1.10. Order Step

+ +
+

Sqlg optimizes the OrderGlobalStep if the data that the order applies to can be retrieved in one sql statement. +If not then order the ordering occurs in java via the OrderGlobalStep as per normal.

+
+
+
+
@Test
+public void testOrderBy() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "a");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "b");
+    Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a", "surname", "c");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "a");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "b");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "A", "name", "b", "surname", "c");
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V().hasLabel("A")
+            .order().by("name", Order.incr).by("surname", Order.decr);
+    printTraversalForm(traversal);
+
+    List<Vertex> vertices = traversal.toList();
+    for (Vertex v : vertices) {
+        System.out.println(v.value("name") + " " + v.value("surname"));
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OrderGlobalStep([[value(name), incr], [value(surname), decr]])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel]]
+
+
+
+
output
+
+
a c
+a b
+a a
+b c
+b b
+b a
+
+
+
+
sql
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."surname" AS "alias2",
+	"public"."V_A"."name" AS "alias3"
+FROM
+	"public"."V_A"
+ORDER BY
+	 "alias3" ASC,
+	 "alias2" DESC
+
+
+
+
+

10.1.11. Range Step

+ +
+

Sqlg optimizes the RangeGlobalStep

+
+
+
+
@Test
+public void testRangeOnVertexLabels() {
+    for (int i = 0; i < 100; i++) {
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "person" + i);
+    }
+    this.sqlgGraph.tx().commit();
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("Person")
+            .order().by("name")
+            .range(1, 4)
+            .values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), OrderGlobalStep([[value(name), incr]]), RangeGlobalStep(1,4), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], PropertiesStep([name],value)]
+
+
+
+
output
+
+
person1
+person10
+person11
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."ID" AS "alias1",
+	"public"."V_Person"."name" AS "alias2"
+FROM
+	"public"."V_Person"
+ORDER BY
+	 "alias2" ASC
+LIMIT 3 OFFSET 1
+
+
+
+
+

10.1.12. Limit Step

+ +
+

Sqlg optimizes .limit(x)

+
+
+
+
@Test
+public void testLimitOnVertexLabels() {
+    for (int i = 0; i < 100; i++) {
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "person" + i);
+    }
+    this.sqlgGraph.tx().commit();
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("Person")
+            .order().by("name")
+            .limit(3)
+            .values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), OrderGlobalStep([[value(name), incr]]), RangeGlobalStep(0,3), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], PropertiesStep([name],value)]
+
+
+
+
output
+
+
person0
+person1
+person10
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."ID" AS "alias1",
+	"public"."V_Person"."name" AS "alias2"
+FROM
+	"public"."V_Person"
+ORDER BY
+	 "alias2" ASC
+LIMIT 3 OFFSET 0
+
+
+
+
+

10.1.13. Drop Step

+ +
+
+
@Test
+public void testsDropStepTrivial() {
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V().hasLabel("A").drop();
+    printTraversalForm(traversal);
+
+    traversal.iterate();
+    this.sqlgGraph.tx().commit();
+
+    assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), DropStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier]
+
+
+
+
sql
+
+
TRUNCATE ONLY "public"."V_A" (1)
+
+
+
+
    +
  1. +

    As vertex label 'A' has no in or out edges nor are there any predicates the TRUNCATE command is used.

    +
  2. +
+
+
+
+
@Test
+public void testsDropStepWithHas() {
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .has("name", P.within("a1", "a2"))
+            .drop();
+    printTraversalForm(traversal);
+
+    traversal.iterate();
+    this.sqlgGraph.tx().commit();
+
+    assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A), name.within([a1, a2])]), DropStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier]
+
+
+
+
sql
+
+
WITH todelete AS (
+SELECT
+	"public"."V_A"."ID" AS "alias1"
+FROM
+	"public"."V_A"
+WHERE
+	( "public"."V_A"."name" in (?, ?))
+)
+DELETE FROM "public"."V_A" a USING todelete
+WHERE a."ID" = todelete."alias1" (1)
+
+
+
+
    +
  1. +

    DELETE with a where clause.

    +
  2. +
+
+
+
+
@Test
+public void testDropStepWithEdges() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    a1.addEdge("ab", b3);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V().hasLabel("A").out().drop();
+    printTraversalForm(traversal);
+
+    traversal.iterate();
+    this.sqlgGraph.tx().commit();
+
+    assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("B").count().next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), DropStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[]), SqlgDropStepBarrier]
+
+
+
+
sql
+
+
SET CONSTRAINTS ALL DEFERRED (1)
+
+WITH todelete AS (
+SELECT
+	"public"."V_B"."ID" AS "alias1"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID"
+)
+DELETE FROM "public"."V_B" a USING todelete
+WHERE a."ID" = todelete."alias1" (2)
+
+WITH todelete AS (
+SELECT
+	"public"."E_ab"."ID" AS "alias1"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" LEFT JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID"
+WHERE
+	("public"."V_B"."ID" IS NULL) AND
+	("public"."E_ab"."public.B__I" IS NOT NULL)
+)
+DELETE FROM "public"."E_ab" a USING todelete
+WHERE a."ID" = todelete."alias1" (3)
+
+SET CONSTRAINTS ALL IMMEDIATE (4)
+
+
+
+
    +
  1. +

    On postgresql we defer (disable) the foreign key constraints.

    +
  2. +
  3. +

    Delete the 'B' vertices first. As the edge constraints are disabled this is possible.

    +
  4. +
  5. +

    Delete the edges. +<4>. Enable the foreign key constraints.

    +
  6. +
+
+
+
+

10.1.14. Reducing Steps

+ +
+
Min Step
+ +
+
+
@Test
+public void testMin() {
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 0);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Integer> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").min();
+    Assert.assertEquals(0, traversal.next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MinGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgMinGlobalStep]
+
+
+
+
sql
+
+
SELECT
+	MIN("public"."V_Person"."age") AS "alias1"
+FROM
+	"public"."V_Person"
+
+
+
+
+
Max Step
+ +
+
+
@Test
+public void testMax() {
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 1, "x", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 2, "x", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 3, "x", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 0, "x", 1);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Integer> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").max();
+    printTraversalForm(traversal);
+    Assert.assertEquals(3, traversal.next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MaxGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgMaxGlobalStep]
+
+
+
+
sql
+
+
SELECT
+	MAX("public"."V_Person"."age") AS "alias1"
+FROM
+	"public"."V_Person"
+
+
+
+
+
Sum Step
+ +
+
+
@Test
+public void testSum() {
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 0);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Long> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").sum();
+    printTraversalForm(traversal);
+    Assert.assertEquals(6, traversal.next(), 0L);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), SumGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgSumGlobalStep]
+
+
+
+
sql
+
+
SELECT
+	SUM("public"."V_Person"."age") AS "alias1"
+FROM
+	"public"."V_Person"
+
+
+
+
+
Mean Step
+ +
+
+
@Test
+public void testMean() {
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "age", 0);
+    this.sqlgGraph.tx().commit();
+    DefaultTraversal<Vertex, Double> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person").values("age").mean();
+    printTraversalForm(traversal);
+    Double d = traversal.next();
+    Assert.assertEquals(1.5, d, 0D);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), PropertiesStep([age],value), MeanGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([age],value), SqlgAvgGlobalStep]
+
+
+
+
sql
+
+
SELECT
+	AVG("public"."V_Person"."age") AS "alias1", COUNT(1) AS "alias1_weight"
+FROM
+	"public"."V_Person"
+
+
+
+
+
Count Step
+ +
+
+
@Test
+public void testCount() {
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a");
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a");
+    this.sqlgGraph.tx().commit();
+    DefaultTraversal<Vertex, Long> traversal = (DefaultTraversal<Vertex, Long>) this.sqlgGraph.traversal().V().count();
+    printTraversalForm(traversal);
+    Assert.assertEquals(4, traversal.next(), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), CountGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgPropertiesStep([count],value), SqlgCountGlobalStep]
+
+
+
+
sql
+
+
SELECT
+	COUNT(1)
+FROM
+	"public"."V_A"
+
+
+
+
+
Group By
+
+

Group Step's are optimized with sql’s group by clause.

+
+
+
+
Group By and Min Step
+
+
+
@Test
+public void testGroupOverOnePropertyMin() {
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Map<String, Integer>> traversal = (DefaultTraversal) sqlgGraph.traversal()
+            .V().hasLabel("Person")
+            .<String, Integer>group().by("name").by(__.values("age").min());
+    printTraversalForm(traversal);
+    Map<String, Integer> result = traversal.next();
+    Assert.assertFalse(traversal.hasNext());
+    Assert.assertTrue(result.containsKey("A"));
+    Assert.assertTrue(result.containsKey("B"));
+    Assert.assertEquals(1, result.get("A"), 0);
+    Assert.assertEquals(2, result.get("B"), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), MinGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."name" AS "alias1",
+	MIN("public"."V_Person"."age") AS "alias2"
+FROM
+	"public"."V_Person"
+GROUP BY
+	"public"."V_Person"."name"
+
+
+
+
+
Group By and Max Step
+
+
+
    @Test
+    public void testGroupByLabelMax() {
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 10);
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 20);
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "C", "age", 100);
+        this.sqlgGraph.addVertex(T.label, "Person", "name", "D", "age", 40);
+
+        this.sqlgGraph.addVertex(T.label, "Dog", "name", "A", "age", 10);
+        this.sqlgGraph.addVertex(T.label, "Dog", "name", "B", "age", 200);
+        this.sqlgGraph.addVertex(T.label, "Dog", "name", "C", "age", 30);
+        this.sqlgGraph.addVertex(T.label, "Dog", "name", "D", "age", 40);
+
+        this.sqlgGraph.tx().commit();
+
+        DefaultTraversal<Vertex, Map<String, Integer>> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().<String, Integer>group().by(T.label).by(__.values("age").max());
+        printTraversalForm(traversal);
+
+        Map<String, Integer> result = traversal.next();
+        Assert.assertFalse(traversal.hasNext());
+        Assert.assertEquals(2, result.size());
+        Assert.assertTrue(result.containsKey("Person"));
+        Assert.assertTrue(result.containsKey("Dog"));
+        Assert.assertEquals(100, result.get("Person"), 0);
+        Assert.assertEquals(200, result.get("Dog"), 0);
+    }
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), GroupStep(label,[PropertiesStep([age],value), MaxGlobalStep]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	MAX("public"."V_Person"."age") AS "alias1"
+FROM
+	"public"."V_Person"
+
+SELECT
+	MAX("public"."V_Dog"."age") AS "alias1"
+FROM
+	"public"."V_Dog"
+
+
+
+
+
@Test
+public void testGroupOverTwoPropertiesWithValues() {
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "surname", "C", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "surname", "D", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "surname", "C", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "surname", "E", "age", 4);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "C", "surname", "E", "age", 5);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Map<List<String>, Integer>> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V().hasLabel("Person")
+            .<List<String>, Integer>group()
+            .by(__.values("name", "surname").fold())
+            .by(__.values("age").max());
+
+    printTraversalForm(traversal);
+
+    Map<List<String>, Integer> result = traversal.next();
+    Assert.assertTrue(result.containsKey(Arrays.asList("A", "C")) || result.containsKey(Arrays.asList("C", "A")));
+    Assert.assertTrue(result.containsKey(Arrays.asList("B", "D")) || result.containsKey(Arrays.asList("D", "B")));
+    Assert.assertTrue(result.containsKey(Arrays.asList("B", "E")) || result.containsKey(Arrays.asList("E", "B")));
+    Assert.assertTrue(result.containsKey(Arrays.asList("C", "E")) || result.containsKey(Arrays.asList("E", "C")));
+    Assert.assertEquals(4, result.size());
+    Assert.assertFalse(traversal.hasNext());
+
+    if (result.containsKey(Arrays.asList("A", "C"))) {
+        Assert.assertEquals(3, result.get(Arrays.asList("A", "C")), 0);
+    } else {
+        Assert.assertEquals(3, result.get(Arrays.asList("C", "A")), 0);
+    }
+    if (result.containsKey(Arrays.asList("B", "D"))) {
+        Assert.assertEquals(2, result.get(Arrays.asList("B", "D")), 0);
+    } else {
+        Assert.assertEquals(2, result.get(Arrays.asList("D", "B")), 0);
+    }
+    if (result.containsKey(Arrays.asList("B", "E"))) {
+        Assert.assertEquals(4, result.get(Arrays.asList("B", "E")), 0);
+    } else {
+        Assert.assertEquals(4, result.get(Arrays.asList("E", "B")), 0);
+    }
+    if (result.containsKey(Arrays.asList("C", "E"))) {
+        Assert.assertEquals(5, result.get(Arrays.asList("C", "E")), 0);
+    } else {
+        Assert.assertEquals(5, result.get(Arrays.asList("E", "C")), 0);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep([PropertiesStep([name, surname],value), FoldStep],[PropertiesStep([age],value), MaxGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."surname" AS "alias1",
+	"public"."V_Person"."name" AS "alias2",
+	MAX("public"."V_Person"."age") AS "alias3"
+FROM
+	"public"."V_Person"
+GROUP BY
+	"public"."V_Person"."name",
+	"public"."V_Person"."surname"
+
+
+
+
+
Group By and Sum Step
+
+
+
@Test
+public void testGroupOverOnePropertySum() {
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Map<String, Long>> traversal = (DefaultTraversal) sqlgGraph.traversal()
+            .V().hasLabel("Person")
+            .<String, Long>group().by("name").by(__.values("age").sum());
+    printTraversalForm(traversal);
+    Map<String, Long> result = traversal.next();
+    Assert.assertFalse(traversal.hasNext());
+    Assert.assertTrue(result.containsKey("A"));
+    Assert.assertTrue(result.containsKey("B"));
+    Assert.assertEquals(4, result.get("A"), 0L);
+    Assert.assertEquals(6, result.get("B"), 0L);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), SumGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."name" AS "alias1",
+	SUM("public"."V_Person"."age") AS "alias2"
+FROM
+	"public"."V_Person"
+GROUP BY
+	"public"."V_Person"."name"
+
+
+
+
+
Group By and Mean Step
+
+
+
@Test
+public void testGroupOverOnePropertyMean() {
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "A", "age", 3);
+    this.sqlgGraph.addVertex(T.label, "Person", "name", "B", "age", 4);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Map<String, Double>> traversal = (DefaultTraversal) sqlgGraph.traversal()
+            .V().hasLabel("Person")
+            .<String, Double>group().by("name").by(__.values("age").mean());
+    printTraversalForm(traversal);
+    Map<String, Double> result = traversal.next();
+    Assert.assertFalse(traversal.hasNext());
+    Assert.assertTrue(result.containsKey("A"));
+    Assert.assertTrue(result.containsKey("B"));
+    Assert.assertEquals(2.0, result.get("A"), 0D);
+    Assert.assertEquals(3.0, result.get("B"), 0D);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(Person)]), GroupStep(value(name),[PropertiesStep([age],value), MeanGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."name" AS "alias1",
+	AVG("public"."V_Person"."age") AS "alias2", COUNT(1) AS "alias2_weight"
+FROM
+	"public"."V_Person"
+GROUP BY
+	"public"."V_Person"."name"
+
+
+
+
+
Group By and Count Step
+
+
+
@Test
+public void testGroupByCount() {
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a", "age", 1);
+    this.sqlgGraph.addVertex(T.label, "A", "name", "a", "age", 2);
+    this.sqlgGraph.addVertex(T.label, "A", "name", "b", "age", 3);
+    this.sqlgGraph.tx().commit();
+    DefaultTraversal<Vertex, Map<Object, Long>> traversal = (DefaultTraversal<Vertex, Map<Object, Long>>) this.sqlgGraph.traversal().V().hasLabel("A")
+            .<Object, Long>group().by("name").by(__.count());
+    List<Map<Object, Long>> result = traversal.toList();
+    Assert.assertEquals(1, result.size());
+    Assert.assertTrue(result.get(0).containsKey("a"));
+    Assert.assertTrue(result.get(0).containsKey("b"));
+    Assert.assertEquals(2L, result.get(0).get("a"), 0);
+    Assert.assertEquals(1L, result.get(0).get("b"), 0);
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), GroupStep(value(name),[CountGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	COUNT(1) AS "count",
+	"public"."V_A"."name" AS "alias1"
+FROM
+	"public"."V_A"
+GROUP BY
+	"public"."V_A"."name"
+
+
+
+
+
@Test
+public void testDuplicatePathGroupCountQuery() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "age", 1);
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 1);
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 2);
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 3);
+    Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b", "age", 3);
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 1);
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 2);
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "b", "age", 3);
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    a1.addEdge("ab", b3);
+    a1.addEdge("ab", b4);
+    a1.addEdge("ac", c1);
+    a1.addEdge("ac", c2);
+    a1.addEdge("ac", c3);
+    this.sqlgGraph.tx().commit();
+
+    DefaultTraversal<Vertex, Map<String, Long>> traversal = (DefaultTraversal) this.sqlgGraph.traversal().V(a1).out("ab", "ac").group().by("name").by(__.count());
+    Assert.assertEquals(2, traversal.getSteps().size());
+    Assert.assertTrue(traversal.getSteps().get(0) instanceof SqlgGraphStep);
+    Assert.assertTrue(traversal.getSteps().get(1) instanceof SqlgGroupStep);
+    Map<String, Long> result = traversal.next();
+    Assert.assertEquals(1, result.size());
+    Assert.assertTrue(result.containsKey("b"));
+    Assert.assertEquals(7, result.get("b"), 0);
+    Assert.assertFalse(traversal.hasNext());
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[v[public.A:::1]]), VertexStep(OUT,[ab, ac],vertex), GroupStep(value(name),[CountGlobalStep])]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathTempFakeLabel], SqlgGroupStep]
+
+
+
+
sql
+
+
SELECT
+	COUNT(1) AS "count",
+	"public"."V_C"."name" AS "alias1"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ac" ON "public"."V_A"."ID" = "public"."E_ac"."public.A__O" INNER JOIN
+	"public"."V_C" ON "public"."E_ac"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	( "public"."V_A"."ID" = ?)
+GROUP BY
+	"public"."V_C"."name";
+
+SELECT
+	COUNT(1) AS "count",
+	"public"."V_B"."name" AS "alias1"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID"
+WHERE
+	( "public"."V_A"."ID" = ?)
+GROUP BY
+	"public"."V_B"."name";
+
+
+
+
+
+
+

10.2. Optimization (strategy 2)

+
+

The following steps are optimized. Steps are

+
+
+ +
+
+

The combined step will then in turn generate the sql statements to retrieve the data. +It attempts to retrieve the data in as few distinct sql statements as possible.

+
+
+

10.2.1. Vertex Step

+
+
+
@Test
+public void testStrategy2VertexStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    a1.addEdge("ab", b1);
+    a2.addEdge("ab", b2);
+    a3.addEdge("ab", b3);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> t = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .limit(2)
+            .out()
+            .values("name");
+    printTraversalForm(t);
+    List<String> result = t.toList();
+    for (String name : result) {
+        System.out.println(name);
+    }
+}
+
+
+
+
output
+
+
b1
+b2
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), RangeGlobalStep(0,2), VertexStep(OUT,vertex), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathOrderRangeLabel], SqlgVertexStep@[sqlgPathFakeLabel], PropertiesStep([name],value)]
+
+
+
+

after optimization shows that there is a SqlgVertexStep +after the SqlgGraphStep. The SqlgVertexStep will barrier the incoming A s and execute the next traversal for all +the incoming elements in one sql statement.

+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+LIMIT 2 OFFSET 0 (1)
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index" (2)
+
+
+
+
    +
  1. +

    Get all the A s.

    +
  2. +
  3. +

    For all the previously fetched A s get the B s.

    +
  4. +
+
+
+
+

10.2.2. Repeat Step

+
+
+
@Test
+public void testStrategy2RepeatStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b4");
+    Vertex b5 = this.sqlgGraph.addVertex(T.label, "B", "name", "b5");
+    Vertex b6 = this.sqlgGraph.addVertex(T.label, "B", "name", "b6");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4");
+    Vertex x = this.sqlgGraph.addVertex(T.label, "X", "name", "hallo");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    a1.addEdge("ab", b3);
+    a2.addEdge("ab", b4);
+    a2.addEdge("ab", b5);
+    a2.addEdge("ab", b6);
+
+    b1.addEdge("bx", x);
+
+    b4.addEdge("bc", c1);
+    b4.addEdge("bc", c2);
+    b4.addEdge("bc", c3);
+
+    c1.addEdge("cx", x);
+
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> t = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .repeat(__.out())
+            .until(__.out().has("name", "hallo"))
+            .values("name");
+    printTraversalForm(t);
+
+    List<String> names = t.toList();
+    for (String name: names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until([VertexStep(OUT,vertex), HasStep([name.eq(hallo)])]),emit(false)), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
post-strategy:[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgRepeatStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel], SqlgRepeatEndStepBarrier],until([SqlgVertexStep@[sqlgPathFakeLabel]]),emit(false)), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A" (1)
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index" (2)
+
+SELECT
+	"index" as "index",
+	"public"."V_X"."ID" AS "alias1",
+	"public"."V_X"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bx" ON "public"."V_B"."ID" = "public"."E_bx"."public.B__O" INNER JOIN
+	"public"."V_X" ON "public"."E_bx"."public.X__I" = "public"."V_X"."ID" INNER JOIN
+	(VALUES(3, 1),(2, 2),(1, 3),(6, 4),(5, 5),(4, 6)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId"
+WHERE
+	( "public"."V_X"."name" = ?)
+ORDER BY
+	"index" (3)
+
+SELECT
+	"index" as "index",
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" INNER JOIN
+	(VALUES(3, 1),(2, 2),(1, 3),(6, 4),(5, 5),(4, 6)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId"
+WHERE
+	( "public"."V_C"."name" = ?)
+ORDER BY
+	"index" (4)
+
+SELECT
+	"index" as "index",
+	"public"."V_X"."ID" AS "alias1",
+	"public"."V_X"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bx" ON "public"."V_B"."ID" = "public"."E_bx"."public.B__O" INNER JOIN
+	"public"."V_X" ON "public"."E_bx"."public.X__I" = "public"."V_X"."ID" INNER JOIN
+	(VALUES(3, 3),(2, 4),(6, 5),(5, 6),(4, 7)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId"
+ORDER BY
+	"index" (5)
+
+SELECT
+	"index" as "index",
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID" INNER JOIN
+	(VALUES(3, 3),(2, 4),(6, 5),(5, 6),(4, 7)) AS tmp ("tmpId", "index") ON "public"."V_B"."ID" = tmp."tmpId"
+ORDER BY
+	"index" (6)
+
+SELECT
+	"index" as "index",
+	"public"."V_X"."ID" AS "alias1",
+	"public"."V_X"."name" AS "alias2"
+FROM
+	"public"."V_C" INNER JOIN
+	"public"."E_cx" ON "public"."V_C"."ID" = "public"."E_cx"."public.C__O" INNER JOIN
+	"public"."V_X" ON "public"."E_cx"."public.X__I" = "public"."V_X"."ID" INNER JOIN
+	(VALUES(3, 7),(2, 8),(1, 9)) AS tmp ("tmpId", "index") ON "public"."V_C"."ID" = tmp."tmpId"
+WHERE
+	( "public"."V_X"."name" = ?)
+ORDER BY
+	"index" (7)
+
+SELECT
+	"index" as "index",
+	"public"."V_X"."ID" AS "alias1",
+	"public"."V_X"."name" AS "alias2"
+FROM
+	"public"."V_C" INNER JOIN
+	"public"."E_cx" ON "public"."V_C"."ID" = "public"."E_cx"."public.C__O" INNER JOIN
+	"public"."V_X" ON "public"."E_cx"."public.X__I" = "public"."V_X"."ID" INNER JOIN
+	(VALUES(3, 8),(2, 9)) AS tmp ("tmpId", "index") ON "public"."V_C"."ID" = tmp."tmpId"
+ORDER BY
+	"index" (8)
+
+
+
+
    +
  1. +

    Get all the A s.

    +
  2. +
  3. +

    Get all the B s for the incoming A s. This represent the first out iteration of the repeat.

    +
  4. +
  5. +

    The until traversal executed for all the incoming B s going out to X.

    +
  6. +
  7. +

    The until traversal executed for all the incoming B s going out to C.

    +
  8. +
  9. +

    Get all the X for the incoming B s. This is the second out iteration of the repeat.

    +
  10. +
  11. +

    Get all the C for the incoming B s. This is the second out iteration of the repeat.

    +
  12. +
  13. +

    The until traversal executed for all the incoming C s going out to X.

    +
  14. +
  15. +

    Get all the X for the incoming C s. This is the third out iteration of the repeat.

    +
  16. +
+
+
+
output
+
+
b1
+c1
+
+
+
+
+

10.2.3. Optional Step

+
+
+
@Test
+public void testStrategy2OptionalStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+
+
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .optional(
+                __.repeat(
+                        __.out()
+                ).times(2)
+            )
+            .values("name");
+    printTraversalForm(traversal);
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OptionalStep([RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(2)),emit(false))]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgOptionalStepBarrier([SqlgRepeatStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel], SqlgRepeatEndStepBarrier],until(loops(2)),emit(false))]), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+SELECT
+	3 as "index",
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	"public"."V_B"."ID" = 2
+ORDER BY
+	"index"
+
+SELECT
+	4 as "index",
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	"public"."V_B"."ID" = 1
+ORDER BY
+	"index"
+
+
+
+
output
+
+
a2
+c1
+
+
+
+
+

10.2.4. Choose Step

+
+
+
@Test
+public void testStrategy2ChooseStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "a3");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "a4");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V()
+            .hasLabel("A")
+            .choose(
+                    v -> v.label().equals("A"),
+                    __.out(),
+                    __.in()
+            ).values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+

+
+
+
+
After optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), ChooseStep([LambdaFilterStep(lambda), HasNextStep],{false=[[VertexStep(IN,vertex), EndStep]], true=[[VertexStep(OUT,vertex), EndStep]]}), PropertiesStep([name],value)]
+
+
+
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgChooseStepBarrier([LambdaFilterStep(lambda)],{false=[[SqlgVertexStep, EndStep]], true=[[SqlgVertexStep@[~gremlin.incidentToAdjacent], EndStep]]}), PropertiesStep([name],value)]
+
+
+
+
output
+
+
a4
+a3
+
+
+
+
+

10.2.5. Local Step

+
+
+
@Test
+public void testStrategy2LocalStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    Vertex c11 = this.sqlgGraph.addVertex(T.label, "C", "name", "c11");
+    Vertex c12 = this.sqlgGraph.addVertex(T.label, "C", "name", "c12");
+    Vertex c13 = this.sqlgGraph.addVertex(T.label, "C", "name", "c13");
+    Vertex c21 = this.sqlgGraph.addVertex(T.label, "C", "name", "c21");
+    Vertex c22 = this.sqlgGraph.addVertex(T.label, "C", "name", "c22");
+    Vertex c23 = this.sqlgGraph.addVertex(T.label, "C", "name", "c23");
+    Vertex c31 = this.sqlgGraph.addVertex(T.label, "C", "name", "c31");
+    Vertex c32 = this.sqlgGraph.addVertex(T.label, "C", "name", "c32");
+    Vertex c33 = this.sqlgGraph.addVertex(T.label, "C", "name", "c33");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    a1.addEdge("ab", b3);
+    b1.addEdge("bc", c11);
+    b1.addEdge("bc", c12);
+    b1.addEdge("bc", c13);
+    b2.addEdge("bc", c21);
+    b2.addEdge("bc", c22);
+    b2.addEdge("bc", c23);
+    b3.addEdge("bc", c31);
+    b3.addEdge("bc", c32);
+    b3.addEdge("bc", c33);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V(a1)
+            .local(
+                    __.out().limit(1).out()
+            ).values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[v[public.A:::1]]), LocalStep([VertexStep(OUT,vertex), RangeGlobalStep(0,1), VertexStep(OUT,vertex)]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], LocalStep([SqlgVertexStep@[sqlgPathOrderRangeLabel], SqlgVertexStep@[sqlgPathFakeLabel]]), PropertiesStep([name],value)]
+
+
+
+
+
+
+
+
+
output
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+WHERE
+	( "public"."V_A"."ID" = ?)
+
+SELECT
+	1 as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID"
+WHERE
+	"public"."V_A"."ID" = 1
+ORDER BY
+	"index"
+LIMIT 1 OFFSET 0 (1)
+
+SELECT
+	1 as "index",
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_B" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	"public"."V_B"."ID" = 1
+ORDER BY
+	"index"
+
+
+
+
    +
  1. +

    In this case the query is simple enough for the LIMIT to be executed on the database.

    +
  2. +
+
+
+
+

10.2.6. And Step

+
+
+
@Test
+public void testStrategy2AndStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    a1.addEdge("ab", b1);
+    a1.addEdge("abb", b1);
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    a2.addEdge("abb", b2);
+    Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    a3.addEdge("abbb", b3);
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal().V().hasLabel("A").and(
+            __.out("ab"),
+            __.out("abb")
+    ).values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), AndStep([[VertexStep(OUT,[ab],vertex)], [VertexStep(OUT,[abb],vertex)]]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgAndStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2),(3, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_abb" ON "public"."V_A"."ID" = "public"."E_abb"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_abb"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2),(3, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+
+
+
output
+
+
a1
+
+
+
+
+

10.2.7. Or Step

+
+
+
@Test
+public void testStrategy2OrStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    a1.addEdge("ab", b1);
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    a2.addEdge("abb", b2);
+    Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    a3.addEdge("abbb", b3);
+    Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4");
+    Vertex b4 = this.sqlgGraph.addVertex(T.label, "B", "name", "b4");
+    a4.addEdge("abbbb", b4);
+
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .or(
+                    __.out("ab"),
+                    __.out("abb"),
+                    __.out("abbb")
+            ).values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), OrStep([[VertexStep(OUT,[ab],vertex)], [VertexStep(OUT,[abb],vertex)], [VertexStep(OUT,[abbb],vertex)]]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgOrStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]], [SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2),(3, 3),(4, 4)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_abb" ON "public"."V_A"."ID" = "public"."E_abb"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_abb"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(2, 1),(3, 2),(4, 3)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_abbb" ON "public"."V_A"."ID" = "public"."E_abbb"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_abbb"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(3, 1),(4, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+
+
+
output
+
+
a1
+a2
+a3
+
+
+
+
+

10.2.8. Not Step

+
+
+
@Test
+public void testStrategy2NotStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    a1.addEdge("ab", b1);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .not(
+                    __.out()
+            ).values("name");
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), NotStep([VertexStep(OUT,vertex)]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgNotStepBarrier([[SqlgVertexStep@[sqlgPathFakeLabel]]]), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+
+
+
output
+
+
a2
+
+
+
+
+

10.2.9. Where Step

+
+
+
@Test
+public void testStrategy2WhereStep() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    a1.addEdge("ab", b3);
+    a2.addEdge("ab", b1);
+    this.sqlgGraph.tx().commit();
+
+    Traversal<Vertex, String> traversal = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .where(
+                    __.out()
+            ).values("name");
+    printTraversalForm(traversal);
+
+    List<String> names = traversal.toList();
+    for (String name : names) {
+        System.out.println(name);
+    }
+}
+
+
+
+
Before optimization
+
+
[GraphStep(vertex,[]), HasStep([~label.eq(A)]), TraversalFilterStep([VertexStep(OUT,vertex)]), PropertiesStep([name],value)]
+
+
+
+
After optimization
+
+
[SqlgGraphStep(vertex,[])@[sqlgPathFakeLabel], SqlgTraversalFilterStepBarrier([SqlgVertexStep@[sqlgPathFakeLabel]]), PropertiesStep([name],value)]
+
+
+
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."name" AS "alias2"
+FROM
+	"public"."V_A"
+
+SELECT
+	"index" as "index",
+	"public"."V_B"."ID" AS "alias1",
+	"public"."V_B"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	(VALUES(1, 1),(2, 2)) AS tmp ("tmpId", "index") ON "public"."V_A"."ID" = tmp."tmpId"
+ORDER BY
+	"index"
+
+
+
+
+
+

10.3. Predicates

+
+

TinkerPop’s Compare and +Contains predicates are optimized +to execute on the database.

+
+
+

10.3.1. Compare predicate

+
+
+
@Test
+public void showComparePredicates() {
+    Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
+    Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
+    Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
+    Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
+    Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
+    Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
+    Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4");
+    a1.addEdge("ab", b1);
+    a1.addEdge("ab", b2);
+    b1.addEdge("bc", c1);
+    b1.addEdge("bc", c2);
+    b2.addEdge("bc", c3);
+    b2.addEdge("bc", c4);
+    this.sqlgGraph.tx().commit();
+
+    List<String> result = this.sqlgGraph.traversal()
+            .V().hasLabel("A")
+            .out().has("name", P.eq("b1"))
+            .out().has("name", P.eq("c2")) (1)
+            .<String>values("name")
+            .toList();
+    for (String name : result) {
+        System.out.println(name);
+    }
+}
+
+
+
+
    +
  1. +

    The P predicates will resolve on the database as a sql where clause.

    +
  2. +
+
+
+
sql
+
+
SELECT
+	"public"."V_C"."ID" AS "alias1",
+	"public"."V_C"."name" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	"public"."E_ab" ON "public"."V_A"."ID" = "public"."E_ab"."public.A__O" INNER JOIN
+	"public"."V_B" ON "public"."E_ab"."public.B__I" = "public"."V_B"."ID" INNER JOIN
+	"public"."E_bc" ON "public"."V_B"."ID" = "public"."E_bc"."public.B__O" INNER JOIN
+	"public"."V_C" ON "public"."E_bc"."public.C__I" = "public"."V_C"."ID"
+WHERE
+	( "public"."V_B"."name" = ?) AND ( "public"."V_C"."name" = ?)
+
+
+
+

The same pattern is used for all the +Compare predicates.

+
+
+
+

10.3.2. Contains predicate

+
+

Sqlg’s implementation of Contains +is slightly more complex.

+
+
+

For Postgresql, MSSqlServer and HSQLDB a join onto a values expression is used.

+
+
+

For H2 and MariaDB a regular in clause is used.

+
+
+
+
@Test
+public void showContainsPredicate() {
+    List<Integer> numbers = new ArrayList<>(10000);
+    for (int i = 0; i < 10000; i++) {
+        this.sqlgGraph.addVertex(T.label, "A", "number", i);
+        numbers.add(i);
+    }
+    this.sqlgGraph.tx().commit();
+
+    List<Vertex> persons = this.sqlgGraph.traversal().V()
+            .hasLabel("A")
+            .has("number", P.within(numbers))
+            .toList();
+
+    assertEquals(10000, persons.size());
+}
+
+
+
+
sql
+
+
SELECT
+	"public"."V_A"."ID" AS "alias1",
+	"public"."V_A"."number" AS "alias2"
+FROM
+	"public"."V_A" INNER JOIN
+	(VALUES (0::INTEGER), (1::INTEGER), ... (9998::INTEGER), (9999::INTEGER)) as tmp1(within) on "public"."V_A"."number" = tmp1.within
+
+
+
+

This pattern makes P.within and p.without very fast even with millions of values being passed into the query. +For the case of there being only one value Sqlg will use an equals instead of a values statement or an in statement.

+
+
+
+

10.3.3. Text predicate

+
+ + + + + +
+
Note
+
+Sqlg assumes a case-sensitive collation. +MSSqlServer does not default to a case-sensitive collation. +Create the database with CREATE DATABASE sqlgraphdb COLLATE sql_latin1_general_cp1_cs_as +
+
+
+

Sqlg includes its own Text predicate for full text queries.

+
+
+
    +
  • +

    Text.contains (case sensitive string contains)

    +
  • +
  • +

    Text.ncontains (case sensitive string does not contain)

    +
  • +
  • +

    Text.containsCIS (case insensitive string contains)

    +
  • +
  • +

    Text.ncontainsCIS (case insensitive string does not contain)

    +
  • +
  • +

    Text.startsWith (case sensitive string starts with)

    +
  • +
  • +

    Text.nstartsWith (case sensitive string does not start with)

    +
  • +
  • +

    Text.endsWith (case sensitive string ends with)

    +
  • +
  • +

    Text.nendsWith (case sensitive string does not end with)

    +
  • +
+
+
+
+
@Test
+public void showTextPredicate() {
+    Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John XXX Doe");
+    Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "Peter YYY Snow");
+    this.sqlgGraph.tx().commit();
+
+    List<Vertex> persons = this.sqlgGraph.traversal().V()
+            .hasLabel("Person")
+            .has("name", Text.contains("XXX")).toList();
+
+    assertEquals(1, persons.size());
+    assertEquals(john, persons.get(0));
+}
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."ID" AS "alias1",
+	"public"."V_Person"."name" AS "alias2"
+FROM
+	"public"."V_Person"
+WHERE
+	( "public"."V_Person"."name" like ?)
+
+
+
+
+ +
+

Full text search is supported on postgresql.

+
+
+

This is shown under full text indexing

+
+
+
+

10.3.5. DateTime queries

+
+

LocalDateTime, LocalDate and LocalTime queries are supported.

+
+
+
+
@Test
+public void showSearchOnLocalDateTime() {
+    LocalDateTime born1 = LocalDateTime.of(1990, 1, 1, 1, 1, 1);
+    LocalDateTime born2 = LocalDateTime.of(1990, 1, 1, 1, 1, 2);
+    LocalDateTime born3 = LocalDateTime.of(1990, 1, 1, 1, 1, 3);
+    Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John", "born", born1);
+    Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "Peter", "born", born2);
+    Vertex paul = this.sqlgGraph.addVertex(T.label, "Person", "name", "Paul", "born", born3);
+    this.sqlgGraph.tx().commit();
+
+    List<Vertex> persons = this.sqlgGraph.traversal().V().hasLabel("Person")
+            .has("born", P.eq(born1))
+            .toList();
+    assertEquals(1, persons.size());
+    assertEquals(john, persons.get(0));
+
+    persons = this.sqlgGraph.traversal().V().hasLabel("Person")
+            .has("born", P.between(LocalDateTime.of(1990, 1, 1, 1, 1, 1), LocalDateTime.of(1990, 1, 1, 1, 1, 3)))
+            .toList();
+    //P.between is inclusive to exclusive
+    assertEquals(2, persons.size());
+    assertTrue(persons.contains(john));
+    assertTrue(persons.contains(peter));
+}
+
+
+
+
sql
+
+
SELECT
+	"public"."V_Person"."ID" AS "alias1",
+	"public"."V_Person"."born" AS "alias2",
+	"public"."V_Person"."name" AS "alias3"
+FROM
+	"public"."V_Person"
+WHERE
+	( "public"."V_Person"."born" >= ?) AND ( "public"."V_Person"."born" < ?)
+
+
+
+
+
+
+
+

11. Batch Mode

+
+
+

Sqlg supports 3 distinct batch modes. Normal, streaming and streaming with lock. Batch modes are only implemented on Postgresql. +Batch mode is activated on the transaction object itself. After every commit the batchMode needs to be reactivated.

+
+
+

Sqlg introduces an extra method on the transaction, flush().

+
+
+
    +
  • +

    In normal batch mode flush() will send all the data to Postgresql, assign id(s) and clear the cache.

    +
  • +
  • +

    In streaming mode flush() will close the OutputStream that the data has been written to.

    +
  • +
  • +

    In streaming mode with lock flush() will close the OutputStream that the data has been written to and assign id(s).

    +
  • +
+
+
+

The Postgresql 'copy' command is used to bulk insert data.

+
+
+

11.1. Normal batch mode

+
+

In normal batch mode the standard TinkerPop modification api can be used. Normal batch mode caches all modifications in memory +and on commit() or flush() sends the modifications to the server.

+
+
+

Because all modifications are held in memory it is important to call commit() or flush() to prevent an OutOfMemoryError.

+
+
+

In batch mode vertices and edges returned from Graph.addVertex and vertex.addEdge respectively do not yet have their id(s) assigned to them. +This is because the new vertices and edges are cached in memory and are only sent to Postgresql on commit() or flush(). +After commit() or flush() the new vertices and edges have their id(s) assigned.

+
+
+

The transaction must be manually placed in normal batch mode. i.e. SqlgGraph.tx().normalBatchModeOn() must occur before any batch processing. +After every commit() the transaction reverts to a regular transaction and must be placed in normal batch mode again +for batch processing to continue.

+
+
+

Vertices and edges can be created and updated and removed as per normal making normal batch mode easy to use.

+
+
+ + + + + +
+
Note
+
+Sqlg does not query the cache. If a gremlin query is executed while in batch mode the batch is first flushed. +Take care not to query the graph while in batch mode as flushing often will defeat the purpose of batching in the first place. +
+
+
+
custom api
+
+
sqlgGraph.tx().normalBatchModeOn();
+sqlgGraph.tx().flush();
+
+
+
+

Create 10 000 000 Persons each with a car. 20 000 000 vertices and 10 000 000 edges in total.

+
+
+
+
@Test
+public void showNormalBatchMode() {
+    StopWatch stopWatch = new StopWatch();
+    stopWatch.start();
+    this.sqlgGraph.tx().normalBatchModeOn();
+    for (int i = 1; i <= 10_000_000; i++) {
+        Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John" + i);
+        Vertex car = this.sqlgGraph.addVertex(T.label, "Car", "name", "Dodge" + i);
+        person.addEdge("drives", car);
+        if (i % 100_000 == 0) { # (1)
+            this.sqlgGraph.tx().flush(); # (1)
+        }
+    }
+    this.sqlgGraph.tx().commit();
+    stopWatch.stop();
+    System.out.println(stopWatch.toString());
+}
+
+
+
+
    +
  1. +

    To preserve memory commit or flush every so often.

    +
  2. +
+
+
+
output without edge foreign keys
+
+
Time taken: 0:05:48.889
+
+
+
+
output with edge foreign keys
+
+
Time taken: 0:02:33.313
+
+
+
+
memory
+

image of tinkerpop-classic

+
+
+
+

11.2. Streaming batch mode

+
+

Streaming batch writes any new vertex or edge immediately to Postgresql via its stdin api. I.e. the data is written +directly to a Postgresql jdbc driver OutputStream.

+
+
+

Streaming batch mode does not use the Graph.addVertex method. Instead SqlgGraph.streamVertex is defined.

+
+
+

The transaction must be placed in streaming batch mode manually before any streaming batch modification can happen. SqlgGraph.tx().streamingBatchModeOn() +After every commit() the transaction reverts to normal mode and must be placed into streaming batch mode again +for streaming batch mode to continue.

+
+
+

The benefit of streaming mode is that the memory consumption is very low as nothing is cached. It is also somewhat faster than +the normal batch mode (+/- 25% faster).

+
+
+

However the caveat is that, per transaction/thread only one label/table can be written between consecutive calls to SqlgTransaction.flush(). +Further it is not possible to assign an id to the vertex or element. As such the SqlgGraph.streamVertex method returns void.

+
+
+
custom api
+
+
sqlgGraph.tx().streamingBatchModeOn();
+
+
+
+

Create 10 000 000 Persons and 10 000 000 cars.

+
+
+
+
@Test
+public void showStreamingBatchMode() {
+    StopWatch stopWatch = new StopWatch();
+    stopWatch.start();
+    //enable streaming mode
+    this.sqlgGraph.tx().streamingBatchModeOn();
+    for (int i = 1; i <= 10_000_000; i++) {
+        this.sqlgGraph.streamVertex(T.label, "Person", "name", "John" + i);
+    }
+    this.sqlgGraph.tx().flush(); # (1)
+    for (int i = 1; i <= 10_000_000; i++) {
+        this.sqlgGraph.streamVertex(T.label, "Car", "name", "Dodge" + i);
+    }
+    this.sqlgGraph.tx().commit();
+    stopWatch.stop();
+    System.out.println(stopWatch.toString());
+}
+
+
+
+
    +
  1. +

    flushing is needed before starting streaming Car. Only only one label/table can stream at a time.

    +
  2. +
+
+
+
output
+
+
Time taken: 0:00:42.014
+
+
+
+
memory
+

image of tinkerpop-classic

+
+
+
+

11.3. Bulk edge creation

+
+

To create an edge via the normal api a handle to the Vertex is needed. +This is not always the case. In particula if the SqlgGraph.streamVertex api is used no handle to the Vertex is returned.

+
+
+

For this scenario there is a bulk edge creation method.

+
+
+
+
public <L, R> void bulkAddEdges(String outVertexLabel, String inVertexLabel, String edgeLabel, Pair<String, String> idFields, Collection<Pair<L, R>> uids) {
+
+
+
+
    +
  • +

    outLabel and inLabel specifies the out and in vertex labels that the edges will be between.

    +
  • +
  • +

    edgeLabel is the label of the edges to be created.

    +
  • +
  • +

    idFields specifies the fields that uniquely identify the out and in vertex.

    +
  • +
  • +

    uids are the actual unique identifies for each out/in vertex pairing.

    +
  • +
+
+
+

Sqlg will then first copy the uids into a temporary table. Then it joins the temporary table on the out and in vertex tables +to retrieve the in and out ids. +These ids are then inserted into the edge table. +All this happens on Postgresql, having minimal processing and memory impact on the java process.

+
+
+

The unique identifiers still have to be kept in memory, but its is not necessary to have the actual out and in vertices in memory.

+
+
+ + + + + +
+
Note
+
+The unique identifiers do not need to be the vertices’s id. It can be any property as long as it is unique. +
+
+
+
+
@Test
+public void showBulkEdgeCreation() {
+    StopWatch stopWatch = new StopWatch();
+    stopWatch.start();
+    int count = 0;
+    for (int i = 1; i <= 10; i++) {
+        List<Pair<String, String>> identifiers = new ArrayList<>();
+        this.sqlgGraph.tx().streamingBatchModeOn();
+        for (int j = 1; j <= 1_000_000; j++) {
+            this.sqlgGraph.streamVertex(T.label, "Person", "name", "John" + count, "personUid", String.valueOf(count));
+        }
+        this.sqlgGraph.tx().flush();
+        for (int j = 1; j <= 1_000_000; j++) {
+            this.sqlgGraph.streamVertex(T.label, "Car", "name", "Dodge" + count, "carUid", String.valueOf(count));
+            identifiers.add(Pair.of(String.valueOf(count), String.valueOf(count++)));
+        }
+        this.sqlgGraph.tx().flush();
+        this.sqlgGraph.bulkAddEdges("Person", "Car", "drives", Pair.of("personUid", "carUid"), identifiers);
+        this.sqlgGraph.tx().commit();
+    }
+    stopWatch.stop();
+    System.out.println("Time taken: " + stopWatch.toString());
+}
+
+
+
+
output (with edge foreign keys)
+
+
Time taken: 0:10:03.397
+
+
+
+
output (without edge foreign keys)
+
+
Time taken: 0:03:45.951
+
+
+
+
memory
+

image of tinkerpop-classic

+
+
+
+

11.4. Streaming with lock batch mode

+
+

Streaming with lock batch mode is similar to streaming batch mode. The difference being that the label/table being written to is +locked. Locking the table ensures that no concurrent changes will occur on the table. This allows Sqlg to query the id sequence and +assigned ids to the elements.

+
+
+

This means that the normal Vertex vertex = graph.addVertex(…​) method can be used. This is useful if a pointer to the new vertices are needed.

+
+
+

The transaction must be placed into streaming with lock batch mode manually before any streaming with lock batch modification can happen. +SqlgGraph.tx().streamingWithLockBatchModeOn() After every commit() the transaction reverts to normal mode and must +be placed into streaming batch mode again for streaming batch mode to continue.

+
+
+
custom api
+
+
sqlgGraph.tx().streamingWithLockBatchModeOn();
+
+
+
+
+
@Test
+public void showStreamingWithLockBulkEdgeCreation() {
+    StopWatch stopWatch = new StopWatch();
+    stopWatch.start();
+    int count = 0;
+    for (int i = 1; i <= 10; i++) {
+        List<Vertex> persons = new ArrayList<>();
+        this.sqlgGraph.tx().streamingWithLockBatchModeOn();
+        for (int j = 1; j <= 1_000_000; j++) {
+            Vertex person = this.sqlgGraph.addVertex(T.label, "Person", "name", "John" + count);
+            persons.add(person);
+        }
+        this.sqlgGraph.tx().flush();
+        List<Vertex> cars = new ArrayList<>();
+        for (int j = 1; j <= 1_000_000; j++) {
+            Vertex car = this.sqlgGraph.addVertex(T.label, "Car", "name", "Dodge" + count++);
+            cars.add(car);
+        }
+        this.sqlgGraph.tx().flush();
+        Iterator<Vertex> carIter = cars.iterator();
+        for (Vertex person : persons) {
+            person.addEdge("drives", carIter.next());
+        }
+        this.sqlgGraph.tx().commit();
+    }
+    stopWatch.stop();
+    System.out.println(stopWatch.toString());
+}
+
+
+
+
output without edge foreign keys
+
+
Time taken: 0:02:42.363
+
+
+
+
memory
+

image of tinkerpop-classic

+
+
+
+
+
+

12. Topology

+
+
+

Sqlg stores the graph’s topology information in the graph itself as a graph. +The topology is stored in the sqlg_schema schema.

+
+
+
UML diagram of Sqlg’s topology.
+

image of Sqlg’s topology

+
+
+

TinkerPop has no notion of schema or topology. However any TinkerPop graph has an implicit schema. +Sqlg manages the schema as a first class construct.

+
+
+

Sqlg follows the normal TinkerPop semantics in that the schema does not need to be defined upfront. +Every graph modification first checks to see if the element’s schema (label,name) exists. +If not, it will create the element’s schema. For Postgresql this works well as it supports transactional schema creation/modification.

+
+
+ + + + + +
+
Warning
+
+Hsqldb, H2 and MariaDb do not support transactional schema creation/modification. They will both silently commit the +transaction and continue. This breaks the user’s transaction boundaries. For Hsqldb, H2 and MariaDb it is recommended to +create the schema upfront. +
+
+
+

It is possible to query and traverse the topology as a normal TinkerPop graph. +To query the topology the TopologyStrategy is used. To facilitate ease of use, SqlgGraph.topology() method is added to enable the strategy. +Being able to query the topology is helpful to understand a graph’s structure.

+
+
+
+
@Test
+public void showTopologyTraversals() {
+    Io.Builder<GraphSONIo> builder = GraphSONIo.build(GraphSONVersion.V3_0); (1)
+    final GraphReader reader = sqlgGraph.io(builder).reader().create();
+    try (final InputStream stream = AbstractGremlinTest.class.getResourceAsStream("/tinkerpop-modern-v3d0.json")) {
+        reader.readGraph(stream, sqlgGraph);
+    } catch (IOException e) {
+        Assert.fail(e.getMessage());
+    }
+    System.out.println("//All vertex labels");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) # (2)
+            .forEachRemaining(
+                    v -> System.out.println(v.<String>value(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME))
+            );
+
+    System.out.println("//All edge labels");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL)
+            .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE) # (3)
+            .forEachRemaining(
+                    v -> System.out.println(v.<String>value(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME))
+            );
+
+    System.out.println("//'person' properties");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL)
+            .has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "person") # (4)
+            .out(Topology.SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE) # (5)
+            .forEachRemaining(
+                    v -> {
+                        System.out.print(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : ");
+                        System.out.println(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_TYPE));
+                    }
+            );
+
+    System.out.println("//'software' properties");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL)
+            .has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "software")
+            .out(Topology.SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE)
+            .forEachRemaining(
+                    v -> {
+                        System.out.print(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : ");
+                        System.out.println(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_TYPE));
+                    }
+            );
+
+    System.out.println("//'created' properties");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL) # (6)
+            .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE) # (7)
+            .has(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "created") # (8)
+            .out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE) # (9)
+            .forEachRemaining(
+                    v -> {
+                        System.out.print(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : ");
+                        System.out.println(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_TYPE));
+                    }
+            );
+
+    System.out.println("//'knows' properties");
+    sqlgGraph.topology().V()
+            .hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL)
+            .out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE)
+            .has(Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "knows")
+            .out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE)
+            .forEachRemaining(
+                    v -> {
+                        System.out.print(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_NAME) + " : ");
+                        System.out.println(v.<String>value(Topology.SQLG_SCHEMA_PROPERTY_TYPE));
+                    }
+            );
+
+}
+
+
+
+
    +
  1. +

    Use TinkerPop’s i.o. infrastructure to load the modern graph.

    +
  2. +
  3. +

    Find all VertexLabels, they are in sqlg_schema.vertex

    +
  4. +
  5. +

    Traverse out on the out_edges edge to find all the edges. 'WARNING' this may produce duplicates as a single edge label +may have many different distinct out vertex labels.

    +
  6. +
  7. +

    Find the person vertex.

    +
  8. +
  9. +

    Traverse out on the vertex_property edge to find the 'person' vertex labels properties.

    +
  10. +
  11. +

    Find all vertex labels. i.e. vertices in sqlg_schema.vertex

    +
  12. +
  13. +

    Traverse the out_edges edge.

    +
  14. +
  15. +

    Filter the out edges for only the 'created' edges.

    +
  16. +
  17. +

    Traverse the edge_properties edge to find the 'created' edge’s properties.

    +
  18. +
+
+
+
output
+
+
//All vertex labels
+person
+software
+//All edge labels
+knows
+created
+//'person' properties
+name : STRING
+age : INTEGER
+//'software' properties
+name : STRING
+lang : STRING
+//'created' properties
+weight : DOUBLE
+//'knows' properties
+weight : DOUBLE
+
+
+
+

12.1. Topology eager creation

+
+

It is often useful to create the topology upfront. The topology creation api is accessed via the Topology object. +It is a singleton. Topology topology = sqlgGraph.getTopology(); +To create new topology objects use the ensureXXX methods. They will return the a topology object representing the specific +topology element. i.e. Schema, VertexLabel, EdgeLabel, PropertyColumn, Index or GlobalUniqueIndex

+
+
+ + + + + +
+
Note
+
+The ensureXXX methods will create the topology object if it does not exists. +If it does exist it will simply return the relevant topology object. +On any topology object one can call isCommitted or isUncommitted to check the state of the object. +committed indicates that it already exists. uncommitted indicates that it has been created in the current active transaction. +
+
+
+
eg
+
+
@Test
+public void createModernTopology() {
+    Topology topology = this.sqlgGraph.getTopology(); # (1)
+    VertexLabel personVertexLabel = topology.ensureVertexLabelExist("public", "person", new HashMap<String, PropertyType>() {{
+        put("name", PropertyType.STRING);
+        put("age", PropertyType.INTEGER);
+    }}); # (2)
+    VertexLabel softwareVertexLabel = topology.ensureVertexLabelExist("public", "software", new HashMap<String, PropertyType>() {{
+        put("name", PropertyType.STRING);
+        put("lang", PropertyType.STRING);
+    }});
+    EdgeLabel createdEdgeLabel = personVertexLabel.ensureEdgeLabelExist("created", softwareVertexLabel, new HashMap<String, PropertyType>() {{
+        put("weight", PropertyType.DOUBLE);
+    }}); # (3)
+    EdgeLabel knowsEdgeLabel = personVertexLabel.ensureEdgeLabelExist("knows", personVertexLabel, new HashMap<String, PropertyType>() {{
+        put("weight", PropertyType.DOUBLE);
+    }});
+    this.sqlgGraph.tx().commit(); # (4)
+}
+
+
+
+
    +
  1. +

    Get the Topology object.

    +
  2. +
  3. +

    Create the 'person' VertexLabel. The HashMap<String, PropertyType> defines the 'person''s properties.

    +
  4. +
  5. +

    Create the 'created' EdgeLabel. The format is outVertexLabel.ensureEdgeLabelExist(name, inVertexLabel, properties)

    +
  6. +
  7. +

    Be sure to commit the transaction. Postgresql and MSSqlServer supports transactional schema creation. Hsqldb,H2 and MariaDB do not.

    +
  8. +
+
+
+
+
@Test
+public void generalTopologyCreationWithSchema() {
+    Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("Humans"); # (1)
+    VertexLabel personVertexLabel = schema.ensureVertexLabelExist("Person", new HashMap<String, PropertyType>() {{
+        put("name", PropertyType.STRING);
+        put("date", PropertyType.LOCALDATE);
+    }}); # (2)
+    this.sqlgGraph.tx().commit();
+}
+
+
+
+
    +
  1. +

    Create the 'Humans' schema

    +
  2. +
  3. +

    Create the 'Person' VertexLabel via the Schema object.

    +
  4. +
+
+
+

Sqlg keeps an in-memory cache of the graphs entire topology. It is possible query this cache directly.

+
+
+
+
@Test
+public void queryCache() {
+    loadModern();
+    Optional<Schema> publicSchema = this.sqlgGraph.getTopology().getSchema(this.sqlgGraph.getSqlDialect().getPublicSchema()); # (1)
+    assertTrue(publicSchema.isPresent());
+    Schema publicSchemaViaShortCut = this.sqlgGraph.getTopology().getPublicSchema(); # (2)
+    Optional<VertexLabel> personVertexLabel = publicSchema.get().getVertexLabel("person"); # (3)
+    assertTrue(personVertexLabel.isPresent());
+    Optional<EdgeLabel> createEdgeLabel = personVertexLabel.get().getOutEdgeLabel("created"); # (4)
+    assertTrue(createEdgeLabel.isPresent());
+    Optional<EdgeLabel> knowsEdgeLabel = personVertexLabel.get().getOutEdgeLabel("knows"); # (5)
+    assertTrue(knowsEdgeLabel.isPresent());
+
+    Optional<PropertyColumn> namePropertyColumn = personVertexLabel.get().getProperty("name"); # (6)
+    assertTrue(namePropertyColumn.isPresent());
+    assertEquals(PropertyType.STRING, namePropertyColumn.get().getPropertyType()); # (7)
+    Optional<PropertyColumn> agePropertyColumn = personVertexLabel.get().getProperty("age");
+    assertTrue(agePropertyColumn.isPresent());
+    assertEquals(PropertyType.INTEGER, agePropertyColumn.get().getPropertyType());
+    Optional<PropertyColumn> weightPropertyColumn = createEdgeLabel.get().getProperty("weight");
+    assertTrue(weightPropertyColumn.isPresent());
+    assertEquals(PropertyType.DOUBLE, weightPropertyColumn.get().getPropertyType());
+}
+
+
+
+
    +
  1. +

    Get the 'public' schema object.

    +
  2. +
  3. +

    Because the 'public' schema will always exist there is a shortcut method to get it.

    +
  4. +
  5. +

    Use the 'Schema' object the get the 'person' VertexLabel

    +
  6. +
  7. +

    Use the 'person' VertexLabel to get its 'created' out edge.

    +
  8. +
  9. +

    Use the 'person' VertexLabel to get its 'knows' out edge.

    +
  10. +
  11. +

    Use the 'person' VertexLabel to get its 'name' property. Properties are represented by the PropertyColumn class.

    +
  12. +
  13. +

    On the PropertyColumn object one can get the PropertyType. PropertyType is an enum representing all data types supported by Sqlg.

    +
  14. +
+
+
+
+

12.2. User supplied identifiers

+
+

You can define your own identifiers for a VertexLabel or EdgeLabel. This will result in Sqlg generating primary keys on the specified identifiers instead of using an auto generated sequence.

+
+
+
eg.
+
+
@Test
+public void testUserSuppliedIds() {
+    VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
+            "Person",
+            new LinkedHashMap<>() {{
+                put("name", PropertyType.STRING);
+                put("surname", PropertyType.STRING);
+                put("nickname", PropertyType.STRING);
+            }},
+            ListOrderedSet.listOrderedSet(Arrays.asList("name", "surname")) # (1)
+    );
+    personVertexLabel.ensureEdgeLabelExist(
+            "marriedTo",
+            personVertexLabel,
+            new LinkedHashMap<>() {{
+                put("place", PropertyType.STRING);
+                put("when", PropertyType.LOCALDATETIME);
+            }},
+            ListOrderedSet.listOrderedSet(List.of("place", "when")) # (2)
+    );
+    this.sqlgGraph.tx().commit();
+
+    Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John", "surname", "Longfellow", "nickname", "Longboy");
+    Vertex sue = this.sqlgGraph.addVertex(T.label, "Person", "name", "Sue", "surname", "Pretty");
+    john.addEdge("marriedTo", sue, "place", "Timbuck2", "when", LocalDateTime.now());
+    this.sqlgGraph.tx().commit();
+
+    List<Vertex> marriedTo = this.sqlgGraph.traversal().V().hasLabel("Person")
+            .has("name", "John")
+            .out("marriedTo")
+            .toList();
+    Assert.assertEquals(1, marriedTo.size());
+    Assert.assertEquals(sue, marriedTo.get(0));
+}
+
+
+
+
    +
  1. +

    Specify the name and surname properties as the primary key for the Person vertex label.

    +
  2. +
  3. +

    Specify the place and when properties as the primary key for the marriedTo edge label.

    +
  4. +
+
+
+

This will generate a table with name and surname, and place and when as composite primary keys.

+
+
+
+
CREATE TABLE public."V_Person"
+(
+    name text COLLATE pg_catalog."default" NOT NULL,
+    surname text COLLATE pg_catalog."default" NOT NULL,
+    nickname text COLLATE pg_catalog."default",
+    CONSTRAINT "V_Person_pkey" PRIMARY KEY (name, surname)
+);
+
+CREATE TABLE public."E_marriedTo"
+(
+    place text COLLATE pg_catalog."default" NOT NULL,
+    "when" timestamp without time zone NOT NULL,
+    "public.Person.name__I" text COLLATE pg_catalog."default",
+    "public.Person.surname__I" text COLLATE pg_catalog."default",
+    "public.Person.name__O" text COLLATE pg_catalog."default",
+    "public.Person.surname__O" text COLLATE pg_catalog."default",
+    CONSTRAINT "E_marriedTo_pkey" PRIMARY KEY (place, "when"),
+    CONSTRAINT "E_marriedTo_public.Person.name__I_public.Person.surname__I_fkey" FOREIGN KEY ("public.Person.name__I", "public.Person.surname__I")
+        REFERENCES public."V_Person" (name, surname) MATCH SIMPLE
+        ON UPDATE NO ACTION
+        ON DELETE NO ACTION
+        DEFERRABLE,
+    CONSTRAINT "E_marriedTo_public.Person.name__O_public.Person.surname__O_fkey" FOREIGN KEY ("public.Person.name__O", "public.Person.surname__O")
+        REFERENCES public."V_Person" (name, surname) MATCH SIMPLE
+        ON UPDATE NO ACTION
+        ON DELETE NO ACTION
+        DEFERRABLE
+)
+
+
+
+

The gremlin query will execute the following sql,

+
+
+
+
SELECT
+	a2."alias1", a2."alias2", a2."alias3"
+FROM (
+SELECT
+	"public"."E_marriedTo"."public.Person.name__I" AS "public.E_marriedTo.public.Person.name__I",
+	"public"."E_marriedTo"."public.Person.surname__I" AS "public.E_marriedTo.public.Person.surname__I"
+FROM
+	"public"."V_Person" INNER JOIN
+	"public"."E_marriedTo" ON "public"."V_Person"."name" = "public"."E_marriedTo"."public.Person.name__O" AND "public"."V_Person"."surname" = "public"."E_marriedTo"."public.Person.surname__O"
+WHERE
+	( "public"."V_Person"."name" = ?)
+) a1 INNER JOIN (
+SELECT
+	"public"."V_Person"."name" AS "alias1",
+	"public"."V_Person"."surname" AS "alias2",
+	"public"."V_Person"."nickname" AS "alias3"
+FROM
+	"public"."V_Person"
+) a2 ON a1."public.E_marriedTo.public.Person.name__I" = a2."alias1" AND a1."public.E_marriedTo.public.Person.surname__I" = a2."alias2"
+
+
+
+
+
+
+

13. Postgresql Partitioning

+
+
+

Sqlg supports postgresql partitioning. To partition a table it needs to be created upfront using the Topology api. +Sqlg currently supports RANGE, LIST and HASH partitions.

+
+
+

13.1. Range partitioning

+
+
+
@Test
+public void testPartitioningRange() {
+    Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema(); # (1)
+    VertexLabel partitionedVertexLabel = publicSchema.ensurePartitionedVertexLabelExist(
+            "Measurement",
+            new LinkedHashMap<String, PropertyType>() {{
+                put("date", PropertyType.LOCALDATE);
+                put("temp", PropertyType.INTEGER);
+            }},
+            ListOrderedSet.listOrderedSet(Collections.singletonList("date")),
+            PartitionType.RANGE, #(2)
+            "date"); # (3)
+    partitionedVertexLabel.ensureRangePartitionExists("measurement1", "'2016-07-01'", "'2016-08-01'"); # (4)
+    partitionedVertexLabel.ensureRangePartitionExists("measurement2", "'2016-08-01'", "'2016-09-01'"); # (5)
+    this.sqlgGraph.tx().commit();
+
+    LocalDate localDate1 = LocalDate.of(2016, 7, 1);
+    this.sqlgGraph.addVertex(T.label, "Measurement", "date", localDate1);
+    LocalDate localDate2 = LocalDate.of(2016, 8, 1);
+    this.sqlgGraph.addVertex(T.label, "Measurement", "date", localDate2);
+    this.sqlgGraph.tx().commit();
+
+    Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("Measurement").count().next(), 0);
+    Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate1).count().next(), 0);
+    Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate2).count().next(), 0);
+
+    Partition partition = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("Measurement").get().getPartition("measurement1").get(); # (6)
+    partition.remove(); # (7)
+    this.sqlgGraph.tx().commit();
+
+    Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").count().next(), 0);
+    Assert.assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate1).count().next(), 0);
+    Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Measurement").has("date", localDate2).count().next(), 0);
+
+    Assert.assertEquals(1, this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PARTITION).count().next(), 0); # (8)
+}
+
+
+
+
    +
  1. +

    Get the 'public' schema object.

    +
  2. +
  3. +

    Indicates a RANGE partition.

    +
  4. +
  5. +

    Create a VertexLabel with a range partition on the date field.

    +
  6. +
  7. +

    Create a named partition for the range '2016-07-01' to '2016-08-01'.

    +
  8. +
  9. +

    Create a named partition for the range '2016-08-01' to '2016-09-01'.

    +
  10. +
  11. +

    Using the Topology api get the measurement1 partition.

    +
  12. +
  13. +

    Remove the measurement1 partition.

    +
  14. +
  15. +

    Assert that `Sqlg`s topology only has one partition.

    +
  16. +
+
+
+
+

13.2. List partitioning

+
+
+
//the partitionExpression 'left(lower(name), 1)' is to complex for the query planner to optimize.
+//i.e. select * from Cities where name = 'asdasd' willscan all partitions.
+@Test
+public void testPartitioningList() {
+    Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
+    VertexLabel partitionedVertexLabel = publicSchema.ensurePartitionedVertexLabelExist("Cities",
+            new LinkedHashMap<String, PropertyType>() {{
+                put("name", PropertyType.STRING);
+                put("population", PropertyType.LONG);
+            }},
+            ListOrderedSet.listOrderedSet(Collections.singletonList("name")),
+            PartitionType.LIST, # (1)
+            "left(lower(name), 1)"); # (2)
+    partitionedVertexLabel.ensureListPartitionExists("Cities_a", "'a'"); # (3)
+    partitionedVertexLabel.ensureListPartitionExists("Cities_b", "'b'");
+    partitionedVertexLabel.ensureListPartitionExists("Cities_c", "'c'");
+    partitionedVertexLabel.ensureListPartitionExists("Cities_d", "'d'");
+    this.sqlgGraph.tx().commit();
+
+    this.sqlgGraph.tx().normalBatchModeOn();
+    for (int i = 0; i < 100; i++) {
+        this.sqlgGraph.addVertex(T.label, "Cities", "name", "aasbc", "population", 1000L);
+    }
+    this.sqlgGraph.addVertex(T.label, "Cities", "name", "basbc", "population", 1000L);
+    for (int i = 0; i < 100; i++) {
+        this.sqlgGraph.addVertex(T.label, "Cities", "name", "casbc", "population", 1000L);
+    }
+    this.sqlgGraph.addVertex(T.label, "Cities", "name", "dasbc", "population", 1000L);
+    this.sqlgGraph.tx().commit();
+
+    Assert.assertEquals(202, this.sqlgGraph.traversal().V().hasLabel("Cities").count().next(), 0);
+    Assert.assertEquals(100, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "aasbc").count().next(), 0);
+    Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "basbc").count().next(), 0);
+    Assert.assertEquals(100, this.sqlgGraph.traversal().V().hasLabel("Cities").has("name", "casbc").count().next(), 0);
+
+    Partition partition = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("Cities").get().getPartition("Cities_a").get();
+    partition.remove();
+    this.sqlgGraph.tx().commit();
+
+    Assert.assertEquals(102, this.sqlgGraph.traversal().V().hasLabel("Cities").count().next(), 0);
+    Assert.assertEquals(3, this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PARTITION).count().next(), 0);
+}
+
+
+
+
    +
  1. +

    Indicates a LIST partition.

    +
  2. +
  3. +

    The partition expression.

    +
  4. +
  5. +

    Create a named partition for the list entry 'a'.

    +
  6. +
+
+
+
+

13.3. Hash partitioning

+
+
+
@Test
+public void testPartitioningHash() {
+        VertexLabel vertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensurePartitionedVertexLabelExist(
+                "A",
+                new LinkedHashMap<>() {{
+                    put("uid1", PropertyType.INTEGER);
+                    put("name", PropertyType.STRING);
+                    put("surname", PropertyType.STRING);
+                }},
+                ListOrderedSet.listOrderedSet(List.of("uid1")),
+                PartitionType.HASH, (1)
+                "\"uid1\"" (2)
+        );
+        for (int i = 0; i < 10; i++) {
+            vertexLabel.ensureHashPartitionExists("hashPartition" + i, 10, i); (3)
+        }
+        this.sqlgGraph.tx().commit();
+        for (int i = 0; i < 1000; i++) {
+            this.sqlgGraph.addVertex(T.label, "A", "uid1", i, "name", "name" + i, "surname", "surname" + i);
+        }
+        this.sqlgGraph.tx().commit();
+        Assert.assertEquals(1000, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
+
+        Connection connection = this.sqlgGraph.tx().getConnection();
+        try (Statement s = connection.createStatement()) {
+            ResultSet rs = s.executeQuery("select tableoid::regclass as partition_name, count(*) from \"V_A\" group by 1 order by 1;"); (4)
+            int count = 0;
+            Map<String, Long> partitionDistributionCount = new HashMap<>();
+            while (rs.next()) {
+                count++;
+                partitionDistributionCount.put(rs.getString(1), rs.getLong(2));
+            }
+            Assert.assertEquals(10, count); (5)
+            Assert.assertEquals(10, partitionDistributionCount.size());
+            for (int i = 0; i < 10; i++) {
+                Assert.assertTrue(partitionDistributionCount.containsKey("\"hashPartition" + i + "\""));
+            }
+            Assert.assertEquals(100, partitionDistributionCount.get("\"hashPartition0\""), 0);
+            Assert.assertEquals(92, partitionDistributionCount.get("\"hashPartition1\""), 0);
+            Assert.assertEquals(103, partitionDistributionCount.get("\"hashPartition2\""), 0);
+            Assert.assertEquals(88, partitionDistributionCount.get("\"hashPartition3\""), 0);
+            Assert.assertEquals(113, partitionDistributionCount.get("\"hashPartition4\""), 0);
+            Assert.assertEquals(90, partitionDistributionCount.get("\"hashPartition5\""), 0);
+            Assert.assertEquals(119, partitionDistributionCount.get("\"hashPartition6\""), 0);
+            Assert.assertEquals(92, partitionDistributionCount.get("\"hashPartition7\""), 0);
+            Assert.assertEquals(100, partitionDistributionCount.get("\"hashPartition8\""), 0);
+            Assert.assertEquals(103, partitionDistributionCount.get("\"hashPartition9\""), 0);
+        } catch (SQLException throwables) {
+            Assert.fail(throwables.getMessage());
+        }
+
+}
+
+
+
+
    +
  1. +

    Indicates a HASH partition.

    +
  2. +
  3. +

    The partition expression.

    +
  4. +
  5. +

    Create a named partition for the hash entry with it modulus and remainder.

    +
  6. +
  7. +

    Fetch the partitions for the assertion

    +
  8. +
  9. +

    Assert that there are as many partitions as the modulus

    +
  10. +
+
+
+
+
+
+

14. Sqlg ui

+
+
+

Sqlg includes a basic ui to visualize and delete/remove schema elements.

+
+
+ + + + + +
+
Warning
+
+Sqlg' ui is very dangerous as it allows for deletion of schema elements including RDBMS schemas. Use with care and ideally do not expose to a wide audience. +
+
+
+

14.1. Startup

+
+

The ui uses Sparkjava as its web framework.

+
+
+

There are two ways in which to start the ui.

+
+
+
Embedded
+

To use a completely standalone Jetty you can run the following code,

+
+
+
+
//SqlgUI.initialize(); (1)
+SqlgUI.initialize(8181);
+SqlgUI.set(sqlgGraph);
+
+
+
+
    +
  1. +

    The default port is 4567

    +
  2. +
+
+
+

To use an existing embedded Jetty you can use the following setup.

+
+
+
+
 //Define your filer
+FilterHolder filterHolderSqlgUI = contextHandler.addFilter("spark.servlet.SparkFilter", "/sqlg/*", EnumSet.of(DispatcherType.REQUEST));
+filterHolderSqlgUI.setInitParameter("applicationClass", "org.umlg.sqlg.ui.SparkResources");
+
+//Websocket servlet
+ServletHolder websocketServletHolder = new ServletHolder(new SqlgWebsocketServlet());
+websocketServletHolder.setName("Sqlg-ui websocket servlet");
+contextHandler.addServlet(websocketServletHolder, "/sqlg/data/v1/websocket");
+
+...
+
+SqlgUI.set(sqlgGraph);
+
+
+
+
Webserver
+
+
<filter>
+  <filter-name>SparkFilter</filter-name>
+  <filter-class>spark.servlet.SparkFilter</filter-class>
+  <init-param>
+    <param-name>applicationClass</param-name>
+    <param-value>com.company.YourApplication</param-value>
+  </init-param>
+</filter>
+<filter-mapping>
+  <filter-name>SparkFilter</filter-name>
+  <url-pattern>/*</url-pattern>
+</filter-mapping>
+
+
+
+ + + + + +
+
Warning
+
+The webserver mode has not been tested, nor do I know how the websocket will be made to work. +
+
+
+

The ui is accessible at

+
+
+
+
http://ip:port/sqlg/v1/
+
+
+
+
+

14.2. Authentication

+
+

The ui uses cookie authentication.

+
+
+

To define the users that are allowed to use the ui there must be a corresponding property in sqlg.properties

+
+
+
+
sqlg.ui.username.john=john_password
+sqlg.ui.username.peter=peter_password
+
+
+
+

For the user to be allowed to do any editing there must be the following property in sqlg.properties

+
+
+
+
sqlg.ui.username.john.edit=true
+sqlg.ui.username.peter.edit=true
+
+
+
+

There is one additional property which specifies how long the cookie remains valid for.

+
+
+
+
sqlg.ui.cookie.expiry=3600
+
+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/sqlg.adoc b/sqlg-doc/docs/2.1.4/sqlg.adoc new file mode 100644 index 000000000..7ea7c91b5 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/sqlg.adoc @@ -0,0 +1,181 @@ += Sqlg Documentation +Pieter Martin +Version 2.1.4, November 2021: +:sectnums: +:toc: left +:toclevels: 4 +:experimental: +:description: Sqlg's documentation +:keywords: Sqlg, TinkerPop, Gremlin, Graph, Database +:imagesdir: ./img +:apidocs: apidocs/ +:tinkerpop-docs: http://tinkerpop.apache.org/docs/current/reference/ +:includedir: include + +https://github.com/pietermartin/sqlg[*Sqlg*] image:github/SVG/mark-github.svg[] is a implementation of http://tinkerpop.apache.org/[Apache TinkerPop] on a +http://en.wikipedia.org/wiki/Relational_database_management_system[RDBMS]. +Currently http://www.postgresql.org/[Postgresql], http://hsqldb.org/[HSQLDB], http://h2database.com[H2], +https://mariadb.org/[MariaDB], https://www.mysql.com/[MySQL] and +https://www.microsoft.com/en-us/sql-server/sql-server-2017[MSSqlServer] are supported. + +Sqlg has a github https://github.com/pietermartin/sqlg/discussions[discussions] page. + +include::{includedir}/introduction.adoc[] + +include::{includedir}/license.adoc[] + +include::{includedir}/supportedFeatures.adoc[] + +include::{includedir}/limitations.adoc[] + +include::{includedir}/gettingStarted.adoc[] + +include::{includedir}/dataTypes.adoc[] + +include::{includedir}/architecture.adoc[] + +include::{includedir}/indexes.adoc[] + +include::{includedir}/multipleJvm.adoc[] + +== Gremlin + +Sqlg optimizes a gremlin link:{tinkerpop-docs}#traversal[`traversal`] by analyzing the +link:{tinkerpop-docs}#graph-traversal-steps[`steps`] and where possible combining them into custom Sqlg steps. This can +significantly reduce the number of database calls. + +Sqlg has two strategies for optimizing TinkerPop steps. + + * Starting with the link:{tinkerpop-docs}#graph-step[`GraphStep`], +consecutive optimizable steps are folded into link:{apidocs}org/umlg/sqlg/step/SqlgGraphStep.html[`SqlgGraphStep`]. This +stops at the first unoptimizable step after which the second strategy is used. +* The second strategy is to `barrier` the incoming elements to the unoptimizable step. This means to exhaust the traversal/iterator +up to the step and cache all the incoming elements for this step. From here the step is executed for all the incoming +elements at once. This strategy effectively changes the semantics to a breath first retrieval. + +[NOTE] +Optimizing gremlin is an ongoing task as gremlin is a large language. + +[NOTE] +Turn sql logging on by setting `log4j.logger.org.umlg.sqlg=debug` + +=== Optimization (strategy 1) + +The following steps are optimized. Steps are + +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> + +The combined step will then in turn generate the sql statements to retrieve the data. +It attempts to retrieve the data in as few distinct sql statements as possible. + +include::{includedir}/gremlin/strategy1/graphStep.adoc[] + +include::{includedir}/gremlin/strategy1/vertexStep.adoc[] + +include::{includedir}/gremlin/strategy1/hasStep.adoc[] + +include::{includedir}/gremlin/strategy1/andStep.adoc[] + +include::{includedir}/gremlin/strategy1/notStep.adoc[] + +include::{includedir}/gremlin/strategy1/repeatStep.adoc[] + +include::{includedir}/gremlin/strategy1/optionalStep.adoc[] + +include::{includedir}/gremlin/strategy1/chooseStep.adoc[] + +include::{includedir}/gremlin/strategy1/orderStep.adoc[] + +include::{includedir}/gremlin/strategy1/rangeStep.adoc[] + +include::{includedir}/gremlin/strategy1/limitStep.adoc[] + +include::{includedir}/gremlin/strategy1/dropStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducingSteps.adoc[] + +==== Reducing Steps + +link:{tinkerpop-docs}#a-note-on-barrier-steps[`Reducing Steps`] + +include::{includedir}/gremlin/strategy1/reducing/minStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/maxStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/sumStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/meanStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/countStep.adoc[] + +===== Group By + +link:{tinkerpop-docs}#group-step[`Group Step`]'s are optimized with sql's `group by` clause. + +include::{includedir}/gremlin/strategy1/reducing/groupByMinStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/groupByMaxStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/groupBySumStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/groupByMeanStep.adoc[] + +include::{includedir}/gremlin/strategy1/reducing/groupByCountStep.adoc[] + +=== Optimization (strategy 2) + +The following steps are optimized. Steps are + +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> + +The combined step will then in turn generate the sql statements to retrieve the data. +It attempts to retrieve the data in as few distinct sql statements as possible. + +include::{includedir}/gremlin/strategy2/vertexStep.adoc[] + +include::{includedir}/gremlin/strategy2/repeatStep.adoc[] + +include::{includedir}/gremlin/strategy2/optionalStep.adoc[] + +include::{includedir}/gremlin/strategy2/chooseStep.adoc[] + +include::{includedir}/gremlin/strategy2/localStep.adoc[] + +include::{includedir}/gremlin/strategy2/andStep.adoc[] + +include::{includedir}/gremlin/strategy2/orStep.adoc[] + +include::{includedir}/gremlin/strategy2/notStep.adoc[] + +include::{includedir}/gremlin/strategy2/whereStep.adoc[] + +include::{includedir}/gremlin/predicates.adoc[] + +include::{includedir}/batchMode.adoc[] + +include::{includedir}/topology.adoc[] + +include::{includedir}/postgresqlPartitioning.adoc[] + +include::{includedir}/sqlgui.adoc[] diff --git a/sqlg-doc/docs/2.1.4/tocbot.min.js b/sqlg-doc/docs/2.1.4/tocbot.min.js new file mode 100644 index 000000000..4f2b53350 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/tocbot.min.js @@ -0,0 +1 @@ +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var l=t[o]={i:o,l:!1,exports:{}};return e[o].call(l.exports,l,l.exports,n),l.l=!0,l.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)n.d(o,l,function(t){return e[t]}.bind(null,l));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){(function(o){var l,r,i;!function(o,s){r=[],l=function(e){"use strict";var t,o,l,r=n(2),i={},s={},c=n(3),a=n(4),u=!!(e&&e.document&&e.document.querySelector&&e.addEventListener);if("undefined"==typeof window&&!u)return;var d=Object.prototype.hasOwnProperty;function f(e,t,n){var o,l;return t||(t=250),function(){var r=n||this,i=+new Date,s=arguments;o&&ie.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=r+e.positionFixedClass):n.className=n.className.split(r+e.positionFixedClass).join("")}();var c,a=i;if(l&&null!==document.querySelector(e.tocSelector)&&a.length>0){n.call(a,function(t,n){return function t(n){var o=0;return n!==document.querySelector(e.contentSelector&&null!=n)&&(o=n.offsetTop,e.hasInnerContainers&&(o+=t(n.offsetParent))),o}(t)>s+e.headingsOffset+10?(c=a[0===n?n:n-1],!0):n===a.length-1?(c=a[a.length-1],!0):void 0});var u=document.querySelector(e.tocSelector).querySelectorAll("."+e.linkClass);t.call(u,function(t){t.className=t.className.split(r+e.activeLinkClass).join("")});var d=document.querySelector(e.tocSelector).querySelectorAll("."+e.listItemClass);t.call(d,function(t){t.className=t.className.split(r+e.activeListItemClass).join("")});var f=document.querySelector(e.tocSelector).querySelector("."+e.linkClass+".node-name--"+c.nodeName+'[href="'+e.basePath+"#"+c.id.replace(/([ #;&,.+*~':"!^$[\]()=>|/@])/g,"\\$1")+'"]');-1===f.className.indexOf(e.activeLinkClass)&&(f.className+=r+e.activeLinkClass);var m=f.parentNode;m&&-1===m.className.indexOf(e.activeListItemClass)&&(m.className+=r+e.activeListItemClass);var h=document.querySelector(e.tocSelector).querySelectorAll("."+e.listClass+"."+e.collapsibleClass);t.call(h,function(t){-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=r+e.isCollapsedClass)}),f.nextSibling&&-1!==f.nextSibling.className.indexOf(e.isCollapsedClass)&&(f.nextSibling.className=f.nextSibling.className.split(r+e.isCollapsedClass).join("")),function t(n){return-1!==n.className.indexOf(e.collapsibleClass)&&-1!==n.className.indexOf(e.isCollapsedClass)?(n.className=n.className.split(r+e.isCollapsedClass).join(""),t(n.parentNode.parentNode)):n}(f.parentNode.parentNode)}}}}},function(e,t){e.exports=function(e){var t=[].reduce;function n(e){return e[e.length-1]}function o(t){if(!(t instanceof window.HTMLElement))return t;if(e.ignoreHiddenElements&&(!t.offsetHeight||!t.offsetParent))return null;var n={id:t.id,children:[],nodeName:t.nodeName,headingLevel:function(e){return+e.nodeName.split("H").join("")}(t),textContent:e.headingLabelCallback?String(e.headingLabelCallback(t.textContent)):t.textContent.trim()};return e.includeHtml&&(n.childNodes=t.childNodes),e.headingObjectCallback?e.headingObjectCallback(n,t):n}return{nestHeadingsArray:function(l){return t.call(l,function(t,l){var r=o(l);return r&&function(t,l){for(var r=o(t),i=r.headingLevel,s=l,c=n(s),a=i-(c?c.headingLevel:0);a>0;)(c=n(s))&&void 0!==c.children&&(s=c.children),a--;i>=e.collapseDepth&&(r.isCollapsed=!0),s.push(r)}(r,t.nest),t},{nest:[]})},selectHeadings:function(t,n){var o=n;e.ignoreSelector&&(o=n.split(",").map(function(t){return t.trim()+":not("+e.ignoreSelector+")"}));try{return document.querySelector(t).querySelectorAll(o)}catch(e){return console.warn("Element not found: "+t),null}}}}},function(e,t){function n(e,t){var n=window.pageYOffset,o={duration:t.duration,offset:t.offset||0,callback:t.callback,easing:t.easing||d},l=document.querySelector('[id="'+decodeURI(e).split("#").join("")+'"]'),r=typeof e==="string"?o.offset+(e?l&&l.getBoundingClientRect().top||0:-(document.documentElement.scrollTop||document.body.scrollTop)):e,i=typeof o.duration==="function"?o.duration(r):o.duration,s,c;function a(e){c=e-s;window.scrollTo(0,o.easing(c,n,r,i));if(c0||"#"===e.href.charAt(e.href.length-1))&&(r(e.href)===l||r(e.href)+"#"===l)}(i.target)||i.target.className.indexOf("no-smooth-scroll")>-1||"#"===i.target.href.charAt(i.target.href.length-2)&&"!"===i.target.href.charAt(i.target.href.length-1)||-1===i.target.className.indexOf(e.linkClass))return;n(i.target.hash,{duration:t,offset:o,callback:function(){!function(e){var t=document.getElementById(e.substring(1));t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}(i.target.hash)}})},!1)}()}}]); \ No newline at end of file diff --git a/sqlg-doc/docs/2.1.4/volnitsky.css b/sqlg-doc/docs/2.1.4/volnitsky.css new file mode 100644 index 000000000..42ae7d239 --- /dev/null +++ b/sqlg-doc/docs/2.1.4/volnitsky.css @@ -0,0 +1,435 @@ +/* + * AsciiDoc 'volnitsky' theme for xhtml11 and html5 backends. + * Based on css from http://volnitsky.com, which was in turn based on default + * theme from AsciiDoc + * + * FIXME: The styling is still a bit rough in places. + * + */ + +/* Default font. */ +body { + font-family: Georgia,"Times New Roman",Times,serif; +} + +/* Title font. */ +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Candara,Arial,sans-serif; +} + + +#toc a { + border-bottom: 1px dotted #999999; + color: #3A3A4D !important; + text-decoration: none !important; +} +#toc a:hover { + border-bottom: 1px solid #6D4100; + color: #6D4100 !important; + text-decoration: none !important; +} +a { color: #666688; text-decoration: none; border-bottom: 1px dotted #666688; } +a:visited { color: #615FA0; border-bottom: 1px dotted #615FA0; } +a:hover { color: #6D4100; border-bottom: 1px solid #6D4100; } + +em { + font-style: italic; + color: #444466; +} + +strong { + font-weight: bold; + color: #444466; +} + +h1, h2, h3, h4, h5, h6 { + color: #666688; + margin-bottom: 0.5em; + line-height: 1.3; + letter-spacing:+0.15em; +} + +h1, h2, h3 { border-bottom: 2px solid #ccd; } +h2 { padding-top: 0.5em; } +h3 { float: left; } +h3 + * { clear: left; } + +div.sectionbody { + margin-left: 0; +} + +hr { + border: 1px solid #444466; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} + +pre { + padding: 0; + margin: 0; +} + +#author { + color: #444466; + font-weight: bold; + font-size: 1.1em; +} + +#footer { + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} + +#footer-text { + float: left; + padding-bottom: 0.5em; +} + +#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +#preamble { + margin-top: 1.5em; + margin-bottom: 1.5em; +} + +div.tableblock, div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-top: 1.5em; + margin-bottom: 1.5em; +} + +div.admonitionblock { + margin-top: 2.5em; + margin-bottom: 2.5em; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + color: #444466; + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + background: #ffffee; + border: 1px solid silver; + padding: 0.5em; +} + +div.listingblock > div.content { + border: 1px solid silver; + background: #f4f4f4; + padding: 0.5em; +} + +div.quoteblock { + padding-left: 2.0em; + margin-right: 10%; +} +div.quoteblock > div.attribution { + padding-top: 0.5em; + text-align: right; +} + +div.verseblock { + padding-left: 2.0em; + margin-right: 10%; +} +div.verseblock > pre.content { + font-family: inherit; +} +div.verseblock > div.attribution { + padding-top: 0.75em; + text-align: left; +} +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #444466; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 2px solid silver; +} + +div.exampleblock > div.content { + border-left: 2px solid silver; + padding: 0.5em; +} + +div.imageblock div.content { padding-left: 0; } +span.image img { border-style: none; } +a.image:visited { color: white; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; + color: #444466; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +ol.arabic { + list-style-type: decimal; +} +ol.loweralpha { + list-style-type: lower-alpha; +} +ol.upperalpha { + list-style-type: upper-alpha; +} +ol.lowerroman { + list-style-type: lower-roman; +} +ol.upperroman { + list-style-type: upper-roman; +} + +div.compact ul, div.compact ol, +div.compact p, div.compact p, +div.compact div, div.compact div { + margin-top: 0.1em; + margin-bottom: 0.1em; +} + +div.tableblock > table { + border: 3px solid #444466; +} +thead { + font-weight: bold; + color: #444466; +} +tfoot { + font-weight: bold; +} +td > div.verse { + white-space: pre; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overriden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; +} + + +div.hdlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hdlist tr { + padding-bottom: 15px; +} +dt.hdlist1.strong, td.hdlist1.strong { + font-weight: bold; +} +td.hdlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; + color: #444466; +} +td.hdlist2 { + vertical-align: top; +} +div.hdlist.compact tr { + margin: 0; + padding-bottom: 0; +} + +.comment { + background: yellow; +} + +@media print { + #footer-badges { display: none; } +} + +#toctitle { + color: #666688; + font-size: 1.2em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { margin-top: 0; margin-bottom: 0; } +div.toclevel1 { margin-top: 0.3em; margin-left: 0; font-size: 1.0em; } +div.toclevel2 { margin-top: 0.25em; margin-left: 2em; font-size: 0.9em; } +div.toclevel3 { margin-left: 4em; font-size: 0.8em; } +div.toclevel4 { margin-left: 6em; font-size: 0.8em; } + +body { + margin: 1em 5%; + max-width: 55em; + padding-left: 0; + +} + +.monospaced, tt, div.listingblock > div.content { + font-family: Consolas, "Andale Mono", "Courier New", monospace; + color: #004400; + background: #f4f4f4; + max-width: 80em; + line-height: 1.2em; +} + +.paragraph p { + line-height: 1.5em; + margin-top: 1em; +} + +.paragraph p, li, dd, .content { max-width: 45em; } +.admonitionblock { max-width: 35em; } + +div.sectionbody div.ulist > ul > li { + list-style-type: square; + color: #aaa; +} + div.sectionbody div.ulist > ul > li > * { + color: black; + /*font-size: 50%;*/ + } + + +div.sectionbody div.ulist > ul > li div.ulist > ul > li { + color: #ccd ; +} + div.sectionbody div.ulist > ul > li div.ulist > ul > li > * { + color: black ; + } + +em { + font-style: normal ! important; + font-weight: bold ! important; + color: #662222 ! important; + letter-spacing:+0.08em ! important; +} + + +/* + * html5 specific + * + * */ + +table.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +thead, p.tableblock.header { + font-weight: bold; + color: #666688; +} +p.tableblock { + margin-top: 0; +} +table.tableblock { + border-width: 3px; + border-spacing: 0px; + border-style: solid; + border-color: #444466; + border-collapse: collapse; +} +th.tableblock, td.tableblock { + border-width: 1px; + padding: 4px; + border-style: solid; + border-color: #444466; +} + +table.tableblock.frame-topbot { + border-left-style: hidden; + border-right-style: hidden; +} +table.tableblock.frame-sides { + border-top-style: hidden; + border-bottom-style: hidden; +} +table.tableblock.frame-none { + border-style: hidden; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} +th.tableblock.halign-right, td.tableblock.halign-right { + text-align: right; +} + +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; +} +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; +} + + diff --git a/sqlg-doc/src/main/java/org/umlg/sqlg/doc/AsciiDoctor.java b/sqlg-doc/src/main/java/org/umlg/sqlg/doc/AsciiDoctor.java index 3a122b6cb..61e65f50e 100644 --- a/sqlg-doc/src/main/java/org/umlg/sqlg/doc/AsciiDoctor.java +++ b/sqlg-doc/src/main/java/org/umlg/sqlg/doc/AsciiDoctor.java @@ -24,7 +24,7 @@ public static void main(String[] args) { private void createDocs() { // String version = "2.0.1"; - String version = "2.1.3"; + String version = "2.1.4"; Asciidoctor asciidoctor = create(); try { File file = new File("sqlg-doc/docs/" + version + "/sqlg.adoc");