From f829d1d59b29c1c94d5f047d1085e55ca990a958 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 14 Sep 2023 12:22:47 +0200 Subject: [PATCH] Migrated docs to antora --- .github/workflows/deploy-docs.yml | 31 ++ build.gradle | 19 +- config/checkstyle/checkstyle-suppressions.xml | 3 + config/checkstyle/suppressions.xml | 9 - docs/antora-playbook.yml | 43 +++ docs/antora.yml | 20 ++ docs/build.gradle | 75 ++++ .../ROOT/assets/images/tracing/parents.jpg | Bin 0 -> 13277 bytes .../ROOT/assets/images/tracing/trace-id.jpg | Bin 0 -> 55538 bytes .../ROOT/assets/images/tracing/zipkin.jpg | Bin 0 -> 281515 bytes docs/modules/ROOT/examples/bridges-src | 1 + docs/modules/ROOT/examples/docs-src | 1 + docs/modules/ROOT/nav.adoc | 7 + docs/modules/ROOT/pages/api.adoc | 94 +++++ docs/modules/ROOT/pages/configuring.adoc | 61 ++++ docs/modules/ROOT/pages/glossary.adoc | 66 ++++ docs/modules/ROOT/pages/index.adoc | 52 +++ docs/modules/ROOT/pages/reporters.adoc | 74 ++++ docs/modules/ROOT/pages/testing.adoc | 71 ++++ docs/modules/ROOT/pages/tracers.adoc | 45 +++ .../docs/tracing/TracingApiTests.java | 340 ++++++++++++++++++ .../docs/tracing/TracingConfiguringTests.java | 133 +++++++ .../docs/tracing/TracingSpanAspectTests.java | 294 +++++++++++++++ .../docs/tracing/TracingTestingTests.java | 229 ++++++++++++ .../resources/docs-generator-build.gradle | 41 +++ .../src/test/resources/docs-generator-pom.xml | 88 +++++ gradle.properties | 2 + .../brave/bridge/BraveTracingApiTests.java | 4 + .../otel/bridge/OtelTracingApiTests.java | 4 + settings.gradle | 2 +- 30 files changed, 1794 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/deploy-docs.yml delete mode 100755 config/checkstyle/suppressions.xml create mode 100644 docs/antora-playbook.yml create mode 100644 docs/antora.yml create mode 100644 docs/build.gradle create mode 100644 docs/modules/ROOT/assets/images/tracing/parents.jpg create mode 100644 docs/modules/ROOT/assets/images/tracing/trace-id.jpg create mode 100644 docs/modules/ROOT/assets/images/tracing/zipkin.jpg create mode 120000 docs/modules/ROOT/examples/bridges-src create mode 120000 docs/modules/ROOT/examples/docs-src create mode 100644 docs/modules/ROOT/nav.adoc create mode 100644 docs/modules/ROOT/pages/api.adoc create mode 100644 docs/modules/ROOT/pages/configuring.adoc create mode 100644 docs/modules/ROOT/pages/glossary.adoc create mode 100644 docs/modules/ROOT/pages/index.adoc create mode 100644 docs/modules/ROOT/pages/reporters.adoc create mode 100644 docs/modules/ROOT/pages/testing.adoc create mode 100644 docs/modules/ROOT/pages/tracers.adoc create mode 100644 docs/src/test/java/io/micrometer/docs/tracing/TracingApiTests.java create mode 100644 docs/src/test/java/io/micrometer/docs/tracing/TracingConfiguringTests.java create mode 100644 docs/src/test/java/io/micrometer/docs/tracing/TracingSpanAspectTests.java create mode 100644 docs/src/test/java/io/micrometer/docs/tracing/TracingTestingTests.java create mode 100644 docs/src/test/resources/docs-generator-build.gradle create mode 100644 docs/src/test/resources/docs-generator-pom.xml diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..e4d12b67 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,31 @@ +name: Deploy Docs +on: + push: + branches-ignore: [ gh-pages ] + tags: '**' + repository_dispatch: + types: request-build-reference # legacy + #schedule: + #- cron: '0 10 * * *' # Once per day at 10am UTC + workflow_dispatch: +permissions: + actions: write +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: docs-build + fetch-depth: 1 + - name: Dispatch (partial build) + if: github.ref_type == 'branch' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) -f build-refname=${{ github.ref_name }} + - name: Dispatch (full build) + if: github.ref_type == 'tag' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) diff --git a/build.gradle b/build.gradle index e758fe10..51d79b82 100644 --- a/build.gradle +++ b/build.gradle @@ -30,8 +30,10 @@ buildscript { // TODO: remove this hack, see: https://github.com/nebula-plugins/nebula-release-plugin/issues/213 def releaseStage = findProperty('release.stage') -apply plugin: 'nebula.release' -release.defaultVersionStrategy = nebula.plugin.release.git.opinion.Strategies.SNAPSHOT +if (!project.hasProperty("antora")) { + apply plugin: 'nebula.release' + release.defaultVersionStrategy = nebula.plugin.release.git.opinion.Strategies.SNAPSHOT +} apply plugin: 'io.github.gradle-nexus.publish-plugin' apply from: 'dependencies.gradle' @@ -58,6 +60,10 @@ subprojects { apply plugin: 'io.spring.javaformat' apply plugin: 'me.champeau.jmh' + nohttp { + source.exclude "**/build/**" + } + java { // It is more idiomatic to define different features for different sets of optional // dependencies, e.g., 'dropwizard' and 'reactor'. If this library published Gradle @@ -284,8 +290,10 @@ subprojects { apply plugin: 'com.netflix.nebula.maven-apache-license' apply plugin: 'com.netflix.nebula.publish-verification' apply plugin: 'com.netflix.nebula.contacts' - apply plugin: 'com.netflix.nebula.info' - apply plugin: 'com.netflix.nebula.project' + if (!project.hasProperty("antora")) { + apply plugin: 'com.netflix.nebula.info' + apply plugin: 'com.netflix.nebula.project' + } if (project.name != 'micrometer-tracing-bom') { jar { @@ -328,7 +336,8 @@ subprojects { } def check = tasks.findByName('check') - if (check) project.rootProject.tasks.releaseCheck.dependsOn check + boolean antora = project.hasProperty("antora") + if (check && !antora) project.rootProject.tasks.releaseCheck.dependsOn check } nexusPublishing { diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml index 9070bcb1..5e167f48 100755 --- a/config/checkstyle/checkstyle-suppressions.xml +++ b/config/checkstyle/checkstyle-suppressions.xml @@ -4,4 +4,7 @@ "https://checkstyle.org/dtds/suppressions_1_2.dtd"> + + + diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml deleted file mode 100755 index 3a16a594..00000000 --- a/config/checkstyle/suppressions.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/docs/antora-playbook.yml b/docs/antora-playbook.yml new file mode 100644 index 00000000..29414368 --- /dev/null +++ b/docs/antora-playbook.yml @@ -0,0 +1,43 @@ +# PACKAGES antora@3.2.0-alpha.2 @antora/atlas-extension:1.0.0-alpha.1 @antora/collector-extension@1.0.0-alpha.3 @springio/antora-extensions@1.1.0-alpha.2 @asciidoctor/tabs@1.0.0-alpha.12 @opendevise/antora-release-line-extension@1.0.0-alpha.2 +# +# The purpose of this Antora playbook is to build the docs in the current branch. +antora: + extensions: + - '@springio/antora-extensions/partial-build-extension' + - require: '@springio/antora-extensions/latest-version-extension' + - require: '@springio/antora-extensions/inject-collector-cache-config-extension' + - '@antora/collector-extension' + - '@antora/atlas-extension' + - require: '@springio/antora-extensions/root-component-extension' + root_component_name: 'tracing' +site: + title: Micrometer Tracing + url: https://docs.micrometer.io/micrometer/reference/ +content: + sources: + - url: ./.. + branches: HEAD + start_path: docs + worktrees: true +asciidoc: + attributes: + page-stackoverflow-url: https://stackoverflow.com/tags/micrometer + page-pagination: '' + hide-uri-scheme: '@' + tabs-sync-option: '@' + chomp: 'all' + extensions: + - '@asciidoctor/tabs' + - '@springio/asciidoctor-extensions' + sourcemap: true +urls: + latest_version_segment: '' +runtime: + log: + failure_level: warn + format: pretty +ui: + bundle: + url: https://github.com/rwinch/antora-ui-micrometer/releases/download/latest/ui-bundle.zip + snapshot: true + diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 00000000..ea756700 --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,20 @@ +name: tracing +version: true +title: Micrometer Tracing +nav: + - modules/ROOT/nav.adoc +ext: + collector: + run: + command: gradlew -q -PbuildSrc.skipTests=true -Pantora "-Dorg.gradle.jvmargs=-Xmx3g -XX:+HeapDumpOnOutOfMemoryError" :docs:generateAntoraResources + local: true + scan: + dir: ./build/generated-antora-resources + +asciidoc: + attributes: + attribute-missing: 'warn' + chomp: 'all' + include-java: 'example$docs-src/test/java/io/micrometer/docs' + include-bridges-java: 'example$bridges-src' + include-resources: 'example$docs-src/test/resources' diff --git a/docs/build.gradle b/docs/build.gradle new file mode 100644 index 00000000..30f81dfb --- /dev/null +++ b/docs/build.gradle @@ -0,0 +1,75 @@ +plugins { + id 'java' + id 'io.spring.antora.generate-antora-yml' version '0.0.1' + id 'org.antora' version '1.0.0' + id 'java-library' +} + +description = "Micrometer Tracing Docs" + +antora { + version = '3.2.0-alpha.2' + playbook = 'antora-playbook.yml' + options = ['--clean', '--stacktrace'] + environment = [ + 'ALGOLIA_API_KEY': 'da671ceec1f84f80f280884a6a91bde5', + 'ALGOLIA_APP_ID': 'WB1FQYI187', + 'ALGOLIA_INDEX_NAME': 'micrometer' + ] + + dependencies = [ + '@antora/atlas-extension': '1.0.0-alpha.1', + '@antora/collector-extension': '1.0.0-alpha.3', + '@asciidoctor/tabs': '1.0.0-beta.3', + '@springio/antora-extensions': '1.4.2', + '@springio/asciidoctor-extensions': '1.0.0-alpha.8', + ] +} + + +tasks.named("generateAntoraYml") { + asciidocAttributes = project.provider( { + return ["micrometer-tracing-version": project.version.toString()] + } ) +} + +tasks.create("generateAntoraResources") { + dependsOn 'generateAntoraYml' +} + +tasks.named("antora") { + dependsOn "generateAntoraResources" +} + +tasks.named("antora") { + dependsOn "test" +} + +jar { + enabled = false +} + +javadoc { + enabled = false +} + +repositories { + mavenCentral() +} + +dependencies { + implementation project(":micrometer-tracing") + implementation 'ch.qos.logback:logback-classic' + implementation 'org.slf4j:slf4j-api' + + testImplementation 'io.zipkin.reporter2:zipkin-sender-urlconnection' + + testImplementation project(":micrometer-tracing-test") + testImplementation project(":micrometer-tracing-integration-test") + testImplementation 'org.aspectj:aspectjweaver' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-inline' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.springframework:spring-context' +} + diff --git a/docs/modules/ROOT/assets/images/tracing/parents.jpg b/docs/modules/ROOT/assets/images/tracing/parents.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b62bde1660c036672c13724ee0b745a30b950a15 GIT binary patch literal 13277 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 literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/assets/images/tracing/zipkin.jpg b/docs/modules/ROOT/assets/images/tracing/zipkin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9a64330a74e87492b08da09435d0fe027cca7b4 GIT binary patch literal 281515 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

    N10a?#oE}m>R9gj?r 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

    `~Tp zU@q^!-P28Bd`X#~;erlBsC{Vv)1t*}j@~LsA0OT~v<#8?(al~MUM)3=Wu4D9CcTe# ze?1iXDTgz@^?QOfV(PK3gvvjoq9ijTYlUe@((4*zGz~fVNnukfkzg0*r!f4@?xFEi zH}rS9=-=S3cK`VQcey}1D60$|pH(V{K3Mzo8uZ8N<8dh7JHaPtC&{9XibhtM=4E8I ztdhVy;Zx1)>^zW(wd@#xat}<%!Bwu2$=`m#w^+;>I^do)jdcUCugGj5SOBR42AY0I zAH|8m`IrD>chww>z?`Cc$<0vjMo<8F3C zwI&Yog(P*4{KF#iKN{li-tQl$RDZ3kS=5?r)dyAH+|l2@FR5)#9|Rj@h;2!$mVGej ztG<+w>(Hc{;&b?j7wz2V8#pCwgD2Q?0A>p|_4?g)z>IbXEH7F_QRlkBIyKI^u(~-N zcP0?D58TSE26i@p7GPJi!N7W$@w>CZW+8p!Z>$)@8$++U~_}efx2Hk zc=mQ;7e`b0@U@VlpZX_}IAKWUZBK2~yW!iOZi;1(ubX~8Y+tAyNh$hi0QmMpOznCJ z10_}Qs@6vjUt^cLTm}Dz)1YfLx4krcZXTOrsujiF{7Jr3ctP{Tbxo=Tdjd^P`pBd zPWqh*nBvxZ>E<;zWM7*uad+(^TV3^NCt$zJ`u#ic|F3n`yEpm|J+pe$&)ZGmkEBcG{!%wgrOcmeK^tO*Vk-(k9To=Z^Ub zxG{(~n%=W*0VzUOB98*9a=(nGb=jL3bF@6*N9HK}DIg(4&0fQ^+`#$-UjlY7`HLk6 zIg>ZHYc~I(+59clxZ4VRH+*YG%i!kS*#;_u24eg& z877d)y-Fp4jZ1$dFfdAWtMzym>J8*Jsg?=UvEz1My(^PlJ=wK}T@SJAHFsmfZoJ$@ z1-nRT7d`G`D>|C`+ku8Gf7rRn@ z@4hQsGM)+skF9MSqE%*Pv|5&lRK`CW*4{q_H@rBq5BT|S#G19$A@J-06e3PdE6h+1LyAS@&)RnwQUOJ}p=-I)qvDPcdH8jQ?s(z$p*6GFa{EmbSo+ z=EsZ6zi2)|+zL`%=>)V|92B}~Qj__0{EL-|#l_JlXO~UQzuaU0t`&SOXvqQ^NaR&&>7}8IYKkbWIc`H|+C1wT z*U%BhE{SYY+!m_oqu_ZdW3nmgPHwl7Ecue|J3DJ$2-@3^7_kZ*@s~|%cq_kPq77Nq6&DHCAYI6ELgYFUc?D;_ z^@nE=q|S)O91LK;{sYz2%~k_%(u79caNFSZHt&C_9}%ea|)8ycU2{_m7 zj8kNm^OX-0?hM)-79N`veJ@%89uJZ^l)&Kf@*?schVcY<$=Q=gLY#L?s}d7O)TLzN zh0BD0$xi(~N<@Tm@y+-midXw&{_RwAZ-4(+c4pe&?)PdLayqSmr&L~oY%fwx7(I2; zU>D~enJowU3ykg1mm58$U z11IOp+K;5VLX*E`1v~=V@qx!|jSt%p%$Fh5n{Fc3wokXBC-O^^<$VNB+;l!WIko@( z)SB1lWnJ)wUF37jVh4rmy0{1(RXYvk!DIA-~Oy< z7`b{ahkSDDrYu;WtJDqA6?4!eU#@$oec&zS{ep~afOE0g2duyxbOtp0>`62It><)n z2GxP|E50TCb>oqEYpvXpcyo)`=_9v3FPP8j!a@n2;E90_>U}gM`P3B;PtzLbwiG9I zbi0R=@ib9iEd8kmfi7q_Ivm{b zJk0F)s#!>JW&`f@-Bm>e#hjYD%7~${y-Kph>Sqn4+NFV=ZuZN$;C0ws^ZXx_Duap- zrPqr`4f4*CnpzXZ8$B*=ssO2Dpzc3AT~qstD8<)nS87xKDCmsX(B-?~kn2~Zn=II0 ztz@QxNf$^V^pbgKb2G#zZ@@^q9)hx_wmf;;{^=fx@#gLJ+?YM zt&97X*ArA1e4|e>*7@Zjm4Qo5j=q8 z+W4t`)r-uxez~N$v1@9f*gk6Tdv>~^Q8#!FW#P|XLPQ`_nI@!hsO(i3Bs zZ<^ic?IZHlZl1UDXh@vlg>EQ#GDd1&wf&@-19@Xvu4%_?dBlI5t!C-I@u$V7*0L7t z@!!7}JgpiX8)^1r)%R{c7G@xwlfee)=ic7AP$XfNvyhTnlr_}lq4`yKM=%HM(F&gE z2{x1+(qeFVPZY2i4r2C_9-9p0lC4zA;6tMKazwW7a#|+^-*RybeFT7q?rkYi591D{AQy1nz!(>*z4=#XORWfreb88bL_w_p**VCZ@2L#SwPZGsYVi8H@*#z}m* z*fYhv%u83Q6>Rw2+JxnI?#DV7PwWx~jU4G7dmoFWCa<_OQ9=DSo8K+{Jre!4(80E|1ARj#^9_ok{(iPdj^3O>hh|cXk z-HEh{<`Z99v2uovWT`-IZ82KUmj!kjZgJb88MNXrG6p+E6BcZ|a?NAHgVU}mN<#CR zartegraxvJH@QG~I-4Q!uiPb9<=ygZcgV2u_oc!xj7HfflLzz%k7Ix;ux=RRPBj9z zr5XoIVUARgP!LDk1-_DKkf5#U4#^yb+ zwfA3zJ)wqt+h9w@1#kh|G6WkCAGo2yGxmAz1wjIRV=GqE?n&|Bs)JeAi+f+QB?G!y z$6?hh)blhGQgdCb3Or6U@#jd@%R>Wo0m*xEp$9HUg5BXSft^-tb>g2!hWcV9=0zEY zK883}hxp2-Oun*Q7kr0l2+mf4bk7fcOUmCK|EXD!zWQ_gYueKKy9}@~f^XU5P|%?w zeziJq^xf@@$Oa?oz?{@;@l7!+-5}MJPT)?xw%W-<%_VILR=i*4>YqmD$rJ!q1KI{4 zD1jLkyYH-IzBUBkX!Uq9e{lF0Jf}~mlkvbZV=(*n|HIy!$3yx5ZNujn428+QW~@=R z6iJp53CYr??3H9El?;ZlgzTaCwi%VOh3rJeu1$o<&ZvZBhK!S0x<9_Z>$;!&zOU=` z+}G>(+<#ox{rJnvykHX-UM3sI`!P*UKzb2d*(0HQrK;6I8#r~}K&bk{4 z$v1M*NccRd3e~~1In~e5pt_x{3D;(?VAeV{q#UcRZ z!s?>~UI((Ws7q>JSB)2gs0uccjhq)ZftrnvhJgKZ;}u#ME~Ys!vuthwA=Y@7Kmb2{ zwIjBpXY}$bogvjgiS>%e#SAkAWTYo@W{G`{K(Ph#Np0Da5}@%r)s@HVxtDeJGspQ; zU!FA^M;u8N9x-oW9_zV;nm-`XlqOe_Qyj$B8Sq5^ zLJi|Zb80S6sudI#oWPQSx3{QmgL^tRI3xXWH@)xQIq=+O4c{rw0B4!TX!eXoI~E<$ zH_2Dk6AyIjgP3}UKc8&1km=LD_oV98*?QY^FRb}nT=su71^y(I(;7gJL?B}4Fpigj zocROs8cix!k1B zk4~M88zRt~+;~_ZS2rE{ts(GbSK;)yciWkY%$xNU^%mrSr;lZTLJI}67)!>cx$+Zy z330d7-(WpU% zUBAJVB>f9nt~++P8JN=ZQO7W~vp-{>&k@Cdc~>~Y@u|f%q0p>HfrUNcLZ<7>ujSVGj+0m^`o^RmU9epbQ;`Q=Sy2PC8Usd^qy8O^Nz=L#mf!ln92L*SC6=@@%#p z%hOU)$?kl>*)VFuru{%I&_s)VFPK6k1P@tv(l%YRMj39j8bD18Sp-J};oV=!-5jqjg9C$Th0N!Pv9FQ%RB zFV)svdUA_o=$QA8E#}R*_*9y8F2(`Kf6`v};`Qje+vujAHC|dH&+;rTxT{>Lt+?bH z0iWc?9tQihG%m~%TxTr94)zJ5TY6z70)D=ju@5Mz@~qyi)=r~-tu*sb`s&wwkavL3 z6FE=%@_<&>054GvYZw>%QL_54IqACE6|JksZZO0@wzr<_!=$Y zGhbPe(XxqK!Mo}2_P0GQWJ2#!8;f-enFVa5#d0z+)kT|`&%jVrrU>n?-CBog9bD#` z-oJ4AGI~!cTj2Qlw+BxoFB%je^-P$zu~ScOI7|>j3Rwe3!w#xH$s%jORzYzqa%VZR zz2Z?a{4pI+=+fdO{UolK7EZYlJB@}KJvv=>xvHx?KfJpp;Yx{|%9W4Z%?g1)6VaPm zO=1Xbr}}wuPC`ZW-LD}&n{c+` zIpOW1`B^qw`HO<8=e(!^hz%DI{qgC=r_ z4^9Q~bhLMoPVn#f_y{p?pc=`Au+E55Y;%Bhwx>HWdWMzz8Di` zjik&LKXH@|Gc*FDXc;TA2WKxMz{!wFw|IXI+dLV!Jf3mceZ6vsd9oKpf_+%#su-Hu zTOghy5vhNcCJF?k$b_}WKs)f8D~~=$DgGFImyG51x=)`I3Enq$;PIhd-#xQV-9*ak z8p1%4Q{Rn}d6E*}Oa;CGZ4-u-eJ`Fo%6mOfy<0!>ljhsw1qJ~2!5I2X@W9;9U`^jNbWUl1s~HPR-9BpLs?2mcUzid_(zXqgf#ce}s9vQFq!ke#k|Z z^6PbBQ{}V6v;>}y&v(}_ry$$2Ux4c`YdhZfGvgZF5Y8ELeiioMwZLGQjiE_)#(sX4 z%&{n72J)70c`163Ao?Q6lW~~Ld#vC5vEp$ohtNb1lNpg?M5})e58g9jE5& z!2XFyJq#P}Jgm{OVH4{>UyQe`aU@{hFEc&_k7lMlw}Sk8+0WW#)ebH@xQuq_3zQDa z-9@UT8Kc>4QL`9^aCV!t6nIYYc(x6ZsC=((?Zw{PBclqY%_)J8axX_3F2X8*AceG+ zNg4;pqCZ`X)H?<-nwYnffV)YHDZ|TP?!$CYH1g`TdcrfvkI>>s>mp;~Pl1geqasB& zUx=Ja1A8o;vJ_vX!4E67`H|K5+D>@>Za7KuskOL~xouW5ssoA$#2+fJ=qF4S9_mgd zdhwQ29ePdf;!)<`5#kmJOwUmBe2??JHmZxi%xCR&9<^AT&e{88@{GO&#OMTv-6I^q zxYuw$es8?-rx(}1X7%nbDS357jQQfKaa5)eCa>nItLfA&#l9H-al2ls7djk{}v&(aN|`fQDsTfOu@+Fhr{m9-Y={#Z zn6_y*aP7iW#wYn!kLK4md{WD+7JPGcN&I-J4W4hmk+dTPHC0ngO*0vIQQCOsKz8nz z@#4n4U9X?l?QZ!R2|0!KqVidTASC+(RWgv%lRM^K^jS`KXYI2}*1VN=w{9*@JeM7A zqn^-q9ZoXI5pQmwZtL*a6Y~es?^;4IVj+hB4nnIS9pi0RX;Sfv^~PoF(zW_=bJPz_ zBYxJ$3B}Bo$;t>4+4GLL*1EcTnt={Qh;_*pB?zL05@J{0U}F$f(E0PO8?Q8T-dV3ZQ$^)c;r*SsZYboT zi#Ri<(ekN%ehee5202$|~7zq*MT zBPo>usaK97VMMQhOM%>j*lgE}3eCL4zeM2cpW@SQfJu*z$ZD*^DsI zN&1^cD-VFo;{_0B|K0{|taX$h#>NKSD!uEl>t!7u*PE`a0mQP>&zKja_@&0+g6A%S zZO7@>{k?ZCtE^9LgJv3c7BRHpbn#7FF|`^-=*w!W=%KlMRO>b}zAmEFzbQTL%*`tf1!L)nX>KKXN^Y5^fZ zym$6~$p33NPA5XV8}ehEXWqS@#s;&^biP90TD5#+bNo!s@3B{R?+EDZ^Rs<-*Z`=q zKWLK}!w3@GUmvA+)Yy&WJbvuh!=od5g8R}@Cyv|u*-YH(zDLS46SQ{n&9;R$y$*aj zY+2~&dh2l`PN-W#tn-XhN;AgD6Zt_MFB?2V8VPo#ysjw^d~Oy-xKg{nIZ!Dxs{ZWQ z?_A_eS!)s|(om7YDxd1Ub|O%7<<8ild-Ca$mC7fg^*~(MLe+`C45w4x5zuc7!V{gZ zStmHmyj#()Isd|XESb4a8Ht|qXz7BrAJ0qdhi`fRf&A-5rO#I{AGi>h9N^2mW+Z)g z6Im*!6JWhoJ4~f$Qne$7$IEW5KDOzT@I#+nmdnA2hxehvKM;E>5Oh7&kNv4x@CW)a z0&Vcn-Q!cezj04gk52>6S-DLQ#q0aRKE z-~vU*x{i{PbuVvzBj8;n!LRgLPt#WpOK>Q^&b0f3Z{PJ#eU(?FVr= zR1`SQ0Xa0_BT-&}?7(^kM2ZqbQc}S&V5hRv$I3*4ds+VO{@Xh0$6gu$Rwd+vL;m6e z%J)wf>-wHjIZ}!iPo9)~a+*+Q=LU4C0x6QTTa|ETN%yp0SlfY(10*RwnZ3LDKZq_R z>wHKy;MPJ+g~s2k#z?XHC6;2ZGfz4j1o0ll{qnfQc#q;}-T>xM0W)3AdN$Dq4!Nc@ zZYS@w;l5h_#$Um8pYEaJV!1M>>vE9>!Cj&evT!jS`{RC|v}V7)jxdA&ebKn9^(XmA z&B`n657XZOOK}95h+=T`F}CYch7wo12^|N@IWv6pLJT|0h<}xP4zRDi1r8@8O`HoG z&ui)X7s|b}PdZ6%4{N}=935-j8^4`+cqCFko8}Lzc~C>U?9$q$Wd=&LlDK=BS>2zH zR|?bHU&==<8i_IlpExljm<6f~$tT{mg6F!gs7-#5(YpOg067zV82QkavurUYyaaP= z#FTg|^Q0?xmyj><@|3R9T7$)UaB7SeqQ`VvBl^(d_v~;=Ci!kp?CLFdo=*!MnK=jU zrl0lnrH#kT8DZS!9XQq!^iewT+Po((D^_o1v}5ytzmM+i5Q|lkhch&UJNy zzyyNvSE;D@>Lp>;fV3QCGQQgFxs&&yn-q)dh+WEwDPP@C2WQGcp$$PRcy|F_6Fx!4 zY=><+sVzZ;I*)ec6K0e z>J~nvWb%QYN&QKXx_>Y}ninl>^b>fD+QdXacq7<`dU2;?v%_C?l!q^hgM>f#3RGRf zzdNli7Sjt3fJ5-gj3ZhKe+78T>vcvb5X~t$N!a1)NuogZTq^iy{U2x-^93`21cGxZkDmsAAbHm$!a^U0DK>!kiLJga zQi&J+Z1v`(Tb5{&{K4=sf&x~7@RVm^BXspU z)pIE(d_X^Br|2S@+V2Q|16%e|FT?Ex{#D-n)h1%mA?S(yW7X|b*LjD85FZ$Vum$}p z-W=x5!(~pBIx?p<_&f(oU#Vw$5VY?My}OxpV{h4qbH69rF-FSBG15iisAy-77DXu) zl+|3_{s-E@&@0cNFZ!~*4HDp#ROsSpd#;1%1=hIw5#2;Kby5H^L3%&@m>Scu(e4oR ztog*wJ4L(H*LMq47VkNlkjl2Q2$C)8%vAW=&vp87_|)_WE`x60J3Vln{z$^H^F#V! z#a2P_PEpy)3Ii_9G&;+8Cp@tN z8bM1uKF==KCE9-Ky0#;{qD$5EUN9n~RCfb-rvO$YIvNlK%%z0J?etT4tzLiab6Ukd zUQ6err@LzjE{qgARZ$W| zV^b_rjNKEaGA6S;k)MFCS6I6%k}!2&2YAb*Gi#m$)Fc{Np$?QRJbP+ zO#|>!bTBS>#-rs;gbKXWl_OIPHjbOw4nFp8G1+LPOBvZmy}13Y0es*9&0x=`V4Nsx zi)|r~aalCWZX27bfyGjPg^S%PyFQOu%-#l`G4~h_l;E4yXf|BsX%eOL?zJ#xLg=Jt z)<>O8IaJHoQD6ZHp!BJ9eL^b;OCm-=83u4;x(4icEN!H5mbBY&$m5=3jrb#OwsBm^ zY21lMbMkwZ-Q>S1@aX|}_W;^mW(@jt)E;WgU4;y(B4;+awh+>xZ#&b-dY z``RfM0q?aCnKR!8fCc-5CPZSen-ptTeP)@YjsOuPp?@Ieec2kDFAc3HN_os$(RCX! zl0Yk8jCu1{fEq)OZqjw>+>so~dzoHKuYj&Kh>c1KEwWF6Ip`9`vg-je-@l2DFQex2 ziIPnu1K>Ro(HjvakF5J|Onhw~EkO3M^dbN@iiy}4(SJX!Jw>JS6(P3KAYAB%ylqXx z-7>f8(<7&kJU*=STqnv%TAXUu;wpljdiVzt*4HMxZev)Hh8nRY*n5FeMQ)CF?WBG8 zAF;ois%s~e<_&@Rt?1~51Tt|%bc*&8;b>rD(_eb=q5nTAhHfd-{?p@$ z(xjqTMl=#_2M~krEkNe~YYiuljntTp*HqaKXUAhyE57Vtg{!h{@?7Vl(HD842xC?| zNgzVj+qF6^_JuY^%BS|mPPuWlRX{~*Ar^)@pju`s;8`s`*yg~jZ1DnBFYW^aD z+S7sMeZlZ5#`#PKx2#~%DfZEd;P1@ zc!uZqjhyqUxykzJmk_0Hb}Ai&&@o+2yuiR=f0-v{2TKB1>o{O2?tSQ?gbQi96Ro9Tdhr?OEY0n`1 zd%D;U7kTExCM{A+kC^v0Co?LtEo(xtI>Rk8AdGWvTDkgsy=HmZ!A8G zc5-(VFmH|w3tSaKkm!=YRWm;cZ$J)+#|mmA31m`yXv2@%;F7f^Ii%*hiIQ3f)XW$H z=LbG!?Qk~jBz*f_JAdAl!+)UXg+|hW)CRIylA%OIhoSJGzI>6*GiPs+4eNV>MXh;F zM8Cak76Yk=k&hRRxTlu@?S`l3$H-D`qV)sGY9{TOqujaFpzOrbU3EH&SEa}%V(YI; zd&7cq`9{s)1ggoD&Cl0GxUQM8D-*cP)|XC4GhQsn4hTE?HPoL<`LHc(CxGE{@LJ4_ zukh-0v1=l+S|_p5glyo^ej;fhTw3FW`%7VyGu zbI}}JExS3PI^gzcsmjmc$5>5zpe&oNOnRzuh8f0bwgkEgj4{7IprTGP3-O2|ylRss z9N)$gX&6$SIT?6e=D{_SuC?1QbJ6(>d1}BBc!;j=3e%4SsE+>#P6+YEg*oQMwwLey zc_u2C&xeM-Oc+jUP5xjZ7h%!Er~(#Sy#Ek^mg-nz+%eeCYFQ!tIF0BBHKzaTxe5Hye8TW6!s`XZy+XGo_y?(29k8@7Yy7_aB-ZvB6y`68+ivy%wCO&EnZBT|-&i*E~!svFFw3q(FRZq}`!iz>Pe zaG60Epdd=Id4HfGA1o84`+r#DK8{DuJ}HtO0DCb%~;Xpts+>NUQ58RwD3N2c;8A zomP%h-&3A>hgzq5MQp^rZ(X?hfi2ed>Vb4%=t63n6m-J9Z#krs=)d^1_Q9!Y%lO27 z#~vHRh2-+Z0cwl^%B-WC2ydz>Yb;VJKrkHuY3s^C_?iypM{^BvL)8}5O+sM((c*Y# z=CdH1sEzy>EuWo-nqBX_uFW{LKZJ+v>we)`eX5bPF#RxWLQeY`OF!2`KL+cx^e?bP z2Ng5OZUVX~?77^z>31+Hx3`tEWBMX>OHQ4GL2k<-0T!U&$*$?~p7=)0^o&H${z@yJ z9SO)cE>~}r{yfSSm3|*$I#g7}wSL?#88j-~Xeod;wS|}ojKC?m8(ti3MxX*UR7n8e>oTI{H3QF zinszN(aNZ4@!Ec_EySA1pIsNoWxLu@G5+c9=U4G|?6xQ+`X0Q>kfAc` z^N2@>&CSW}tF91?GHal_F`sx{O4uRGsc^S>;-k&DI1~YlR6m2Ic+FKnU%LQqXmKcw zc{+dci|bfxM0cQ2>^5^M~ZNri#Z$q|R+r^ap0Mjm%oe3f(Ly1~2S zXYTf{vZ@f4T@$Ks0{xWt$k7B)=@s8US0i#&RPex@u+DkWki?=$6b0}`1{hiryz|98 z7Tu^DIPK#x5TLK(TeCd+#6RRom*UwbKI=p2M$#duPAsR@6O&voY^7ZiHZemxGC}LF zuO>26<;h2-GUw7kfb8C1We{)-<|g}03gED96OscOKi%*CtP11zdNt{JbP!9eOvaG}@osd@v3YQ)rbPv)FP18;$hy0UIPth+yw2K* z0m?IFVTvs+NZJfvvXU{%=?t1jE!_qOvvD()ZQ|bX2@3bF-(cIZBj!= zMRb=<+_UzBs&}`k;6+p^;|w*mc)G;q@XLyLo0LZiQ4cFGyj!W8sfNOy0pz9|4=njI ze8@d?#N;1nPOldQh#87`4rvFFF|PqrYeR4Iz(7!x5*hv^K9bj?Yn{B$A5bq8eVFtR z3~^kpqmMf73|B^$Qp*a;SD@xNOvvT!Ax2y^D}ivX@qI(IaH@1kF2Em5{m6RaU%Q`u zr3Joio)Q}$C}ek&*>N}*eGF8n6yeRN?G8Cf6ilnMG^M&K`b1dZlY%<2xo>Y{dDef4 z0=E;_5f8d6OG5o~75ikN!T}p^;>2y9D0l`Gd67L9d1puoF4Bb9ECQc~7So0DLUexn zd-uK&pS6KKJfBbjnV!jTjxbUk4^lS>fuJ7l;YWfBC>0DmyD3KW)`v)3- zu-=P$4aaw!1sz(36RMTfiDbY1=FyiDPa4;Mi9t!N*M*T}45YEs)qR(Ua~a1^k2 z-X3Iml>2IxTIQW6=9p!AI?Y5r zi8MGxE2sEBiQxAV3Ei1IWcwrYXvMADm8usG{F1qrs;h;tneIwl)kq*!J};Xh@yrEh z-LFY|mLz<;hJ9(^XP16*vMuT_1`k|T%uufw(C7D|JYPCRRUG)*{_dF~Z?9^iZ4F`# zx!%i>HXL(`Xa%nojN<+Z&pz3d`u)JI)Xc20Q)ykxxx7|_EE{7wt5uNj1N1y-L-;wm z4Xi^>qh%3iCgX!Qs>SUpDYx2x61LZR_3nAA z-P|W<>RR&UeQk3fyAY-M!GSa30b~$|bYjFjm%aA(d~e+QmOtTHhV^{>?c87kPh|J1 z+Sv{V^rBkXLK9!#$7h6mZ^1F`T=D%!pov_*Q0cK=&YpH+V$(rp-mj`j1nkjVdkBB! zqxAIldw*H)pt^x2H}wC9}u}Z>O~LKIQ3>63lt+i7aG346;;78>V+U zoIZ8=`=DO--Mu)w~F!a@R1Dr^P8i4Bh&`(%cMl*#xk-bd^8OCtg z6h@>=A&0-3ijI1|tKUUGv<>ThYT0e~s<`2qyX$PcYE|q)qxd%8~(Rxrpm`W#laSpP(A_ueB1ELpDfE z!Wdxj02$Oqdq7#c#jpe=HvJ4up?;^lavO!cUmIT*>fJ%S{TT>)#|#)wV8ySyc^qi4|Yx$kQQ}a3Ml+ve~mL6Lq(L*WeOx}LJ?htL_o6p*^m2yY@EYcDY|V5*LBV!GSdwaR()y}x3L zQ}UrY+31Zpc_9QlVTY=r?0ikASu4oUTj`I=0|N_we6o~4j#ca_Ld;wA029@q=|vqn z#-zO8@V&dQU+!s5dt3!p^XwH>gT0$4Aba#*LeiTnOw^M?w3+e(}I2Ca<6GiP>!n);2}X=3zK z*pV{P)0V#Py>?1Nw;mtz!_n{9^%WolL zfg_OyeIPV#rw%a^3}u0*?3qbcf;YqfwZPHGfz#_ORgYEQ@&|hA5@`@aTX7wUZw)?# zZeNNrlpXr|>H4?rFMe!zdAvP4rsz48Wo&5I1sKt?8SG*))rVF_(Q;*L~5iYyN%}${b4Y?;Q$ZCr2m3^iDmomnmp!9-Gz7h4jbUDr;L8-&+ zPeHl{u5Yv@2TNURXC4Tbw}q434PvXG4Jaz4?$*iFll^wJ=XU7^q+q5m`18`0v*KdFH=56ECarxk0RyrGPZ9^-6a@1z zyC_u>CBJg6`yKNAWvN|fB$kDE5I7rXi@uNuZK$xefv8v-!$(>Ke?igy2NMv3v%wux zHZg;f9MwzFwV&Yns_K5#l#!#!1de1 z*=~W)=D{BJGv}?Jzo73+hr51da;rS{wdbcmn+B-%*QJ_~0X>o5IiXB(ZP$o>m0FfN z-yau;d)S)s>Pn{Rflf1yE875^utca->d+V=(Nf_#opu9r?+F3;jQ8RmuT0}7DpAP_ z%8O!NHa9Lr9?a#lA+L3!N7`ss%-mJ9FfKvgWTq^xw&EDgu4g~6c4W@Z_ytrolbGe0GukF~wEDS8-sr@!Be+rdfP_3QTR%ngP8|4zD*hs~fVDSb z^!~296us%C7N3$m7E7|(r*W6VBKtI;h7eDg6bpr4yCMyr!_#yn?`%@JT3U+@m$61r z50B%hOLKbEt6yaOd;H;}fnB8_EbO2gvc?D^h6q>!8yQM!UbJzba^@@rJnfRr8o|BC zWa-K*-+Q=Q|9q+0tdY3uOZ>#1I%fUSFMNQn-|AdRkZur{^?s@DstRhqc-OQM2GlbM zlD^)DD_P9|cH6N2ji6u|0!n4=*tJDc2`KSj?3h81)J_+9M(D%a!_|i3)ez3X$73vN z8#84q6!gem?CudKZK*>59$OCX)EG&dK`qul@p45rNi#%V_2uO(iwBv-dDQXBQMT7+ zMRN^gY(_6&QY1}Q2v1bg#peD%Nc`SUHl?ut;PwVPCC~bXWPyd8(Tbztu@F9Os%-S^ zjA+Ybj1H#qKtAQ_dZVSE-+|2hvF`6(TKr9Cy=s=9MG2WctdC%$W3)=N6S3?kib47xFl>cQe}p=xxvNK68GiY&$v6 zdm{FUiz%{Wh#*rXwPY#KMNmzhB`gHG#d&bn0-F}UG zlzTvbbQqv}lxS{L0qtZ=dxVry;~I)|J8iElCqO02*g{BYFs;EHPF` zjVmue0&`}~so%4b3g0RwkMg#E&A!hOfZw#R{=URRXfbU%#L%W_0cTZ18OE;9s{uQY zC|1{g))s%37~XyRxjBz%o_mkjd9)B>0ZXwe8y@OvLS?rTBn)?X=}6c;CC4uRd{OGA z`9WUY`P+5<=VaWekD!YC)sHO!8W7z7Cs1NS{sn`&LYXjEI+x@Bgdd_hh_!3CNIn7a z4tUl9*lLE|5RudKGqmOrUz(5ppyQq5H$4iz-w&Xc*bWe_s}So!!2PjFpMp)hP7=ZE zHe_G~TLM{;)RC?$-#yl^$OpM!yp}Aig`fx0HSAfv{CJ(TQve`5!C6Q)uq~rqFR1VD}Z~-TNVh@O)oy z^u*>LwF$o;5p1$Vs4L#D9#y|ciaYoHGS1LtSkGD+`HpazC^Uxm zqb{|$#@A+u_fH>qKnN=OHS71&`a<&FHJ5w8bGZp#1Ysw}HaMO7pruBk-B8UltM>k( zS>R@0m*^Y%HPA@<6LqEKB_2?*(P0bHyfsz{&tQiU0nOwCKi)^=^&+Uj)9UqPQd9&2 zE~b19F*Jn3o;!HoKb_F#Y+Szk{_txP^(zL~#(Ghb^g|5$Plg8~hSnyqp9sOU9^{DP zc;yvZt$Cp8aXsPlp2!O3L&DcZ7M3vdxeNfjj?4mm$s)WFlh_zE%_}UvRLv`QCQ7up z;x^r^P%khMYGbB0DZpW5jphKJM|*zB5}ph{zgJ{`Nwp?h6aOOh(b;@)&}>EoTb>c# zD&M;a`eexECGc!Ek>OWj-{NsWMEXpu>%QZsuNI+9K+oe{X7OWi#4tjDN3}2PBb^ZT zVs3{S*}&M~qJ>?1(wQ^K))zUbb^c;szenm~M~r)D6_mK*skD*puy4lr5l4#QKnxFiVqe!*vdj7t4 z`=KKZ_Cw|3VxV>hNhOd?^II`-BWvvsn7d|A*7W){eO4=}vK4VvY<+DRM?RVI-oH8&}wziXp3mh9-m zD?+gn3h?uHPq|Sw4S%_2B<>=^jAC)U>w_Om+f|Y^;x>xAW=#rk0q3%m4|ke~4d1&F z+`1_COBwlwJQ%S%qSv)tqrHsRXXGALy>@!%Q6EbyyMvS<&k~|u>cNXbQaSLF5#}u5 z9R>BZsb{B_;u_7S8-85opQAX88@0EbghZ53T% zALK7DSE*e2gFQ~R97~c$YNUXGSXx6ZS0jIcS>~hw!bmEh{TpFe zk{o|)X@(O6KoXG`WdcFSH3z$@3%)u}^6qubfPl@O8N(GY9N+4jx8ulHe$a-%3x#w1 zgVaE2hW~*S(I5kOiJ#mMhOYnqw{$t;%!N28&BTaj`NAJ4$Knr!PlT=(m2JxfwM-f= zypT+)<|iSKkw}gsHg!=EF+$KDxrar{N_9d|9+x@?>Hl!ST#q+z{_k7)#gz;0 zPs->Y1IJZVw6_SN2|@eh!@r(d6@qf1y__77{GM8#T&5|st%ww41gfS_BBqjikw*e! z(j{VkgNtKR^~~Rsh<=&N0j_`zAto==i#)0Pv?p7ll<-Q^i0|(q@Jf`s>Si3?oC}!> zJbdA87#+FOi0e(t+8sZ3r5IIfgiY#Qr5MxwkVtjzc;6R9g@&)u)n81c&@dy zW#!5_9Sqp2eJ*<3=-9j;PXwEcUbM1dT`qJqs+Qep12lw+^RqTo!jF0)jzu51&GkE% z{q*T+A&uUPks=_cJZc(PJ+Sw;ycQ&<;N~q?@Ef@~3IIgodRMyl9oHJTUk))_=(iA* zTr{>X2HgLiJ-iYigLD_`vdV=iNx!#Y3!WN+V?_?H{a85 zjH!&A%f0n4Lny-^y-yjz9vEq43ayIeLS_=t!a~R)w!dfX-w!Ut(=pJrXY;pY_O?N0 zuOXQfp>HS5dTrTmbG3*IL5a7Bfox39zh?yE?m6M}Tn2}8Ir9QLH6`|>fjkg2T|l;M z`-*w?MH_TLdx{EL3y{6rAgf!FS4_tjQa%43SY57M`Zh@9;J~*NhgaDmIZXo^H>ZH| znG>-P+8g5H*=r;}5y^i-^jGfR)9hc@9vA=V3#So3I3S(3@vIOf=CU&4-7Qj(5EwQ! zNUk&SYQg6BI)KFinh%Y5&7Y+0I{5k85O@+~FmdD}#a_1NUu}=vh!ui1AUBikJG%u0 z=TF-rH?Aln%7ji{r50~KU7o$=98ZkRju((4g~^G>L(+@go=@M0On6ied)`j(y}S8g zu;z#h@^%}^y=+BA$$KIVpjgi-9rxd%TN<%&(@)5p8pAkp+mR zH)8;$||Lm%JxW+=tG9fwM*Bf~BRBd?-%(=H*C!`BZGZL>ZWy zI{`t@d+x%i`in;4#+%P)Z`*&r@2zn8KTR(upBov?h*~84l=TC6ye-P+Urwgm5rag2 z{WFx}DO8ev(A0w;KdVa)3_A=?Pg&gbb>jJXVw(RQTln_>bS!#sQXY>+e~~50XZKqQ#MSW9xU^rsyJV_^b9gTU*G?m z`{6XJ`DXdOd#QpST<=Jo2VDsl=ocdHV>W^`Ug%H1FpYvOrvb zWTR^j$|U!q7M$}+4D$9j=~zhAcNL1~a(g1Tce$YZn`Cgx4!Qx ziuShbIky8n07%M7Yi5)duZnq0TMecvzDxOfm}k4D*C+V7R?WFC3fCaSM(43bRpKRK zQOfL;O?)0@t!+`fBBC=C+ z$C;C;rm(%R2n;YRmG84O_!iRb zjlc3BqPQ=j=*K;g1@H;F4ly=D$xsn1#Ztl59#{&Xp#^b~E+hCa>x^;5_)43{-Ktgd%2F5L{e+&}VTO}*|?PvJK1B_l}!H_6>K7R$9d$8dYz zR(wfvup#gF3wfEnjs(lru&DJ~nUQH?El)Qm4vN@OU&;o56rL|$w?>X3{WkkCvJJ0LWt&+uD zr#;F{3xl^`dpWv;P5SUwPhDVwb9v&L^?+TK3vu&Ue=LAPS~L@ZqE7|@y%(`)Og0^XKS^$T4?@;3HviF7!&NA3HVTiJ z#>6!VS5VGISD9;dOSkCP`8|CrwW?}usrk!70i+eUr!*P(L@|7SrDKARicV%pdmqZY zr}3aw;{7?Zt6hbjvg}W*IR94qNh&Wax8OYJKeEg^9~z^= z{4_7bvj)1ve6XDQ+9iyOy{rSy-iPk{IB?!Gyc^&rm7a7q(QfR+ylwsY&>hWT63}a^ z&-B@w5n3?%Bpfp1*-&xknb9#uaD=5H1vbbp6q|GZ~H$5X0mk=|MI-H{`~L4 zl7ER7Y@R<3_#dMMPIPMH_G#Ay7vTYY!5L>oZ8gc$Y42XucwC>T@0lGl{H4t2& z&?k`9<@(zKKoG4lpy=>xB6OWVu_k=k*e!CdN%(l`&3zSc{3&++-WXaUG*HC^Sf2Z+ zf$`93oA}yH8}}Qvz0CafLw9~CvGdDXsBbHu3PK&sMMoSt_sPw4TM-1^_?O)0e=QjV zxxv4!Bm8$>{NEQJ{yQJ~XMb$#bN`4n|3gn^Yq0*Q!9v_48z?L|9HA-G6%XPb&`Wgz znrGWxpF3X|?GNNF|vY394} z|D?DH^ZmHmz-4`tB2c7r`PX4a3UpC_LbpeH&tN>W={=bKZ91t9xH1PYcZUgJ>gsh7 zerqqd!jc+b?$6?uSaGj?02S=MIcfEmc7lmNR6>~YC4qVWXoj>Qv0BF9%?8V6r4ewk zCN9-r##e04c6YQ+TRpT z!0A5_@j)8>=O%%}HBkukp>;58!<$yJuTQZe{IN@wfVhzl&1W#i2$PoqWpi}ZW_=yd zH%;Aut=amK|0=_UP-{vkb$GL@WeCexV|9$1+=rlj1=f&x-+_9+s$d0mA#(hRm` zCvC;pTe-$o&b5_$Zsp)xSi}}4^PdQtLi$JkU*(*-)nWDDJFM9B(%`jhW+(7f<+}?c zi(u?n?)KCF!9Jy}ZkT_n8)j>C|BJP+nE^6Odif7jH~B77wvY4`gQDL-cyH~A|D4hq zGG{0#{Ft+;zTPx52{-rMN-y~Z_d@DdS}teX)Or(hDKV%%&%ePx*@x)9Q<=>MJ|YWz zkZ84_Z)Itd$^jDFyN>q&D;+^Cs zs85ei>dr{71D9L)upi+EcJp^G{DVZ|0Btn6tj%kR{|6T$GQ^76m}GHcHhH5Rj;bGg zw0A!LhbPw4Kbs)h9pa`;=*X)8wg?=i}MSQ%ip zO6)VkwA86qT`^S^=rf3FA$tE8=N8odsY!Ta2)n=}-G#0X{Le=*;sdPAHF~zjT0U{T zHSPF{(N5sf_&>kpzp?k;aZR@Aw(x@yB1IygbchOyh=2v82nmQ%US14#=_(>kKtv!w zNTLV`2#5$MC}2UbARhBmnYJeUvH)>_!=MM}IvK8X}#cc>cfi>&I`~W^_jtqjcEMz&&`Oq zdo78%@|G~b0bkm59t14TXxa^aaIQKdWi_4~_~z(~=`+IRR>;(#x!YBC9pJ150GWCe zihF>UZDgPpgHrUi2~?{1arR(QZc4xv-mRoBlg77If$Qe7J;Xdmx`HO2#5tk`lbbvO zC-^2A?my)KAun^?mC4Wagol$rgxc#*;pZC;=q(`azw-!Xi`nAozgngLSgZ7ZUHSa2 zcMMifxI%ZI6pCahIFi`feg|enpz_qg%QR6V$Eo& zMDX{_8b*~+H~xmxZR^d~ZOYJ4zI3AD-a}3+8(4;k@^Xyan8IlH$L>u?NLlIZsSm|= zbYCCKl*ngdEjs#~cA2E<7NCf}6wErt`&b#kIN5~A;ac|VVm4thr@^tpSbxm)j#Ib# z=Fut{%KNe~l9`QsJ1)mO7%{0N)Y`z8?bBRQ(mo#PUi$Gyz3Od?^+;eSa{bR0+Fxtg zMMB#PbFpETl>>osSw(}>4CA)X6?T;$I;Ahy-8=>vK{gPUe2e6>Fcd&`R_)=cPzkYj z$GwK1*Nt}zbr(F5v<%hyvF()e)bB(&9naq$S^x1ry~qu`b6W$+g>C z6l0Z?j+v>;tp_5m;m|dTBub5qpvpw;V5T+rNtivIVl)@(HYByEwNnBQo4=XEWD61Z zOL5-Pbp+cO54hH?=R0*cRX9e{xG5|E8O+F7xb} z*iBS+ER;?(>Y)wLw=owx}nKy_yXCmP8xMXj8IYsS^P zS4M>Nm*%uixSgCD!F&o&*a#gUXBsoo>a|6k*#l(x4?Q|g24k*kNHWy4ZYjwx_Sw_(8})?F@q3?vCb$XmKC(=W-V(+PWzAB9>t=uWRLc2mOITdo ze|p9JX}F7SZ=gAKRS;NB99#} zmgM7voMa`++^qEW7mQBavt6L`?#q|k6ITieCA_a(i_HQn;eQmf|64lc&}S7;9Sq(9YMpK<}1udHC`Y9PPv#mI3FzGoEFzILD^Pxa^T%OC%IuqxGDego!O zNb4Vd?CQK2k}E}u8_GOg)_{=G9nYAc@1(njwV!c1eEs~m;}KT#kE}A&4im(n$2M!M zYuW8hNxP1=wA9EdcEYAWp8w0l{|}yT{>u{EKj<56BG$ZyOecT@<^vbT@r5CaS|p-| z-8b>r;#gNye&AOZj|8gG^hmPid;Xg$p=*XTqQM%(Ry#|#n9LGpFIltY@CwalE~vv~AS9EI^N2 zQs%M{?4}r;jnD+YN#OU48?xP*3cs;WbUDsC%P@5(BIcmfFoO)fgV_|ivTDP3@IecD z|GzV<_<>0b_nx*KC=*0h*PtW71ymgCjNarSG(tO=5MN~4n?LyJd7_rB*^BUmeZb0Z z!LN>@V286{2U97Eo{KTt`meKn%Mc4&6iCduPWVX^WJVU_RDqHU`*jnL|CFPC^US@Y zbokq5qaW{ag;B~k%oo~;27c@vy2Yskd7}&NT6(oP8%C7&zrRaJfkGF!o5`%p00}15 zTQNK83gA;%POJ0#h^>Bh*L z|CoPMZq8lNSjBV`QT5q~PneNh8moe1#SQANhT#qdSN9ahbzKlSd@b$loWE+c(rF>{ zZ~+~GpXwaoHq}`T<7#&CkyBky?)7imu~H-J9hdse0-cDtV4|D|YVVL$G7z4XrU+Lf zu({;qPm(r=Fv)YH6UB1}o8Z+n1h5&3xr@_aCdT1qv1yYP5j(STy_myJlDXIKb)>q( zIoT_yWnhTP5yYJaA3uj<=pi{a`lCFRD4raWoVpVwk=S?D12**v;(h{O^hZK7bwZmX z7BL>PfiTM!D^{Ew8n+50PPB4~-TRU=jFJ$LSB~yQ< zW@$i5$*Mxo_g;ws;5IA9EBD*hi@ua7<0Vbr=Qw1l$OT#uw@Gt zirp5*?3p+gIceprr>CzX`db$+Nc z7B$_tRCHHNH3>=8pf>?|&Cf~)SnGMuaB>_|&v7M2v5bT#>ugJiCv7ms8k^r&RCU`x z(lr8kB0LYa(*8+~K9@gH{^3BIqUF8c%#E6$b%XTeHs}wG>i>XR2`rK5A)M`47gjQ( z!f9Al-tSKFU?R&mr%c(Mu=7gz7vsd!MzIjvo#hMeQ4r3WncJZLjNL}%fQga2*@wn~ zhl?#Q_ZnFUDA}&w^-p-T4Dp;83(?mx!c(cvii~d${c@+vaTI6Fu*+lQP$g*ozIlC zT;LvK>>eLC&&X&ae02B8BxZ^R*BT3fKAAj;Y08Qvlyo%e?@aIiHt+C}-|}QC=;5U@ zbM)@rtFCU@lTFhui--u`C#VG6l0S-LIc6^3N(Lxh&k2UDK~L?8=-s4C1yRCG z_X&$8k{Efzy~Xjmk>l^1+tqFr-9&G!2Y%CU2otHGZ>2P3Z3x6f{k+pa!Tz>V`8;4L zJl)ws>1OE}BC6*@rouVZ@()R_v77f>&S6i(RI}=cXf3|TNE^qBKZHlK%fc0Ga=krY-uH=b^6=P^&Nit# zub+wSPnt5-5%{r%>0O6X=iMZE#UbUfCkzs!=I1wlO*rsAOwW&EUpSreMPM!$xO(Pt zPVoouiVVyg#dFdH=2eJ!g`Md%dwS)({oYwlizWS?T}?ssm?DC zI_dG2N~@B8fCwlmVM9J2<)J!NHPioExym!z^>i^FW;tt5u^8gx6@ z8O|or{37JPyx7s#HNI47 zYKw_Ahyw%CkyC{xO5uHdCGo{&X=M@)wIXTv>>RgmPsoXx5Sa0RF&9`AcH9$wC$e}Y zHJS0vt(Q*USRE(WM`|xSAS3Wl4bDp>6y9cn1On-`$N4&JEo4*>MQAS2!GW@gGP8Hwaio5G zgo(kjqAxfamMZb~wdYo$GNAds(ZB9+8i1{93NBvNyHv9ZMg$LS6Xt z+5BgU8Gru}C##GEfc$vX8swr5cnBg8& zv`_rgCllAE0i|-Z5YCsOxk@w&IPa^&sgY9>-%)lye8|=KfjqR7HI&6NWP5WCG=_yd zu|}1=rAWT_8tBS?xQ#9;C~G>KfSEQ?&Sh#)Nw=!^un!z(sKpmIR&|%`Vp&E6X3kb`>vk_6C>eR$BK;(9yI%=0YsFts77X;H0#WtA{6YC& zYvg}d4nc{7OK#DWjA4qX+Zq}j{PfA(bp4|U6WKKgu1XjR;qm$faOBZVVVFS^>O9tx29LOSCh*4t?$1l@1bb(Bg%NV??M?kRj-h$0GUCaXPI%n^o znmwcbGa#*xO{E{qppI?tINU{7DJ^_=Lz7N5jXZLk2>)uLEWum_!Pc5%z%EA!vcDf; zo*r9id^PrZIw)wdVN<5S{$tVTNGPN)n!5$V3hedEFJ>EQG9jzL-G?KKNA^B>Ks>-t z=}Ct;BK?aB6}$X;)HiqSsmBY5n1^t8!I-2;nZ_(Z?kQf0OCulM?>tbOeymWb@ZrUf zLhmbBflZRu`?ewC?h?jKNXhY4HErDVN zTo2fiD_`U*z)_=#q&YdjpL^y3%VI>&Avtc?=(^!EAD?jDx_pW`9Lu+wPY9A;ySkb_ ziM%{bym4bta@V?VPXG)%$SYV`cECvBoEU9iOYv@5&b?|7p}e21Bd{Dj2e?@4e=wqJ zoGv4kuq1oTX6!2n|A~gs>TgJDHGh7uV&WBU3o*5_^B|QEz5r(xiyx8Mrz3-u zuSBc*?rrAp>}^&VRS1P<@Zi?esu$2J&4fNO$>boz$mf#6E;e0UvW%)C&FZVj;h)5Z zsHa4<+4Xpp-#c|GoMg=3N3}P7+HrGyLz|S7NRrV{N37Gs#KCAebeD;fJ@Xys0 z{jCMgUt=2Rcf_L?Ei2uDQ>_MtC)q2&h~`Ra^HE&F8stbPJj~vRX79GR;b&z07OOBx ziKeLs=8on+{(O61jLHSoJ>;2#z*V||KZ2A?q$3cuq^N3%a?g>5gQdeM!%f%D&~WB3 zfhicMpl?q*OBOQJ>SVbJFB%F*rhbarZ!f^4N(yt2fryR;SN$(rk0-W*;TC+;RhJbI zOP8g<41>ZrM*3kC9?Y-O_2Vg+Am8W+v|tOUGIa$?Gor7tBh-S(6;7|Iq&18XBC?8BV~uQJ z&t-Ogo*oWG+z;uFkA=SwvIHGKEodJxi9;IHHHaLp(lBnsuBQ%_#2X%pEbf`qE0Z31 z!RfXtmpMG<-vZ3lLFZIoPHWc4>$0vpaeDgv{r4+xcHSpVm z>yo0R=m;zkxLaEJ76<{t;C^7JVBQIzLe#qaP{jit#5>&re%xk(VbJ;`QGXes6A1r% z7xCZ6g89d~iE#BD!|Z^@6+kp`roKW2m9P`f;SCf>#?VzWSvTHO_%=c#w5 zzsvXZk}CG$>1z!F_bgOFmAHdYYd~;MyyLQN-spl_BSxq+s{E-#+~I-#0p$xPf(b8^ zm~0vmb&L11TGEul#WD@kA+|S5n3s;%!^yL&XbVy}E5@Oz;mf&RUBm5uboV9MPYwzfQXX72{UQQ! zx{2GW;=dMU?rO551szpi;6&M`qNw4E6f#6zgue zudqGk(WTIWeo(mmsV_wB165!QPK}q1Iyi`RuO$dqiXJR{Hf)qOd}}su*x_Zy{L?Mz zr_^ANZX|fX#tCj<;8eiCOe98C3I_Y$ojKUg4|=-ghR}5Tw1FHvQ(r9y3eAW7NwQo4 zPcX|S#Nc4Tk{|kYrqAC|^w&Bd_dWNsG!X@2^GyPGJue3ha$k($SXv?^@>WuWx@l=17!)z0swIll;dUab+`dc?OT5QEo}9bW}Q~KC*^^plCs6I z=gqR|N7NF3?}QJ!h%Sd)*HgrCdQZHiDel$pdNk?t+eh=?A2pG6vx37rlT4J3{=q*Z zlzb;vIxzKEcqZm%CE~df#=iH$k-7KGEw#hwK#*V&O9^`UGK8V z1HBoiHN1m2|3>Tlt+87FYV@9sLy@E6VN&VP&+>om8UMk1?*IJx`3Ao|`MRP(B~@is zPw{d}*ET{I8z;iWDcc9=@6`FS1v_lf%o!+|FR@XNk6%G^5ddC`{bS?hzw~F3OC;(4sFo?yK#0ynlqZlItBn}*F#!j~uFe=fmu~+t9hr1P zN8qDdnA=PH#_(LH`amDU=va?S;t9D=&L~O%7N}lB^?pWlgysoOld?wFvWBOEm(5F; zqh5EyVU{&gCNetl-WE)uEb090nf}m}JClHr*PeW2l9zVal)Djf{9_e?O|C;oPLdUcj{RQlS6%Ni|=+kLa_j^FeQ+= zjcE~uQ#l{#vV|S@d)Jj4!@hx{ALvivJ-A!I)>$xshhNO%z?{j;-s| z%70bs;RbtoTtkbxoGnh^%WJc6fNMc#ECFGHFeLwwiPDSYf+>4`65_UwrdR#(?s=7^ z3suD*t@6KM7WTycmNYNE3x@oS{fyD!)Rz$P6nBKt^yKBuQ$zM%tfga!+|;)Y;Ds|m zpZ>L@Q9DYbfKa!GB2lTOo6mP)dG^uyeHEPQGrS+HMksKzz-MRfakkqF?}&Q�D2J z``JCULXS}eeo8H_ogqh8zmIGd=<#)`Sl#%cJ)mh9>_!&r78~xPlRAJ_G!occxX((3 zAUUL=0=v0k|D{cU?_xvslV|IZr79U7XFc-}?LLQxfoY$Au&=K`BwQ^j# zr+O>aYu4U;_waT3V#M|5fkIn3wP4zslP$)xXs{Pb3crvuGdvcV^6j;X*#$rUt4S?^ zTjew)3k91M?|!5ab#}oHodNH3E$Eqm6wFU19 zNWm6~F-SSwW&!f64xt%^SlzX*?=SXoe|1j(Bo9O} ztugC|n&B!h6ilP*h)6~e-|E|qHOSeU3vkjtj-?rzj2I5Cp%ghk2@gcxns}GiAkTX) zr9<%9fVUidDd#9b?gw%u!|tGcjzGJ$nbo3^C}EF6ti6w(LuvO)n75kSO;&f%u-S{N z7T<8d58P{FRk> zr0NY`nOn;`jW9Xv`dXxKd`?jn6P3i$aJUaWZl;dhgs&$a3d|PPB={BF=)opqIv1`l z$a$v9SJjmEtjzK@PV{JvK7uLclxe=PX-->*MC+#&e9vQE z_@_gw!~e;o9dQ}JslP`CldeJK@4z^Dvp_etc(#@5-6a)k{xHiG_>(2gSBrts<-R+6o2F9SHQJE+}#@Fx(>otrqz5Si zE9;1;+u4X{{wAC;ql|u>IY~>4M;)|N!fOkA)gS39KGdQx*MC>AeGS^BC>ee%g|vi2DxEY_~^G=MF&j%uHTwV)m5c)a(`UU-oQOHkq=`%;pJEF zaNu5yT!~kp_KUSi*rvw(u_eAzm7P9rt(U=5bBtK)sXp*}i!RmDHJV&d{j~7GiMl z-?3-9&-F0$Xh^z54j0Kj&6u_BTJC_$t`KBqN}sHzwqJa2u1d6$^PSACg2Hz&{aD#- z8x9&9ZOO2RA2?MK#?!JMG0@CUJ%{^{(Yh(|kwH?zy1bK_Uu@wj)Pj+viOczKN+W5l z+FRHn-{(4lg_+LDEY%P3<^gizL#o%;i!ICP2)Ke(y0YL}C%-0n_gmW6Npc==hx=wZ zUiSUB`&0EkACviXxA3CE9m(u#hPLphxXZk3ygXO9XKtPw_|h>W-{$ifd7sE4$8o23 zGb-_fhg-us;cARBRwLVnY2CFEXH%K#A-ZUZ(MI$=`#Q-0IRf>>*(_JOiJW}F9G#=d9{+A0!8*^5nOG2Guh#1& zIXXB^{e0@!w%eS5ecy0zK27E3=nCKqxg>&h9W8c+^h51N0^D<4rK;z=gvB1}eRY-Z zy9H#|17_GKQgQCwSB4PzG~;^>nBY)^m#zI2vE5gAg|Ncz;$?Jo`PM?YxsOU7us*&X z7h>iN)FR0yyHNH3DRR7!Jj1cW3 z&k*0XC}v&TO8_)K^hg1jzk?mdK>>E&W>Olas;?mbdPEph{jS>%A798Xf{je`V`lcnzs_}?a*^#aiQTPM#Z_L z;pK-aUA|lD5&}2R>e?B<0)7h z_ar9-x0%7J$n!`)mNKcmlT#R`k9#8hbk^`&9hU1Ana@5k%3ls|7Kes+ z!REc7A0*a1JCddi$89fSP;Ql|7xP@2%BxBvw)E~fWBD}YX7i~8(^{oNmx%_*7}C3r zS~_gPc&=KU@tx&zr}EH?$HxX-qJm}OgGEB_%>QV;^xA*qjxGE(zMUY+wPU)nu5=oC zU+h1LeLDHON3e^G^g@X2$isuU5i6KJNDH{yw|4yQgOt*&+8-nj#3t;CDaVdO(?QM( zp4F{ao}Ama{ajz1)M%>yf(bHP{zkR5jGFZ(1=ZZhcnX%1p%>S&WzUPYmcB0V&nX+hCDFswj4rU|H{u#*o z`)F{UcfzjL_B*RZ*QSN?-q?@T2x;t8`+U{hT%Y_KkSpIvpF830%G*`y(Tw9A;$HR-7xTGRRJr^s zV;>N^Cw!E-@(@@Q5R|Wo^}Cs_7kTl#-^#+~=~7k_K`KeD?FRjWtq`0pL**Rm7)G$X z7_5(ON}tuQxu(mVy;fu)tg`jz{s^|M-~xNsvFIEx7FxuoL{#>20!GfhuJ*2C)8`v$ zQx@xOg$B5rHEen&cp0~@4%N#KdE5I9)nzN6LBjlUH$%8!_Q^b)X*v5W4YLks!RU`+ z!s}Sf@u^|witUw#u@8uTWA2~zzkfUJS1*?>ezplMUFk53E5&_*<-fUR|}% z*{@AWGMntiKZ?BBMi_r_%s@4KBNU#Z7_-NF&lNdGp%aH9x`|5vzUTVyJ=j;v3%IGq z2!72f`loF6#x+QuU17zLiPXi&dB46oj8F0%IJf}nzYD$a&VtAD3lDK$>+MnjB+Sik=p3Zr9@4RW`b4XfoGILp= z316F4lvqbl@Nm{*A{z?C&apGj_Ha#ub2U?6%YKNeh20CP`(gVT?=#p21%k7OGk%WS z#H-MCiF6S={f4Vf(-wbxf@2xkYU+M1dyCu2)dR^j^hU5*WrEzrem1eAEC#=qokq?o z(x!`L!kL+0qZRJ?J~-dgmy0ldek6CR1PVQbPJBUz8xdbw;0tvZ(pBim;_A1Eu^KayWk_4tls zWbFDKu1+=g!ji$h_jfj#DNd$Z)FULgCZxbqU2jw~_fi_Q_Q_9HpNoZ-v3!bG<*F+ht|(9H2q5WYRJx2kyNDr4IoXr_Sjz~bdLr5+_-Xdl++JU~MhK8KZ${eLYu9(c zMl~zFHOuZS7m7wgO=8)bj15JgZcyxRW=A(6w-_Oq2&zSci|`OY^hzS)d|)njje`5z zT2YNVPk))bRsdZ09`vHL*m0)d3&E1SkwZO}J-Tv!)nqC~dTL-c&~IapKQVeWDI)W` z(K1-J*zxy6Q-lb&Nnc!gL80I7$AdcI5)2sMs*S`8$E-nM|DrXkgi^1mK||1!7-?qA zzy=08%(3Td$%n;n9+6GtJwB^q;d5e%zd?PxVzhffgo`L&q?L&V+bqikg6xdC;Df93 zPW+TjrT460M3wLlOTqy8SBvPdhkh2-RPXrEikIs2p;g3faL;iPi~@T`Q#9?z z+lh?EvRq8h^MsAekQ!L@mH4Wo5H^@@#!=;}_Fi|{%)QoqhEvZs=y@9MWqeub@a2>K zn@05x&vg;~@9YNhAv2Ws0}bF<*|IlMkqX#C8O~YT!ZRO|Y_~p)Rz45A@#r#97jHC$ z7Bj*yD(pJ(d%e!22S@q2N;r-?ets7hr1m8+hbP2r63DTJV$u?2c5#NOr!x;pq@(~RB z*QsvvMP{A7^q738ID50e6q0d_CuLR4%h;0}fw^(1SNG8O^6-cQNS(w7tCI;~Afs`m zNcBH;qoSE=CyINr6TT5-#t$#vQm8C(EeV)1-Uaa5s>2IvWjjrfhA|UbH^MG3bWuuR4Mp%PuWjXRE67ML$ttPWmu~DOsmbl3 zME?e@xC|j_@OqN0hx3jeqiu{9K62L3{1uZOZFcd^_DWy7`nRx%*&8Oxoc~~Ug0~>o zlfH2HIslH^3Ge_j9f6f92nRS}g5ssA19e&AT>DvmWH$R#lS3IgP~x#UhPUVeqo6d| ziPk-+jo5;QG?`tcE`u^BVuXKKVrA7(U!%X9D7$b3JO;|qb7jM{em;@?4Dzmfk zU=o3K=yjZ!q_xI3y+ec#3aA%E;{}#0Gq*lViL2DLQV?0K6b?Ilr^T!Mf8F`J}y7lTl_ja}*)14knEWvpwFj(VF@*x8 zI46J)CYqGfDZPe!-7efUZ3eAW94(7}V1f`88s{M_*i`mLP14?euc*YFQv20#q8fn5 zl@P2B#%THdGs^oI$6iyH9}stX8hy1T#N0TgzY3C2XQ*$^g*WF+UwH=mJJ~yC-;;ZK z{?kn8CJ$J91}mB!E>uA?UdNr0K7naq_vmTWttGUU`@ zHYboRt~|mT?3pN!H?n55p6RAPH~OvYusJ#JO#A^LjZ-lVCcfW_Ci zr_#O;6H}d@-`U%=7l3$8phB9aZggNpbXV^lIXBb#{M>VERgBoh3Hsq&5mgP4ZbONv zJWQPO2B6sIy>NTg-k9DI{Vcw%F{iEAW>4%J0cE>u(T@VXpg#6VTB0zPTw6N4aPzu* z_wvh2Nv@^d*ooaW)P&}iEui{q-U`1pT3wX8+H1!tmq z1-?tWlvbxG^_n$gZ7d1bYIj{6)vURnG_xh?09zjV39sX;cUHPTbzn!=hu#WK)w8~z zbVzw3Av_jmVPm z8@W!SN2$p5v&yPP#n+N4jSuo`m3}L2YW{h{L@BEdndrQUU7hSOeZ1qs%Mq;~Z{BXu zEaNoSMD#X7HRhiQ9Z*XC}Y_2I&l3c%P6?P#<_fC-X zi|Ym!DaRi)n?fsaP%SP`2$(?U#i4A$|J=i??{t=LtsD(D?ZUEnVz%%LuRK!?`!fQc zd!@GcyN8L6bco)0lk{%eeIC%(SnNxiJIRFCB7&cC<#>6Orza@FW1kk|W#+7cG|L{n zuT>A+m-xF@IA~ZGY7s+|wMbZ{CV|RRwyttsuusbE4>Y!EC^NkCW^a?(9oO}D2!_z2 zKW7WOqc*+tDSkb^8?}Rhh+c7sF3&nDZ51YV?7QZd)Ibndw}(%`daKv*+cUSYr959b z*?A48-8Ql)_@t#9AABnLb9rSlVBUx%w087%!bK-LhTvyEF!{MmwFyE~yf-!Vb%D}w zrF81+VE14(?((8tCw#R9WI)3OBBkh91jBymH1pUKn$O9`@%;nMhPk(O%|G`DG#_z% z97Dec-rBkjDa;L^QtmjbvEyIk&iAdv!yWJJNQ-i}!?(S-i(htoaf$oP9-{Gg@mtEO zRoF59OmC`8<6~E9S!|%}5&1`~gRKF6xMxr9NxKPFEiK$xGEtzcBVBfqnV8Ri#U8L{ zI=`GmD|lyXJ)vzpm8g67x@C`AtIL(-g;?k_yOE=zmuM6QZ!CzSNUji~@w(Rjp8hXA z8E=?Qb%uL7?^WEMUM-}XNaKb1t*M}bwhL$KHQ^2ZSaqo~M;5i@&%{c#MDs)HH>sNE z&Jch!BdIvCR-+?v4MLoyenDx<3%(g(I5}IhRIa(l9&CwLzUVVHn+(KHth$Pub)2@7 zElSBLu6|1I&%1s-Dxwcy)6bRej2&DD=0Yt=!6H`h726u~q0rE8uq-2MU!3n!aQuS~ zn`l%qM3Tb`q8kfjamGx0cDAQ$O?lDGWtiLd@Sae@FdJu{B77&`bg&hk-|wpCI9@Ou)Ix8HArdv(}))*&Fai-1UqC za)+41R5|_Yd|KXg+PWpHzB!~@Uu4bHRJh@#V6qpq=yZss!L*3ct=c_1IY1Ysp>Gds zMH@N}PW9MpKCbvJ`l~0a;-Mw^B!-O+5Pfr_wSll36jrtyV<=J{>PG{X`A! zHMSC<7$oAwP@9;pP7XQ;H2Wd}#`p342bT&}pM>gXRS@Aww;p2jVD~A#uOseRnvFdES>BkhU4a5WO!D&_Qh#fz zuSF=txW$XCboYPW$XK-lVaP3v@ooDiEY{)aZ=J9tQO5<<+$&eeFLuGErmAJJ+mX>O zj8_*rvoT_Eh`Fwd@YXLrO{l7+0RRuRt8+xL-5tLXqRY?Hk4|c!qa_b$b5&Y>qfQea zJ&^t$bU3K#GhirnmLuxGj9Za?Icq~PeVqg~^1U~_h>-C)K1#N5=G=qHX5Wm9udfF?U~M)F=I0+Vz#9z`ZEysBL0PFg~?Xd)T+UFL%>I_=B3Lj*8FW zgF{u!gsf2FE`A4LUDm{z6q@EfuB|SKPWK9T)PK)GCx4T~0YQwxj`2w_D}&c#hFC}e z0C~{d?<`avNiQjD@SY6bapV1BiU1>`SpPM`MU2>q1l*BnFCZZ-y?y_Hjxw%v8i;Ni>IHL4y7>U^1vt6`6XOE z$zZzB-$V)Cv=Cjb!OofxEfB^YpqW3L@HrOpEJ^pVk>%x>Q;+f%zr?>IjBkc`1gcit zWY(?kR7`{Q#}bZr-1?%*%DXA)o|_Srb=F&OcfP9uNvjQhgNbDMrZmq9ggn0|Q+)uX zWY?U5LtWV(<$1v@CCcGl<6}dyEk7?3QO~=s`{>mVAI*$>W^du`dO^ftq%J}vDX#{` z$VOLr<;5uP_NhK>*!)P3|;FW{ZFO&?`J|>JZE;`)%ar~x*2)qOe zhcmLMev$Z%SeavN!o<{NphS7Xtex{U-P|BVsiH_317xlVNJ7hH1_tbt4ik-?|IEVs zE89E*-zdew+$78v!oUNdc;8Rd_Z$3Pn{NJ?vA~z?@l==zeZHu2tVa6WUFva+E!ZPe z3iIpvTDM8Ll_nr!*%9r$smloT(%NQSZ!Sh{E{%T_DVOx= z=4bLp)jyEDwCL-t7;*fNUQp-}Yrpl=8pR%apM|cg5g+Xo>==H1EUVT7pI>@j%3|G=oqo`N8+0XPZ+~0=`Fw=2YaN#xV>c`uykLg9gk0~1c!fIt^2OL zEU=sviQDl6d+2ZpgB6)u@8j()Ym!Iw)&H9K(%1@=QQzr1s3Yh|(&oy2Otrc~t<2Rj zfww0lO6-qb_%PwWqz=UW;jD^s84~PiHLcfIF2$aI{?e?%K-HC^ zBhbWeblzD_Vx$&O<64t-LTv^Qk_|)^#7$5S0gUhdf-TZPL(^?&NW@G|`-8M4r?G}N zCMm8>nl4)maD@f5l+vD@tSx0)`UM_PhD=mGfrMg7A z75{M9bl%@Y4q13BQM<0-yyTO~lqtxb?4#^((skLx)&_CNCFsW4wYbCcWQyH%;$RfPA5U zq-LiSP>av{l>mNa!GGvdKu{@kX4nUDJXYiOZ}e!l8E0Roqub)3u_~JEd1D>xf`r=0^O%4`H(BWg|c|` zdcjXRnjZ-kl;|&4xiUbhvICInI^o@+XztBDgxO(j-g;a3XIn7jnzjPcgqS}B?q(^) zXCnwyUH0)ec1NW-8T$MYKk}hxU-%ER5os$0aly*ld0E^;jQ;k3o%yjV)jft(y|#q4J7)LJhRuc&YKuc&tkNd1JvU~ z+?F;RZ8yA3G$ai-4bAb_+1p$0WjLK{qMSZ~0LFc-ET4gV-Gzuu<%2yMRVk#Qov>Hs zikpr?daM-YmbB<85XIQM&AC zTD-}io#T&v_NH6c`zqXgYq}xZHM=Dnaf%r{$7HzFRKo@WU;BwQ_-bC+ap_~_hkF+b z${=D}vEpQQwg{!rotrF5;%sQ)=D{8^%ea|@XwvLs5V4O+YZTMoK6A;;B=dmR zB3?^D`!Nk!g0Mt77|h^zfC+-P%j?r~t}DaHwja^lJq3b<&Z`7U41t}F%0K%qJSchz zFNUVNVKw*>5qvJt4QuFH@v4fLEk4##tU5&SL}WTgG$C;ho+4*L7XWyCMeBbWR z|459_eLr_O_kGT}&UICqHUI1_?hb(9ik~kzp`t#;3IHi9rP2ID>f!+ctohe_{F;wn z>+0A3_+_vDYrESWjaLCwYyyKShripgD#h{(?N9xiB?Xj#e%bzCXV|Z^_}87{*B$TI zT@`niwLesbTD0tf>$HrFi9EOX4^ZR3-N*&)d^vIVj5}_O-#zvGN}Gn*`7OkG;lfPigyMk;lxoBf1fpagyL6s6Fd3zP9 zdAL5kFle5p{;ER@X7dMlY>4sTLbxc-^BG#&%Uh*{FEe^(%QWpSbJ-n39U#cuLl~F? z!!@y{^-^##&+O*2c&B0LVV9}ct<4~;-lrI( z8OBhu1%$R3dY2Q=q6RlGUM3rpo1`QfUt@5nEdVrdL(k*!wddu5Rhym_>3BcGgwjd^^+IbfR zaE5bC2X7Cgt&P9FnlS%*;VfwiFut#nmT&Sa*W-p6o{g-#+6Kry*O&EVT_PA3IkWCbMN zNXHiaVNCV4@E9JN*qHQt-!{_xKPrGMZP`I*g);n#Y3$gUt%Q&ap#X==%5n~p@qwj? z_g4XOFmq}+_yhhPrU(_}a_>vQt@Aty$?I*V$ieji8^!ykXkuBz7iLwmB zb76B7c10z{ThAilNjD-{#N_nvy$Q0oda~>%+0#S~e~1gfsOezlB8n=yGBvaTFP zkd|W~{hbBa|D!3T!54q$TZ3;bHibi|8kyVa)9ztS(-JI~@4Xd{`E)?j!TjZ@gI8HA z6&iGfX?hr($cfdZhwUMp>h3k+Z2Kps2w^;k`C=g16)}d=DZ)2JFC&UPW$^?cK?;B= zzl7jLRyMbQj1+?`Mjud@?yx$^f_=vaoY{8$0IeJm)C35>$)ZbSEnz3zKmpCGx;cW7 z(kL%NUfga9nB!j~TFrd>=JquK#$FQlCj1Lzz8=B+i|klEihw{Y z0pQLhc>>Gcp&LN88-~L10)#q?!aiEnyM+6M%B3Hmz0)6{8$d?lIs`M0Dz84H*8%k6 zOm}{Om^0Snn-X`a4@$TIfau)u?WW^P00Be&S!&bjha3Xg4g%K;`8hmqevQtr(fPG@ ze(kLPPwh@vQ|0*P_9i`C0m(UU`LKa_Z}*ROIrvivH)8h>R_>T>4XYo5S3qko$WpD3 z)h48^nsQaWk*EScj0*X-%ge8r)qNzLY>=)!9 zS-(V`?476P{AdABnNzfC;g{cy*Z*%98=MmX&IaE&qJJQ{(SLn4nD9lXpOgJ069-!V zKg?SEXVM-LP5_psk#S?(sDM>+f<=Xo(WdT7OltXli5SD92l}Q^XClLqfQVXlq)CX! zAM_%)H{{rYfjj$Eoa}Tuxz4|*Mk7McvB_M;TMxMEVLDs;iMsM8)-R_hzGrwhRKY(D zNm6g;s6xvzB3_^ZjZm#niWzfU61{EhNTX|aFvU}|F9r@!=P00>Ddtb`6Dixnk^zx^ zTKFxXWbQ;^Im^wJ+tY5Kgdq5btA1?M@DKa|AU7r?w1V5BJ_J`y`n+tQ1&JgV>P ziAMs$7TfQOF?*t5&2RIg^YkeZt_Ar1=WO7iDw#~9zhz79?Oeh`YX@a+Ss|#kRl*Eh zJ-$XdJ-?Q*@!90@exZea!iS)0i6{3}!wY=E%^6Y_p00_SV+!TOnrzG~utaD5h=XZg zli`AX*bGoOTzppCX<@x`mH??l6z`6I1uE|Q)g{IX>>je8&<7qK8$L*nvYdXq)W?{%}iO6J(9&mm)cg-d7Srxq;0DD!nUAv zdsSCP7~gd90$Gett-kcj2a$2?IWJgAzkBK$u}?kY=(T{|4!Mox5Io?d7}vVT9+BqH zlqQ6Ikur~@G{dFnayDDC&-?9hAjptTHkKmlQeTJS#q?}0VC}ft%qzx``#(Uqhf+c} z!!y>LzHhzEiB#(g$R_7t_fg|>%G1xS$@n0dMR9|%OR~xxLQ1%8iaQY47ofFX%fW>! z`6N1UUo){}jbndzz+7ZC=E|Q{d#4RO%Bo6*wR9}TWwfR-`I&fxn3fJ_JXTFf8oP@l zta9<;^oHI&!wRL*f7eFqOQAkDF&Eb(u*pZi4T_v2uvV8nBV&s5EaMltsXT+cpS+x7 zI8tCyI-yUIJD?SFgnU_?;fIDJumR2N;Gv!5l{QhWbq&QHwz#{6vCNL2dG6|?O!Rbl zA0*Fde~4nq(krasfuF~^)h!}IKH>t}^ikIJ3EOC~P2Cn=d_fS%;ntJob@^n4r)wSY zW(J#Hd@r4XKrcL!=S=GcV0QI_2!^OUPLIk@@x+<1=&tjZJo=xhs#I=on_SU}O&-9a z&UsWXjD~bXV>UW{Z&!|9QzNZ?0<)yIQPI$kk2H=L=Mx{%^}M<5uA8GUa9FYUY}U4L z@715oVx%&PJ`9lQVf%=*KL@b48RM9n{0fsotOSs;o3s8|0d4)PrW72q(w z*dx?Xub3FjM6X+o@sBWAv`+RIRE%KyToXZ4HwAzr`5*pXlWO=x3sTZ}0IT z0N^!BV&yE*UUvVP{(wAMX>VKTY$2xr|JA7c?O%QDNe#5c1(8G*VeVqIQT>1PX#={((tIaD)Md3;;L!o?%?Hj=czqS7J zXH?ecrM0fX#4r7?9Y*%92n$8<46fanNNOrQ^4k|6TT33_62h{OurLNLx(+SGAv$Na z?})AxQxmgwEru07oKDVSn@FU5yoN?gP0=@ev0Ls3;Sv|mY!?ub2j;9BL)*0@Io9W> z>*x_JVUnObyxH#kX#xoQFwQNtiQ$_IwmV^7 zlT*2I)G^=kbnU%;W@RT!gf6ApAQLw;_WK~IS5U;Nx?`1Du;^W`Ee^~&G-!^wUJY%2 zyQplYviH4g`}q(j)L5MrbW-~v?%m#b4AV)Rm)XW(+7Hkvtp`d2qu<;gF2g^>QEj_* z^TIYC9(RdW)Ojyo@*W9H;4&R;SG;-iCq%^Zo`)}=Q+vR$= z&91|$43CTILG@Q6DD;@%QoN=;HCrnahrHY_*65+~Ft37lod9Ti@+x5@jTaFx$Lb65 zfN2HjS0-+bA0{Y@Z)IvWckxBl(?mRLFg1eco9s_?#ao(B9W-Vjvo2?*CL3h{;bC@W zb_#4`4O;ijms->Ps_xD_-KV4o3VoLw{R|vvY@AHN>r}{hJ0=E8?!RJh>4~zUxGt=-oG1!Y>dFRD8_sznf=N)ZFMj?kwXQmNG6UIwv_WU)kLfL! zNk5c-9~^&dKQ}E)plymoP~d@x7X?t>kBK$0$t}p4p1b^vRZQh>TN=Cu)g9ce!TVrSaPC(IQ9J6yjwsR0}-ZZjYVG*-E7@a_Jey>uE;VQdeg|1GJk>kqp z^+;8Qtj*)wE)ZHNg#{EXoN`#^nuoJ)}z z#up2Y^yPr-V}bCYzYNO;$8SR}0aZtu_xH+)U){fQFb`6yDHd0EeSv;7!7&uXW8h_z zrR#P=4~IU(R?i30cvQgUK4D)V>BFi&n(a;HGd99Vz0xOd4&IE+VYS%I{D&5Cq)%zqQvv;AF2u@hnzxtA0+Z$(@vHe{+uk< z(G*cD(pbsWW($Np*W7aXwvrj6vuZ5XcS5u#WZS;_1U*p~vE|(}WOKEUr{p&?E;nzT z6~;wlQWhwY{=PSCm5hg6ooM?tV{eSa`l+#dVRT|QZ8F3MQJgcwLa96kVfI-!UevOM zbd-eF?gT9lOEJ&CriIaLl$4P^W_pm+vB`e%WWU3+hpD2iue})5 z;`jJi+bR_E_O|PDbK!4y5as2r-!49F!p$?Vca-UCjf`(FxgDEIOQt3^Lqd<5F6|o^ z*m+IZ9W-1wFQ5Go!5fW#>~_RnSwvR+Vcg|OSbA>Pz0LmH0KaDAEsw-bncEnyVAs>k z1miJTSY6V0B(z%l6^E8OQyPe=*rP8qhg$*QpONHJkGR#5IgY0rDb{YEyGUR(EnAle ziKzTCGs&FB%o#n?&#duvN`J$+(MI^RJkseYFQ2$(yHyiKql8E6!;rRQz}`UR>+8%# zUS16veG2|iR*(*!vM$U}tr!=Ij|$aq9fp?%4VGYxJ7z^?1jc=taXXqw?YcofE0_+v zucrC@yyZAoaxEQ7C`TsnX`c3yu64mp&!$LU_6-NP)4)C>E~Hq+F^{*0^7P@X&xe@K z=az1AY!YEDE_0P?NvXmG3h3z?y;Q2x#rXbEI2g0jn!w^7UTIkue8}rr(%zGKL|o$r z=8{>iEdH*3@uo9c$7VFvQE$_&iH5+z)rtxUUr>rLnN^|CG*(>M`PwaRk7Ijere)GHOfet(v) z`*9z|`2-GEd_Aj?l7gU9^ijmGU>T*8QZG*gp}AUkQjf8P&|Y!KI$P>=Aa! zWz@!)X^sUBTP&f1n+#U;UobaSxv_dr**w|uZTlQ^!7We-`XPMjm;23WJJf?jl>%Nu@ZF6o}WymRA1& zeN+aRXh@u7kC4%;B}cMJTPMYdPm0#YS=96FxhiVquaw5fSxA3cu1(g`vpoNNVH=s; zWCacO1!JU!y8IK7j_lGetJ_m?j~AD3esUCkfBv23`s0m}{H5%j_xn{TK=@?C z{A3<=a-sO3^m~t+VR~$S6ZS<4z1C7)2p8S1UaU@nC9uP)S z0G!9O;qNE-isBn$UoU7Wn}PFg)>yYI)+z6li0icEsX4EaZAq2)$lQQKaE^}eHwauQ zt(Qcz$A(Q(0yvZI+VySPcdi-eWRSiCsAA>mbXD&(20nW( zAjA)(I%A7))QZD}@Vlkic}3G_3FM)2x4_U8aKx^}etw&-%aG{e3{aU2 zm4euLFY>W0J{pZqzO|T4N8==MPm7eOXiZfsa;dP-;|EBN zAq3xsk19ESb)1GZwS4#Q9i4ysbl#Rw0nk6H{uA8_qO!AAx$_7IfD3QrcZPEQt^a?! zp9e-@+zIkxsDm#EiG_|$r1tGur4s!#FZ3Tg%#0$C8_O@b_P>V_|Mw?hmt-TGmK?`r zH#q<>MFvabD+rk^$`Q50AZ@<GUyA{NhXHHHg^xqf0gU10Kt*YK@?r;^cjRQ7 z8lVNvBaj-60o7aEgf2!Hq0SIzT-2R&I`=ppxft{XVx)GYTc2raj??Ng-_ryxo1YEY z0|DtR-!B7?2ssA0jG~V4vz?C*T4e(qd~0$9X2*A5=l%e-xT&Hhiv;lTmk4vHT`f2e zX@5G3BKUDPQKGDE5^1xVGDtlWq<$iQx(T`<_Tp((AKK2 z-*CHjy-%jQqKP0Z7$C98s3%?m~Yb*e!l1IqUbJ2 zxNVuY?qvPs@%PgS``%9(jAVDC^n>+spjgX`^8yoq`pqRNKFftVfiQDQmt5F=Uh4we zUYIL8m5d9`6<^m(EE&}p!f|CD=UaR?tcYb~0i~kazg^m8jkSm+tLbgmT_*Jcps0a%l9Y)-aN_4wHbKQA!6(PsSw@;7rKC= zoP>)F3$NnE(UcP8b|RUL$_Cw^Zl6lBwFa2b^9~1^%WR(3pI-keSee&JmUu%rW^D2u za_a~)3@ASY3VoiV7ikdZJMgfhQyv@RqAK7v$+*nsbe|!c>cg^w@fE2j{&}0+3+ue9 z(`5%jO;1(e0^sJ7aBYvt$=$^V${b=?!#7+WRS|(*ny5DIc4u$p-EGU3;;_#PY1hQ4 zs%AU+>=t%#T$K?$ZYYXI&RJn4r)Fp2r(zuCcC~#x$BqK|ghr(+j#2=p?laAkDIlSK z4>1Wj3_~pj=Ve$M$%cHu07e)t@qvx^ks^hTgIEoSVxGwVGkb%rs<3p7U0s#uai7bc zVGI3Yk2)*Iy6hxE7ogt1iIGBFfr~6ss%gWhj8l{bP0!m>k;>aA$-F#eS!~VkPnoE! zIhZ(mm`xS-^_m#JuD#iumsG)nGoX(3g}|$->e{By)Pb{CWp35@7okU7kK@7}W1!T-J`yk*bPl$QasP!!->Ys~L=z9Bdiw8I5uYna({tq7x@@ zJ&QpYZK)_2LfG^&3m%Q6?P#S6-T6}t_s{Yv+{7~g`7qN`Vy9P2M;7u>c!d~KY@*&X zaxx3Vr{E}@;m*_FJ|72J`Mhm>itx}NwG88g;uKvGZxNl5orG{3Eu5hXL1f+2ax=TT zi4wv|e0bcH>Wr2Rc3pYhaWHIs8nq*dZbRMQLQ`Lc1mU8dQk zbE=PEHhaWn%t2?e0t7Q>}^b$H|~P1Wsk)WYYcA_=&a85{U)Q( z6w3|H4D)?#3zt++F71hUq!-@@K1{EzsvDQ0$uzp-BY*mvDuXZPK{pY;xzN$*Q&!EO z-y=mQZ-Wk8P3HR19DBW_t=)psKz40;Bp5V$S&?7HF_Y)1~z)Sz124ru2kC zF}}c@w>wUdvvl@z?3yBba=4u;Iy`?}@m6PC2adFqIt+0s`>MSdk@Hsl2rw<7*8v=y z{~X=|m&ny>P8O*REsxsKsC#Q{)OphlEZg>N1F1UJU~a)$)CU)#hDnOO?_Tr0h(j-= zaJxci@n(cCjNF{3H1!e1b3-^#0&I*!@l`)OLyV}UcjNcTnSoab~vKBTX=UdDi(j_lF~PFZ9C}#<=vr0lQ&q;q}@|49cInvOR*6*A~nti%(8Q z1DZ1?JheV8fpv)?X|~bc--1uscF$%hxkgUNze0D&Hi1BZ6z9+Pc(g#5CIisve$nTY zon>AF07uTDI|RV+=o>D-J8Bb?pEva&g<#QQgjY5^aEdV`mSf$)ysR!Cf4$=T;+g0Q zARFT{4YMK_fbLh^G=U0`1Ou#>RPq6E==3-yxsLVUUEmma;=#Ydo!lOle5|50EFh z7h7VpY?v5|)`hi3q=37~RhoZsv-*L+f&I7BZt>105y0oq|D(^Z;?%(0$svFjsVGX5 zEmb1;@d_M=9<%-ceP#T5g!tnu1^gTbkW?E1lTQ41|49lqzw-_&N4-aP+TuqIG{6n| z_2)lm9Ei#!=&#;MCt^DXGSDEd|Hn+&-#_L5o1U=ad#Rt^sB$Uhp6+g9>;aHL`Eqc# zcgd^&Fdm7=XL+s^LnifP_jcnz2x|iX?AWbAbe8oDKu_M1Bdd*!y`$+A7z?Oo^!-Pm zkAI^7`L}zj|G)bsQOjQo-v1|K#}6$6F$0YF&rb%3VmIVSfselO9#aG*HfKVM8018- zVD%a%|IW$e-GVmx$#O-T6_jB2KpzWT^tPwTGpG{w zns5c9) z>$PQ-QdIj;IMGfigSx?d$CAe)7a+*l+oSuGMm^deKh;uFj=ozHzDt=A?{Wh=Z{yI_k^FFN zL84;gg|4NlO7@ZZ>Mq+?2|8o;Yx~H}NAB~miylp8xQs;vt<@N~)ySkIdvbQRoxa-r zcFsBB7Zh!esfbQTd&0Ehbgoy+{u~%l_KJ!a57d>{`z4YR5 z^SDaWK2krFbiKPM$#M4%#gzX%!mEZ?QKNt*T50t8w|u5|#f`*tB8>I+L*w0NsuUUT<7L8l9%}Izx%ST{}-W z#pvefT#obilTDf5;O8%9aL$u5%SK-7bny{7b@nJ}ndKRmA`u9}t7X|FeSmb1 z2XAf6QMk@%FW!vAlFlwPyUfT?^BBx3(a{AAKG>2*)ZbE#OVyPLdQkuD{;+p>CN2eS zyu<84r;q82ImDXIwSI5gEB#qK#Cc8$DzC4{@8GDY!^5LXKlcC{Okk?Vg!u0xC~c6i z8)K-KAG$%+gx!0T z!G|)z9*?uB+URZ~6(jX2cw>(tkJjC^)iP!#tRp^}NLNG~H>$p#&LeXYXS%m$+H3vX zQ`1^S)UgSSzkwxgsZ}^AX@k;am%EF6_PD{Q)n6w4i8qO!rvHhdX5f6oku&^}sxD{h zjpxp@vN+~^8+INU8JyjM`6i_k^Z*@qECkW^b4;6mMX8`l*^`!1E|L+Z%HEe>D+rl~ zwL{p<0j=+r8JxeJXZGZ$*iA1lJKAUC7yNu29zj3mX%cpg7!UG=V-E$#ziu>28W^sj zNDfk1nP{2#wlboGHU09LK)kB!Bgu;Q6u+B_dRDjY1j*9Alw!;DNJQ&LEesidgWO%bB`pKMMKa}AGq9vyb=Ars#W3g`; zh;~1~Ox_4ZeFl-(st0JT}rCw;DNg-nVbe#Q9$k+S0CT4RB@VI?YiBbj%o+oFzyxkZCh zo-L;uE0!;`fZz9) zwS%>0Zur)vDbm{APNwr67w+ve$sB~`n4_Hr*5Y6C9mk2_$xf6$0~BJcogY1rpVN3M zZJ9^uGzf#Y_qv6WsAsOmc7ZwQ6WDcDdP&8fu8rn&Y1$5T?6e~S2?AJwa2Mni9JR^E zkE6n$zCMA`$4R9rGBh~8;@QxO%gh1i3$-p>yCC7pFwBO9pcA8{eCAEb6>CQ-@N^dt-8xx!|25>%w3cX5?PgRzI~DPuB(z} z>#YOQ$~Yj5#Bo8_Wu>3)%S&HsycZ_2&Ps+1hk9}ragm1nOOrQCTF=`#NC0(9%_z&j z5beO0M}&w{uNF%xss$Nvd5(IU|KQA0&&RfnB?J#QQ>LP4S2l_9%{(|P;vPKo-E)7z z6alSL71UFPg~~A7);4vpfjh^lFOz4ly?MJFx#TFs?z)uO?bTNdi!8L+ zN0#XuqLjJTjANJ18}i#_1(7=t-+d#r)oXXd^;z;C&5>-#I}go|FM;QUd36K3r4A~9rw<7dL+3lI^KQTos{ zO|Yzg3Ed9ckXr2Z6@v?n%W!&EyzrVPYl5>MQP4F4!r?>{+bIgiAfz!I@eS!>h>e?Be%v<2gH$0OsLwD|INZmy% zcPT~ojFmh#^*yvwi#K&}txu1d*JMITZc~!C&-M8)GY;T;%tuAJgF1;x{jb|3c5FG_ zQ|L}V0C_!u0Rp4#B&;JnmAm>p+nLMkqvc}g>%vb4;OiY+$OB_jp+E>_lQnO+{QDWa&d|8J#cuNR5HS)7 zNJ=;5J47{ZOs20+&uL)w@S6^>JEb9LWUDj>I>FDy`{Ghvny1u8L7pOuH8tFg{Z)0A zidJNFk6B#_{|nDro*$rAW7Ru?XJNAYL&8 zqYOP8lp}2;tfmtK%S?j^7!q#K&jS_ob4`K%^B)rV>-TaH1HvhP&qMy^*8aEt@a60G z7s5p(DKNXjZGE>yn0xeH0g@|t~h&7XMsfl?9^$^0bET(*}^ZtH;%-4S{C|H4eKU?He zYIQdDpw_Dzu6(urG!1=UuA#ZR+B{1^feYfeZmZC&dcZK)iRZv6<>SP(N8qN5(l*lO zZC)j`z3i%r4WBvBshm(}St^DHIK|ezz(qXBkGon#?-g(F81!?P!9sxSj}UI7IT;yL zv_m_jwnTQ*Dac0Z(Q*qg&>N747%6FS;H>ZdcH&UroEHpe>HRUFI7^+?QkDV^+M25y8zB0jc9aVQpxzYDri+*0+WeY zH^-BcaXwXDHgyk!os8F+xu-m#X+>y{dIiz|OU7`1J9`m}2=Y9;;OmwLW?+b4@oQ(} z+3Cf+?xkZ<5uVq72~Yn6^jAnq?Q)Z7fHz}MF<<&{_`~L%wb)4V9 z2g77H-Vj{dBPZCi4eOC+fW2$^iOwfdG6HS>1-bR_Z|l$Vp#RrAg^KofmN`&&BO?i9 zV^SBfVy1(Y-j)$v?l;|)09;U}c+dciJ@e^_KV*4YrJ9{!K0e4)ltS=-V zX;l|UdjMeKZzqmc|HQfdwNZa<)V~I^_#I2|cW+cG%Z@opV4Jc`N!M|k`L zq`Qkc-fcW0JOM!Ws8iV=ph2lB0DT4UU*KwGDvgf=&h)zxE8VAa0N3_i1OWH^0s3th z0Og#^0U}hZKf6Kws~5k<;@7(PwMYJ^+6x}vZgUWat0QK6AYPoP*pdTFg0cE(*+^QB zRmZ>mw4O<`CLRdILA>CZe};9{*kziWc(#W6r@{({#9^IDHO@j4IS*2S=e*NGKKF>K zdp~Ez*lXcQV}`A|=el{ni7917m5K=_{Vq+J!2pqqqKY3@*^iIQ_OdfCT*tRx~#M7~#FCU)o>2@$sDo zY2}|y#yKILTkenZGdN@Yz(pXp=NnEtOSnVpe(V_$w)>D<3kr{@MHW@jI5i!JV4H?hjq3bK8&| zeq!9`5=x7#X4!|cM-R@7dLDkPW=>e&MPCaRT<=@r#ykz;=cl@Zxsa$A-0otrOXt!rDW=%dwGwlpGyl)-b-AX>99x?jg0? z5ezh-t`}T>AZE@15<7_TV7)?)LIDn;UpBI7$sD%chrStnpV0IEDuL9GcF%Os<@EFs z5XILot7;e_Cs(t!)Jd4n?YfZp{iDQ!pMVBfTCB}HWNfk@&r!`TiP<-*+Cn|{(IWXY zv-Uk<2K7<{EI;OV#}x+gV3Zrl7_6LQS(R{mFDg~1)}YGt0>0lOL@FB(vM=Dxb$Q&~ zdNtsU0_dr2nj}Uxn1A6TRv@B6`sOm+Q)ABNPBUi`VZH7gf($enW{?y4B3L0tj3|C& z>5lXTjv|ngQDO%q&`Sh=qF0KAwp8#(0#1b^vE7$va9`)`g6N3Ahbk%`qUd0t z*}>AL(vhv}O~bIqbyZ333c|D(Ib09)wC)2YY^8E83_$@G$Zd>XfW4k&91>X6=(j}_ zOig`F-@T~h@EH(yQbW&$np4%AdrZ0q;(gG)Hd~jz3|LPVGTtR2U=6;#^Bw>z0TmN} zn6UGS`p%scck(IGYnJ>H1*sN*V@IK$oKC88teE%2~DG=BTl=H#%ggUg4Q5UmZ{Um=v@-AO* zWH*%V&b_M=v=_l8!bHCRFZ;XLRCXY6j71S}!XSjjy7}Is>>0)iMCci5TIoQX&JPfs zCFUXe0Z{Hyb2{;^8t&oOT^2QsRF^IBJX_?1AfOPs$Afx#{42k5~EVDD9BOpRzDEq?HXUu{9v(=BjB@_~aU)ua2bxxO z%uf$TfJe5j$06cm(fU^A`#b_?r#8|J>gWSi*=`7?phDn;fst@l$v&IoaFPZ2PL0!@ zWIQ7a2l%=tkudE~K3d4#kU#68Qgz<6%&!jq8o^&{@Yg2!8_kRk673d$_WtJ1MZ$(v z=XMHn#sT#wSJ_%5+mdA~Ai8NKtf4V;@RN_oO zoF&VOwfM=*IxvWUMd;xCK%zri9Jmf`?1zw+=D0g6JW5~W=gjqB?i>(|4E>APS>Vg=LWvi;o}L@AmNuJw5tw#+=xMG&E}pvq4Vkt#WKK|KkcG z;Yl#aE1BzrL0`Th!aW;}t-+bc11>$M0VL&0XY&`yHhm;d2f#2a`Jv6=hpIBH{^u!j zC>1UPnkHWKz50`f-3n6n?k8p@jsXpDy2s+eN=PGvffcO>zMmqw)hBhiTG#4H{4F=#6iI8aMh$!0)ZJ^OlLdc$}k?9tt91^ z97pa**7yE7*$gpA8NB)kKU_p<7F*7GobRPaoQSYb|A#aDOu9 zCpC9S!nla$FBDNj%3y4dUM-lc!2SD{`)hhZ&ObnvK`VYDP$YyBFNT%a?GT_aG@P;V zdR-s;^5I>bTb-O~cfefqM1yc1%-p8@YTZk`%*%|+DFkhCXLxY z50Jnny>(EX2>Nuf=VMJ4geqI*rB74eMk4ZQJBCQ*vc1%cNR-BY{^ z+#iC-dtF7v4Kl98o=`3O$-FpA{{gZ=1f%GDFW?GVs@#094!9Z@C?xbvnGQF0+mA>r zwaMSDW-FrvnV+RsO3Nx>jyBHc#8Z1b%ZLc8vF#LuVfDmk^8>5tGp)f%){Af7ohu{d0*~Y#wS$}yRfk#V zGbMGLGrGZ9qY|k&2A7MSRTF;yM07CM>FY$t&_(8>bTR_vfb2Y~@h+Cah%vAT&g+~X zDoF8={~G`N()qhv`Z6ghy&zlP@sp?wahx|MtW^`GGFWd~P?V4*MWs<$%iVS@ghQGd zEk`dS>H8IO0nUg?(Zss@?Q`P=OFXou&A-_sl-2euUxREgp-?jWMC&p{xY6_;4BZ1< z-D0m9rRb!csCdbXH$Ol@K>BI@SN{bQ6v7*ZS$2&Jm(R*l%k9OvpPG=G3iI)lXi%22M-sHam7n^y*%%Ei3O#VyU(mZIL1>!xC9`F zl`z$Tpx-ygDN8{YnT$2+M~c6@rP1AVdp#w4b5;=9DNH1=IgSMzVqmQ$uL)FGN_=8D z{BCV+aG%Pza*^8iR->VtR3spcvs7Oq57q^sKBvo<2mg35Bouysk@-c9ZTN&~^6a@b z#c1c<$L?1KNRKuX^VZF1uv~2d{$2@LA~T7vDyfAY#<<@eoM`&3YX!8QPECt@mP_b1 zikyq6H$0UywJKY$Z3?w-{F109Jj}_{?rCtJCo|%^UpjSBBc+G!yrO^l46a~4D?2LL zV%PrDr{OGq$m2dHTGi-PIbos&S)xW(ob4fUto{i$d|^AG@!DRc_5RHDp{&xKA0jWu09QJ_?*VRUyf%gxEacBloaEF{?qaL`VxMfX8AYOZd#Cg2 z&n&*R4T4#U4X|_P3~@g|?R?%J4Ck&|*$EVNn+dT;AIrryO&z3DJ!?f(3ba1*Hmn@j z*>e2>qK5i5-<~rXj;zq9@FH>eD!%nj18j(8To?~*WR!{g0lH{B-APsHaEOJ{=0#l( z{ZtY7@tWi6#eN$QdaKD65e)NzQN7Rf$ay%ty?klPX1rE2s#{B)NPk+Lx_GV#^xSt0 zL3=<=>0zugyiaaU+sQX`ko9d;_}g1!&-=%LUkhd2+2|l5Aa80vDP5qo#GoRP{!Knx z6@IC5yMoEHv=!ctg(NBV^p$8iX2_MMrD%^5LUS2H6|{#s4=8)3$^+Glo2V}Xq=?NU zj4WC#%$FMHZHxu`3)gLI6gUl=s9iSggK`d#LL=+BY)^&YikR_;M)rzBUsf#1`dV#O z+zZPG%@p8~XM)s%hPStP+PAE)-!JMYM` z1=V*spLeHubyPwcGDXjPsvC>t!H$D0 zAxIn0>C^sBBgQsVK((1L=6iRqMc!&PZ80_XteU;z{#A?>ac|R8)^KmxiJ^||_26o;b#l}aS_R5)6CG%|HL0Nup0 zQQ~ONU(B~(biW z-Kf0l>>+#L(sU|fpu!2boFT|?!5gijqQ0D1h1oQ>IoXi?{>pY6C5@dLB{pm_Xde=6 zep!kf>wO=nxaBXauEI9OOT7#hFIw7;x%M5p>P;ud=JUtwHse1N8UD|P@ciH1-u2oa zAf#c_Mhb!l)cZdTeMQX@+%uoE#o=0HWNSuocU^|PR+N#_?G(21R!8wz!^p zeuu&;Jo{q|dH9-raYmp3*?W4WI;Jbhps(X9uy0QXN;y->sGw&q^h6s3l7WgM-uXsU z=7iyI33K1z>6*baG@K}tWj}G~#03(Z*m>KQ>^ykBG$?Lf1N_kjwMzlu&x&agt2h0m zSPub6d5mQV;@b;=e(!-WsHwCBA3A&E2dMNFaLzsuCaO6#-Wcnfh7972gV?VV)o&9S~TK`y61FaM&84 zMS-7;qoCvAL%M%yvIhZhmp%fy&0fWr1IYEolE_OaI%5NyS&6|--Nlb}o>!FYJ*k(f zx2MMMacY1Qd?(q-F{nUcb27LxCN17F)1yQkOY-irvq9U(9*3xJ&n4xiL7gjdS9Usf zLM9Py)RV2~<q!h#BBt z@h-?xn@@>Eb|f)XTZh69UNW+Fb;8pshy=nckR6ap{T2_rGi{0@rfcN(*2*aoE+;8!68cfvRZ;V@Gu%&*0h?aF!bJOs4hXe};_3WOs7tDScdyH97tihj?u+bSx*|%l zFPLb6JN5OG(+WsFYZc4naX-h9*ca35rrg1VlwZ$SBf9M5JjT zp$JM9QBV+qB1Hv3X$nYyP(($#G=b1Wk&;ltf)u_r=bZh$@0oLc`#pOfXYUzz{u6&I z&stBr>vdl@cR$mCrVIMnk)l3&D_94ARJdM5kIz*bI>mei0p~uTwV0wH@gZ(^?=lL4 z0+c#sLrvqp&|L~I_g(IriSPcjv7u8zC^`AQL~=qY>>c=Yf9er%A43;3Y4kkPQM7DI zJRV~ddDhUqqxpcE3DzE1D;ckd)>nAU6r>s7DIBohb8kbkLX)VW>Amf$ci3|q0q2hd z9ef{|ZSk%izg!2EX~-B#bFIX&^JPtp(7sZ0!wo{OqHsjGEQ~Y>>e7l2Lq;& z%5!65`^D;!Cc{C;1opba>lN{C#2b}9k80M`h zxns8>RnRA5#W6^l5d*A3_|OZfzT(NLu%=O8Kc5YCQPFe|WlKds4SZ8aUBld<9w^yk zwqzezRs=Z}LcdvfY-$jyIGT6Ox_-eo2Kb6OVnI?WTRI{$br+cunE`Rly zp}l>p$D4dt+YuEw4ORvl#Z>Ldp$TQMvY&iYdu)?GT_J^=&dcWpHiY=50pkTY7r)0i zbDAadC(JcXv8ZhB`a%2NWhKKp-Xl621vi{Ul%sFMqDNh5Z&-!rU1$qmtUb2}U7}ns z_1k%4i+8PSGGFU_Vh-R5TACJmQuhdYqP4^|m(i2|IvxClBb1F(A}x1vq^wwZOSU$7iCL>=%TEeMoB;(HS$zGHxK zwhq2!7Y)mbI0tn-pF%_bo2(nnZtTY-WeMcbPeY;|>gc_;jCtRV5M`WpYJ8#DSv)Ha-Y_vAS+WPDKXUEzjcWQ+3^XYclHK>+c~ z)%Fc?*L=zxG3-rWi#~Y>d{wy@bW2y2?|C{wB;4R7(;YsI3D*_AHWMlkgtcftKkHzg zdN^|S1kdhIL>-^`bIJGH5n=2P;R-67m{;0MO@>BU7^`ku%gz0!i{~frAPo0q-iCc* zlf?w?BV% zK_*G)dyORu2gQ!ISN0S>WOsJpl=97G96pHOkPSaHBsG65I18EkAEtN}681?oM%-FH^Yf0mX z>%$lO&kWwlLK@QA>WG`c-rAEjFsz<=S=SNEJPUW<-33XkrqjzSPzXlXvVXj>My4yL zy+)RKz87co=x&^EKlyyh;iG$Vk42Wg)Yg`DlW6CORq0;`9AYU=In+RFFlL3mvUz85 zRkFnih9D3w(}z;&dVI!EikJi9zSeB7pf(RM$voFf7U|B~7FFd_v?g~rViZA+0&OXi z)O0VnjY6QW|5Pkqj^#BsSmAg1>-|MT$@p%RM_Jlnz=)>ik#X%e&~L&(J?gz0!5~*C zfLK_>Z#Cl78aT!4BjS@Dc)_7Gk}L@mtu?YgcjI4^IX}K)aaUhU+4jqQ4fM2 zc@7+b^kC<*m(ZZEn@YYx-5kc+P%1Dd^sN~EdC}LjiY8*b?nq+6lHJLx{F+{8ye`OM zD;Ef}pSOm!i9!*ksiq+#Juf7t!X$5^?HN7HLp&!=^;DlcF!7+lXnD$r0f z-eV)zb$LGDp&5;{UyTKSgiGCaeZJMf?yxCqvHnHqYAyG<;%~zQJxnaIL@I-Jl`OT9 zn)!Sz*!z6-9?FL^@6U@xVD!1SX|qD4II&qSD%$EcSGwZ1Snj>9F22b@`3 z$wKbN_scY;EfVBR#tKZ~JCfKd0`Zno?s2WN|&>ZN2)WC*W zgmKrI%4#Y-d$cg`Q1?<(zeY+20kM*rK+Mk)*fmJEreSVqm~RSIXZrP4`#thVR%)!d z_3^1292#$*cfg`5=t?lK93#~uH{%?s4ng~{W`z%K+;UJzKd{Y9$7W97O~M)4+2BJ( zGf88T0gR*3V^htTEkV78ox9BnF9&;n9F{xBsPRKMD`VhLI+12HDi?`X4BBG}4@&46 zFA*2}XzusI+-?glQFO*6?=V2CW5@*c+IQhcg}^YzK`^z!NhC(?riaD(o%~_f8#*`f z9)5Dsx5*a@%tcdr$v)t5qQDXf#(&z=`N&D@OG?a}l;;>fKj%etSRxd(51$_^ikI33 zzSK8XO0B0S+h<^A(p#J8a)I}%&o^E1R)>88pOVE?;`R0NgKQf#WBv0yFKWDQFad9` z1J-p?V+3@NW#6~P*jywWH6YiBrG`b6x}W9VwyM*XOphP&E7x=$AfUsjy%G9aqbi&2 zK?S3(T@fZFcfx=DlzmnHwGPPQ;t;PH4Tq*DdUIC<>zok zdzs(33+f&sIr^GT>&30sOk=K7L&*x^KVl$LXf z>IHvQcHS_-07dDoh4=}X63=VA42&6eAD3^0c0Bne7MVVGVPaYC#TpWF=A&crt{K08 zBgbeEvm`QRAeEq@xsn(bb0Jw%qx=!Yj2GZqbZD3M&R zvSgapEE^1X$5LLTO;+ArHm?Ft&Mt3k5l{XseQ@ty0KrAjb3~4MxsM3>&)=9jy`BHU z2l4$bbnjdh6|lOsIUqzc21p$%s<+@BdzS9S&zc-gf9&yMbuA#rmEl&F+w(R!i0z3TDmk(aJ&&Qx_+KkhJi3@z>Hw6!MM&QU{O zAwT5hL8ad`0VEoBCw<9j(1-i|XGE#e>i!j`8w1jVdz z8DTY^45nC)I>wlaNVw^@b7$&O>uAJC4WG@i9j^Z7t`&>#L)}s{8JG4gy~z^rIS3vb zz|@t3NBlc}vd}3&kI=odrZAY)mupKyP{`zdP$1nGY#Fr>8zB#)SdT6glzuzZ&$so< zrbw*ek^U@!s!`I+YA&ePkT_nnBPj0}4S!=OV9$emsh!w0*L!;SeF@O{OC5_2t2Q4m z)U9tLJE2L`g7Q=^UqyP@yQ2{WZs%^)t;l_a^m(-pf3;Q1Pf1BT?AlIB`$HZ{Ybc5- zjE6IAXrzYhG1V*j&axL2ujQrE9rN<;RnNCEo*D{=YBR;#(b}NEeBG5#B$uQ&DIb>4 z4%15n5;ho{oK@RrD7p?HLV3PIu}1b5WTgG@W7PEm;w-PPg8eG*&xeB@(+5SChgPi+ z_Zt~9;5Wl^Vm%vRWmj8d1)&3eQBQnPFwf`xQ9Dn0v%pmqNVrV11wfTipJ-@2AG9cV zq{YYQs)sLMg&&*l;d*a#Y3Jonm;4eC7v#Bo!ts0#kflM6SE=PM2z967Gq9%5)v2*l>{u+St?8bi)!puV$28c1U2kP?Hu81F@u?2yUr`Ax65Nawx8fQYhnkTa% zj^gL*0KOTtg3$|2*kR6WD6a_hXqmN7WN|e^-Wh7t5W#s3XVEw(jdO1}!iFO{Ir@g9 zJ^!&Lhh{#<=KMiT-9I&o?Z5iG|IA%dZvWfJ-Z+Wh@0Ixd-J<}9AdIcM#@?WRBpLTtzvWMkQu?cN z``s1sZ{7|I_%CdWKdf~97n>NDLJ_!}&VE&~ki|Eoz}`>AzcLic{|^Zbhno6%t^+Zu zxSb&H7)f|jxMRBJi|5>wvWD7+Ve{d?Vsfv&d+O`_?W%jc%bwL1O2B7GFb1XPtV4IMIs%wrrDw8-|1HtJ!^gT~F) z{KfsBz6Ep~74LG^KF=0}^^n!IRChO4KUO>@e-0vttzD8%ct}7Qimr`ZS4Z;op&yS~ z_*r%qWRK4IJUg~Ab$ZSa!ZEl7IghE3=f(AtzG1fmE( zd#07&d1z<$*vmd6=h`D9HA{cBMloc-SqQxCX9|+3$qm9}^LF%4K_$MQPY^cE;Gd#2e5IlE2#2r{pTgd($_ZzQ5}Eis{aU1?6pLmTAu8!^xxK*lU#s zwK~7rYHf48q2gRIP>`iEBBP(s4I5&U@f(>}skW3zCq6Jfui5SCvuwYM&gQr82Vdy7 zd1WRDTjJ|7^4Z=7QN2q1Qc_iX!g|{5tD(e2u%GHu1VO2L$ELzt=VnQ+VywJ$qD7|b zuM6!W_}o&gmHUS51ucaK+I#1@3$CAha;t9 z{uQ&39Jl*7O7S19gnz&H{dKoH)ElCiK2@WzS}`mF8svRq7XQ>!w!?;LvCvR}zISFh z3n|x&ae+!*LhI~p8_T+Ag_6go7hhuU_L=IJwR|H0+7J$A7E3j2i^&WijwMElU2AJS z|Lv*AbTjBMdFOaYs53N1$vWVE$(G`iU@E)yq2ndYCv_P3l)8zn?1|si>e0RP2 z(3qZG>76^W^3LH_`b{J2fMPB0JO8E-cX(f@4)l=*=)F)m7v7(yb)2Rg`)u%3m~x(E zy7}kYf{R$?>>%!iAbp6X0GdwtappOi0XwINiTYTkGp}Cdb)s9n;m*5|dlhF7o?f!4 ztDQHLAToEP**Sw1qcDkQSzjzWuCD_rO$2RH1olPS>~@9&2siD%ppSLS1~KH~3_WA> zm7CeKn0+SO1cIk0;^?hF&{U%S4w?-uvO>9hoO?Q??ao z|7?=44r5>_BQbO_Vr}cbae^O#7;9cQ+^F+Dl9bfpR9;RXW*F5`qU}z&)f!pU618V@-6~j>H9$*-bJE$r04rEG*MiCj49fY_Z6!&7qB0g)QnZzEf} zD81KGZDYxmE~UqYbM7DWe*N;Mo4|2goiX5a?=xZVWfZs@-!O}&nqY2No=H5G)tVb>CcaX!>$`t?q>n50v%x5uRXDQS1^cv>hF1BTtFn>)H=oT_SPtAKSR_Z=p3GY zbjtt^aVwR#m0>*QC7FR>VIZ}n zPWR40kbOPVBjrlSqie?57sb!qI^rDQKtRHwLVyG;xZAeLlnK?F*6iy*HE@m0A`Wgf z>lKAc+M3vXgK;ZRK@YKbYSw5xF#@wgF?4%S@A0bi`hlEz`niv`mxS0KDwWFY^{3p2 z>a6P^3t}1%{(L)u2vg6E@3*9XIvtTXst%)0&2&+V#@lAMWb@^7QNT~uPPmQcifdBl#^GIyZgwt zI1#P_Z5eKsJA8@6hKjRjR~t~m7&iuQ+m7Lus}S4HHjiXS(@TrH@K0S0%)O`G;fr1L z9Ejm%e!zqt^@^(9o7QU_af;pCG2?o_*$V-|@_pN%>!*C{vqC&%LQt!42c{8Kj^KlH zdw?_UVj6|yIfy@AdQM#h2NVP!45``ez0Ux#i?!fcj+)kMi zuhu;w#sk*$W05}B^%7t17dcIXuEmn_zn-tdHOq;y{-D)r+_qTSH!YSQ1f&+N{7vg% z*p8l_*YO3t6_*MwIy7~@neDJPHp3Xo!>Q5qC@@{PaU?Nx7pto+#{`Qq=|=Z7xoO310h)=U`KClxcTG`_vucxMcPH3^Zb6hZQl znflt6U3+UC_;P@tiJ=r?7HsuV>%cE^P+fHs0o~2I_8tfyK&dG)- z1SGPLpD>w)=M@7&9cNmWC)yER?A@7jBkWDrcfU|XvA2AIxoGb^5(_Z~RIoRhdE{Bp zs+=lcZN5P1up6Rnnm!%M`;eNxe_qKm~%R^ z&sooL;zGAfV;Q0D$5nvF8`^8XYzEezvNuB#O4InD{eoJ z@62h4gcCy{myGo)3)z4g@Dw-LM{lIryBq%8ICeYeqblJ=@b!zT^M)v>sbQVPL<+W_ zNLKq`d3WtvHX2`j_A^0^L`iCIK#PIXa$5av&-k>)qlZbPA*SH7Ef7lJ`Dj8ZM^OMOZ1Nm;sw6`|ePU zRO@K+fKpbl(_3qa#EVlKAH)<>xJ;X`01PZ!@(e=*-?k3KVW=*UR2R!aLgW|TKK;!W ztTgsd_U@V6)7Tbpn-}KqHa(j_%3t)AR?HF*@ofY`BS5*aTg=m}@Oh@C;+Xjt9Mp(t z#P3a}VBg3aD?}rTYCgZJtBsj~2bimn1UZ3kx!QxD z*`&gbl!rUBH$!4^w;#mdLFdA=B;4V%_&y)DgOp!rV&BVlz+dHBLq{XlO+TOXc&jp3B@@Qq5T zUFN3Q+)qiKLg#(&oWE26?2P)gydM3lr)yoBD27ufQB%nnZqEUyqJlwx<*a(!)Dnl=Sy~C%Z9Xgk_`^TO(dxK z8cIQB+&mXMRX$S#!~F9Lhh~+QdGER=9ZwQhwogWE)G^fr!FB{x99|I^t#3jh4wN*ceW*CsDv)D|u};ebJ{47U}cQwuW7kB6X+gMNre{Y})Tc4*b==Z=~i2TTVBbnaP*q#l^3~Nx%hNeE&F-`**4s8qP?^JM!8wf1MK?G%Au}r}dvznfDz$L@FKsxwZ z%43&c)kAXU55MP?2w06)htYbO+e!2^s#Yz_&6b)NcX`&y17{cP!4p@$w|Q4VK^>6n z_Y5ID;r7)~su5ZY2#RnML7rb@LYyq^LIeX7_NK@iax-MXOY$xuPRpmZ*6~2aLiMQ9 zk$S8I`|U`n447_Kktu1gY*gSbcHL&uRBK)}1=X-=XDU?j+tr1yvuEn#HsBJY?9;%8 z!5Q*t6FN*&_45VBgj+^cNXak(?Z!&35deGX>8vbinro4_ujU=M$MJ5C-FB8K5@^~M z=Q`K(XF?F_FnS_$hs6mr@KrvB>siGXAVA#WSLRfz>HO+$wk{NkS;DLxm4{-t3bxE! zZ5tq>LRTM_;IBlm%x#^ba~QYzt%C!fME0bfyeD&;?`~f+VI&M|H@9~TiUngx|7S2>MtvVi$G#UTZJGxJQU#$-Y@RnT<%ve0U>?l7`~LnT@q2UIgg_O{YpR{QDJCwf37P ze(;UFE;X@WIs<9t-haW!DsSoU7ufq@BbI-TiEVYnHy4a7x03Dvu3xbW$OzV3pzPmi zQ4j{>sOU@>812QAnuy!+AShwD=l#t?PrlL|A00L3l}|F|P8cH~5jb5cf?Rbq76X7X z2dJNfFUV#p$yvs9?7p~HG}03;;R{9m_yIq(8hC~}GPbh8EF#0 zHpiN?8L#MBJRN9JoDTIvSm3CoKoBo^z$q4AHEZvmna-!#H7DXt`}x}Wgja$vlX@ag zC^BgKNwJmi&>f(;VRxkWmg+8bud5#6TEmXCtn(6laqS3;f-jYr>q}J`$Of?!xjA`G za(8?^0yn?oYhm>obMK|^BIvYj!byVW6v_R|csNd#S`=OMD6U~e*D1-zOJV19PPU;b zJqrPnM^W{p>$W$i(FUORXyVo(2a`!7^wURm{<0qTXHO=X!SyLt8|ETLXA$+47Bvy0 z8A8owT}r|(uQTpc?&mZAl27|-$+8Bw*@h*9kI+6MuN;^+IxP~}%(26VZ7kPLZ7)!;ECN@@a zcZJG;a))~##G-8+Yx$Dgp0yy}6RF$e;qR9$`}F8X+cgAx6d}IXh4=9i2<06oeYX|jMyb!LP6}~sADLdfveyvL1*;V%Rm_0ACV#s{**4}_e zx6~30cz^(iUYeh&3by3ziKQvjeH5E4HMwl;uOMpzCETJd!A*j&R@^=oRO|0HA1QY8 zV>OK0W>MU2tEaLjSUE4zAizvdPmXd3@Nx|Ounqw8Wj|@ej)Z6OWU}pWtICh4tn9-J zZhG%-x13+R|CylY#S%B|x%~LDlKGLc%C5ZVnS}w1ZPk`is>KgPWFR5mFoQos>~}sw z+f9m9hq|>1rL4v0)DIbUj5sPfr8$ri~Kbjlh+>xEe90K6pd26pf)OhmD!e z^p#ak4_wwdyY0&DZ9fe_1nv&hya@fB6bpIx&`s2uDn>NPvXXmeqE8gZe3iMh*Y4yYX^B8V0E)PR+w0Ik zaq?lRN~F3E(#~8ijlSj>ck=nZbs(s~69#c%C(*=e*3HUlp#`7BdX=PCfqm7KSmJtB`meBCQRwt(Ov_qT?Y^ zAvrpWG4Aqik|}#$aq28KS;$;Gg|%f3ijAaNc}BGvXc%P9t%`1&PnTZ<74*O+{3k@C}8bokYvr&ha&V(KP zsfBpoIcTi#=Y_ljX_H3>hS!0xbf^(84>-FH7+fx5!V{T4vmXe|Os)e?H2mT;CUG^I zsV_WU!CdYnQ3Wv6?CC9YWY$#((%6>I#(YLmsn~>(#a^g-s#Y6nVvv|`RE1og7hVU@ z+2A^G7f-GW)x)avR zj>zOFiC+~mM=f$J5RT2ou`)S!HOG_S_)h=7pUP2-9JR<%i+{ITbbE}0vr6^x<84CZ zhhXtwWr|~q;MOOVs&z7(MYi5wZuC35cev3{?!nT1gN7pQ$3JWQk}X@5`<_AAQoC1& z`<(60<%hqi>)>FEzF(;K50(%3A7hK)AK3cqK#SfhsCvJIO=DSn zz3t>tlf};}tg+Cd#h-d4Mmb&G{|&|gQHZ^Os;TerTCSL|qskf+*rIg(?dyPyFk2|J zVn6#KW(BcOB+GIS`3=g%;3F5T?Fr#>;-a0^hI>O|^j2j}DD(gTresTHgIzY%{x z*Pv?ud3Iw z4lbHBM5Lmai`cgWq%vmpGelb;bsE3eivJnVe+eC@H1=^I*cXyA8c?U(HnjdOWOS;m zG>R0PwW1DNMHJ%SKy7f@H8~JpN^1xoS`d#uyABM?O|JuL8P*^E5R38$_z0<23`m-{ zSe32=m+@b`PM?||B|6t(7F6-0Zr{#rZJuaeP#KbZ{j>#RkNUf}2X^2ZM9qE}um?B@ zgdbI3{VfeHf~T6Vxq^ZIrQ2^jltXw8J~s~ze$&JhQ2{ksCy{+W)% z{~U0=S@(17nK8+qr;NL^ReUaAlYoaCG{4M3!XP%vUq-^xSj@BxYOm0kbER<%&6zL6 zbW6L~2Cesort)yv>?=osLbG$CF>9VR(E49^8v!9LJCiHX!Y#nH@ zUVi(U%(8roPl8+)OD35u`IXAcU_%er5!Qh*`L#)>QFh)W24XI!%KZu(5?BIxSkQZ+ z$7}I4!H`Qu7uNxs1>yuAguLdxkb83l#|3rdhDg?_zhJ-^^efw!_{Xc33m7Iu91Wq8 z{_lySPCxyG;mn(}-<)&Kx!)YQ#*yb7J;u@B9J_^MuW{^Dj(yJYOE~@*#}DQB-<-I^ z-yd(e*N@X<-9m3;s&zYeGj#+WbvBJ1PSScCs+SmEph#x2az{x-S9i{qzfJEIt@~b&~k$(s2)AvK}{GOQv4qxQ=>Xyvm zi~MIZNd0aik;51H-4q@N)BWer3x9{g`yXSv|BkVL*hTwqC&uB6{M|(PKU+s}_#(g8 z4shU0zYS*mo_@kVRA&Fr;YH56{*Z0zGe+@$az25P|F5Z8h z7^m#*htVCsRf>PL?CrM?|FEm@eI~}qmT-iuqu}; z6&pn^hRAcRl^+7!e^gWXzq^xvG7<8>{M;Wl@U-I@$}`ze;`Kz6U7y?BeJk$&4nYf&0T+?th?({iqQsU@2>}ZS=-&Sj+Q0W2e{J zx!V6>5p(#gfQrpmL&@WE6N0ek|1SrfBfm{2T)WW``Hf9W0jAa~dzwOwu+pbz`w9s|lviJCQ)}5z=;tnbBXC1c+LL#=$8cJF=;p5Q4peQA{ z8b8J`I68GSd`uxA(ej3Dy5AHx;|wpTDTeTC{(LYX z=|0NFP(q~%mB2=VyXB&?X)XyxmvA}Msn8_{)!WJvy@ILr{Mtxd$w`uV<FEY1mrgyZyu9^|v|pTh`os|x17k}>46vl2@KR-lLMr!e|I|=o9CCsnv!o82 zAVCawo<31nA@(jW5+74B?S*IMhIK&GA^)tYGMDB@Rkb(o`(!E$fy?WFXy{(hlHwLF zM_Y+|NJ_N~cb{ceiFBG}e9CxmVrc)Dt1-YArremGk1*(EK|6FOW2ms^@%dD1qkx!_ zUBzz%cHD(09&m@-6ZD(Mn`e;}mHv_a&wH8vLV3PYITyVPDP0c|%rXcq+JXBC24CR$ zpcf5EChfp&&jDBJi*&mD-Em)1{7_dK>fj$4m=mz~lCwv@-S`*+39~;NYtkP01V+=eYKfaKBWPNQOf!${uU`V5zBls_XXHmH&d$KHkN}2iO(GmP z`|c6gQvjc3cZ%t<(u+>7Ry~J^?b^zKt0UyZm`nhy$SS&lmI70HZC`xoRo(XD;K)#t z$OfYs!z`r0N0JXjm$)WXcs2VIQxi;AOxahx%}gMg*SK*L_v3wW3EJ9Od{r3mCsbX= zA;%?%iDYEEa*Af(XGyW4`icjQZ5s#%U6iRNNyIqz+DK!lRQvMm&jWf<6??yF#`@^E zOdojqvbn|`9`*Xy-8qHxz=rwdma$&?@I*NA2G!IjCuQVXY6UGZGTh-W!4_JwA-H?= zZne#r5-+yLJNKo-8G(5BitQT=-j-zjIu2O{LwSVXaCy?W8;!ypDc`2qu+RPD7tz-n zE(EK?3bWWFL_Yof1%2)*M1J-jvU0YsWa*{0hXwPmp9zKQK0uj3GUkBV~Q76(5ceLH8KI+|K=hmT4(%sQ)Q)zM}@#4m%EP)lu zIxuTabsi5Pd(`mKR4wcTOFRN;;#ac}#{{Y1eChqbEP;}-qJ|+j^ki5W>bjI%Iq79r zY2(Q>J&}&j()alv^zUb$vf{x7r+8Cd zUNVupUeMDKd3f{9b8n>S>afM;SuzbZIu*aH5_uAmNmJ4OtA*8$g2~M}(>EQ}4?9Wo zZtT0m4G~ukg$}XRXq!QNJr<#_5VAXCq=DaB@j_nQXiE3im+&u_{Fbtimq2SOzIFtG zlXDxzBEAHaKju5EEO)9o-ER-tLpHR)tj!)+Xd4u!V4|2I)Dat6Q*z#+Gvg?}1O7^S z$IGoH)`7~^n0*3=Dd*fCNLV3=L5o(^tQ^cQMq{xPi_7Wa>eV;H-hCR>?3J0`w1;58 zTZ<8WkVsdl03Z1KF<5$JAHl+^xlg-Re{t)NX-B-nY|@vzN)?6_EO)5dNa~GHX^o!p z7c-W_FGJoS^LP#cSKVe8eYIlCMy`$U%p6_SKlDtg@jZ4p?34g;We5oI&+Q}UdVH+( zE^at^^U+33{|O*8oS@i_Xk?>1W-%T!+ro%jyldo{a@5}V!U?{CYmu(L_wU>@mO$YWKN8S;!AYur zs3yB_cpo*VtZQJpoGn~I>U_5K?cKRCLmSxuxx_d0EM)dNaLy;bm$aQJjEQ8PbT|X8JdD|=d(v; zy``_k25mZ^(QjAAab?q*&=471J~Z}xf*KP`<@FfeZR0(T;w8~9ymDU$6jmSCrb=Gy zV}5~uz`J5s^@tEh+cHa-9c?HvA60GO!8jh;E2Y@Y3`EhRBWuLf`aRN4SJx@7HccIk zzIiI5E(=+bYT9|L!6P6#I z{CW2pDbTM>(5*3mgDj2&6Xk&04BFL8OrJAr`yFgsDkFp>J zId6VjdoY3~J~}ef@o0Lx-6`#SOjP%t~Kf#MGR+z}laMlm#se)`6L8WAhup zq=|bqVmPbfa)-`_7anV2){Ch9$*WS;R)`n)x`Qq;`2IS#s6)4OG-fqAZcnJCoZX1N z4SUY8{^F!e6P}3=%mvkkKaWwro;+s3^HNE+d^+Zw6+$jf0(lsiS_hyt7;vMzR)9WP z;LlwR_O_9bmvSzA-m<&hK9tF)7hJ%7!K~%O%vuaEr;K--=l5C%B$ki^;clVi#APGH=>R`#kpG41X2KqTs)jv=m^!tF) z{$rFMIjX8f@~ycIdy86LSO;Dk^8R~#6Cp=)XpW~gkIq$$Pqu&lxFPoZ1^c(6n)**R za>FCy+zcQADmpqVPD!0Lp)$;9^j8#q#L4KB6-aink3`p?mT_V$pjJ$81aQraqfCBk z#Y~<+EG?CSu6h#WbyBxLGuqg^e|OZf$mE?9Eob$1$i{80%|cqTYJ4tesPrp(YWW8H z4LN$0yuI7h>mr+2n+63wkPHcSt35G7T?y*oJ9_kn1x*?mCy$VDBL7K*CUNkC^)Q)8A?#KBACMklfEov*vf zd=_2yMh7d8`o70|Abt+1^#s6#ca384#Ck}Q^sCx+9j^ol>Jwp>9~5Kf{1T7i4+Co} z^f#c_ROow#y8HoahiixTx=%BjhMbj`5Jq9x9ub<_7}*Spr+2eqYwue zHXUWeI27+Pmg|(!_|sJ%7jJx4-7$T^r|HvXD7UxpiRIvv`R5m4Rmo zmBNJMNfSqUAw?kUzYaW1BcLxqrjs9JI&Fmdu@ukFLuwvn1BLlfKSQ3lVYTyPIr5PB zC^G7_X4&}cVLidP?d(T;hpHrIWfMZ;fwNz+oA5sTa#E^bmvLSZlXnIsTlB{ec$;a2e)|Ue z%+s-W@g`zfUgO9P@Cr@2boN;NhtI>ub@&Pz*v>hC7fyE_NQT-`gh7iSkGYw(nOJ%> z>}lu+jPTOPKyocTVL&Qp*QublO4esf7u^aVd~5|n&8fZN6@LhoX#(=Ip*&GPW$^9f*U?K{$mC4^jKsS-rfkg4dH3+To zrXA5jq8=?;6+}zp`+9v@?p&6jyj+Y%hA4(H=RySO>lwvw~y1n$t(|voLDj_~eYh08eDIdH3XrH_^V@t_D%!P)K(9 zbLtb1f#D4Ar(d;-hx(lkmh9J87L_#?<=zTea>1;sP+1QrVNfAINJ#Y7cmsN0KjbfL zz2CZLO7vn)1mM=)j!=TaG^to5<`)&vNF_@7@@uh9(ddheFlk1(uc1_OE>5u>t;T*Q zCQPW_zwK^Ose&JOgG=GmrUlcQNK}_PjF#GniMhhWmOLwB=rS$uBsZZq(1eKG$e%v1 zHRy3CnKAlArZQCxQRkUQ!G3S5FcdtBVtVC+p5wO9lN1%7aqrv6{_w&$`@QVba{@tG z{7P3T(Y2QGx)v4JAv-lXRI11Jc$o6GHSHa8{=P{!#>p$}WdK((HXjXfFTaqRMN-+w z@ZsG(widKIQ~hNqe#^^U4`Q{4VG~6U&fnY*8GH1_a9Zs ze^-m)&p6nRS{Y{`&lNxa$tMT66wShs=B@rCcMRj7y_1{mh9=^DBS(;@%5e}$>utmc6#9$um3;lU`m&4uxUF4Vao zmEAs4@{JjoT6ZfiR`}pL5NU4bcq+n~PAsK7fXug#d)i+0X1<)wc&f2M@b-kGqWFmTyIn4J1IhQ9Y5HykqCaj+k!jmJDo{>m{3|qs zp_CiL2q)7Ms*TgE0wEu;Ht3SxYPQ!?;&bt2*~6Ed2S4vo^Zj6X^fs(7NW5Oxhfs~m z2DMB9dw06;z`+BvZ>+<82j%2wSpvNDWRS;=aR3xUZZ0RWu7$W1d||f&I`tpAy#;_1~zEg+fy!P zV0x~${(MiiydhR&<&s~w6(T0coGuOaQuxu1;^La9mR z^w0gQM4L{0$x3YFVEC}lUCr%;(DBPz{QPUHVXtTGK z*6OgEf$n*fJ+L&3|Nq!~^LVKHy?^{OO$=G4?E6%N7D*AZ%t%?1Xj9pyl093<#F!b$ zzD!g^Wkw1m$u4BF7lpEgG7Lo_GZj9W#rM;F-`~gYd+y&k*L~gBxz2UY>GGe)!)%}T z`?bHGujgy`>sp)J!(f<0Y4WGWgAp^I*9BajY+PxJh~T|M6?5~ZN5?e9ap?zGrC#&) z)0_F8T=~eevcLW8I9%=eusZ@39BK=#bLu4dQ3+kn>%b5ABc%^(PAOjQHf}C!tORT6 z+deP;$5&A#aNg!Da!fE%2zT)%6owsmH}i0Pz~yI+sOz7Q`BbC`_d5DaEZXf!SW|Uj zUQ$P;PthiGks42)sl)omCxyNz)sBqmIbVgn<@j;42#WZy*XxQ|*RH<8o)GKXb@xW> z=NX5hHc(%7!V~)S$;dbKvF#2^z^P`o3pg6I2Nsh*hsT&S9_B87GP65>AIdYxT7l>#ASs*9$l)MC*d@6cl%G{#&_ z#j6K(?YSPblY<)LErxW17y9}tV<)FDNh?Yz+#G%G)SzZI0k+*RjnP>5h!BxebH$I3^!q|mS zcS*U$S(w?`gcNng*)%WikxNS_MC%uRaEzRU?C-QWRLt^9m|w?AkGzxCInqC)KZZt3 zmgom}E82fjFCEa@ax&cC<}p>YW)wXgIEsXU#RO#>y*aeM2`QbY<(2vNZWDt2Dq9Wl zE~9uz0@4!2I?2iwa{AtAIknr+f#)Xj7NUS4V>t6M^H`*|pP>9G zE+|27#<)xQ3+G*=e8u>fafUVw(t)zsX;&)Y)vn=dj2kxMn$hJ2u=kEmLddd&DwDPX z&Fj~dOV6-c)Zv4{L;x4k#Dk-e_!BNt1$WzB6qB0HZCx2*yLGhV2rDHr1%uKbBs3B9 znJ$)j_;uWTyz8hn-`i?Wvg~7vk_!TRiX-NRD2`nSA0~O;j5*Ormqo=9v{+eB#^^G9 z8%6IGTG6J*a$R;?A{5RPx1O~{Jo&$XD0m@pY!Q7I2)5+=-C|!k_EqvB}P0}~z)nOO%VSik{0qdi&xTx2pUHOC&sz~PV#oe}?Fa3)pLq92( z6x8y_30si=h*8L10mPg#^0f5a8SXZZbW$I5|VfAVEp{wK@OssC5rexe}qXH^{unEm^ZjgSBbWIh->@Yqvr z2EdQ9<2^e4R%-z(O>Z;_mq5QrMlLlRUPu669 zAsVg|d}RV5yef1WSQxphe}r!TMB@AJ^C&-QVq^LVe+!&AKeDGY+Mac&9lo}bG2SE4zLx7?;t*zWc25Fz_=B)uopnNklD9M$mO^ErW0GG zp^SQ}zG83X(aGDS4M!l9BW9Tm_op?UKWoqb|AJTkK)T*#Hr$_f-0P<$CHdoPEz4}U z|6<*c-_Jt+tSI^4?}UE+)i1N*{&7u>Ken{>)AEe`@xDZ2nGN@+1sD9h)r~*;%9eKr z{;>xB4{R*`v^~W?@C^S;IF@$@{xibdUmp4qC9D>FrSU zDB<8m_a|#Sw>kT|p53~?*m&3on!{3bBG6G4b5~Uv3$2xQEX`x-4f6sytetPD0$Y}V z5h|@B`Sy$wg{5khcQEZZUN=u4-V@=6QF_eQ;`P(Z`^f}DP`93E$U6GIBjUc7lJz&6 z(IE@Tu`h2%o?YIox%Qj@71^_C8FKim3a!h@(VsIp(#bJrPZrL}QjwYHk=qCN&`Mh4 zR<%&S_q`>dX&96WG%c!{f?~8LMCSW}SN8U}^X%mSt`b>|DJMh zvWCChvB`Yn2N;N4ayANAzz$uICyz1GtQBb08F(1+^)j#CLl zuadJHyyEUTZ`L!~{IW`abw{lQbpc{CMMj~0kV9WvQ$PlL6#cZ&>05#IcE1wmPks4v zpFWN0Z4^2=ZHsH;G%YBq!xNdP8F983p@U!^SGVH?*lEj5tAw{)@qX5?A^b3=Ek)&u z>Q0f!;@Fk$kr>6+>7#5HLKjU2?IDj`2`;qWyYF#Ks`9YTqt|DtD*5sUz}v@Upb6aY zHS9n_Uph3}1?MxTo{77v;8x zRtFFCPzCcnUzhR;V}Yubi7}lD7uDf&J2$#ys${B(rmDN1>WX~!V{gLWVd#Ha54OCs z^`B5&_+w(wUqmaRv>_6lC1AXlW3>c0&CtH>0=_Hr1htlc4KB^}dH#eYzzni*ieSws zJ({P=D=>@n`$(JXd5@NtF!IvScR>tv&c(&rtxSvrb#-Sb|cc!+=h zoxOp?0774}%_GiT(+dxeRdqDZU{E@QZhE;I#I@x4(%h=g@F4a0M>*#-rOonTdT(>b z+NDyS57YM}y#Ox2jSfChhJIr|aU!Cv-9@TAKvvO|dYYCm0fQ(nOh(%^W9jAYF{q|B z8Vws>ESAM`9;9wP?rubI>m0?P9->f&(m5b|q(6b9Rp_8nu^_kiMZ5rNOG=BAj8fC~ zWDoe4Ql8)wc~kb$k6Jsor%B%r_ykaqxx|rtG*BDPTA?Yz+0Q%>b)j%?_F%h9zWqRp zYo>bptk@-mM;#_l^*(vP-xo!oDvMg^18lPjruNQI=W?p&=Y!fa2L@6d0w@`W_H1gT z%=*G1#*ZlQ0^6L>gf7!0XV-v_nfCO?tZls$i9`>lXTBP4l(k#k4&AlXYZ-?RlhAuL z)>T%PM+;$Y3yd9!-S|v^pC7#nNc+hECcjUiV!8bACoMl9UZR)>(cg85VoN}Om>*Y^ zWNZO3yzD1FKh6r_M%-QkUPY6PAvTYT8T6^0*iybPo@PgrCytgy&*Z2O#?w?3f)8PS z7>cz}TxXy|9!THY%P|dM)nSn)g?VX%`xn2gtF$0}pO=O0ysSnDGqYlTcnL6P_J|4kX}Ao)Urc;%ecBe0Y!1zs&CPPezna^u;We{Bd=>oA6}wWk z?iX7qeI)d*ItdV>5}7~F&GiXJukrlaQYYJcx3tG+p2r+YJsPW2m;OiNY>xXcL6I3cP0X=dvP0ED-}z9gvdSwk*dA4Arq89hiuNto*+$9=DXq2(egBv z;#=2iWXZ!8LqK)(sKdQEZ5TU&*&<@sKiV1XGuP0h}$@>7mRAP{fclFXnE?4iVOk9+1 zm2Y=AL^%HW+lH#k$lX)gCzk-aHtZ991!QQ60=(6@=payiAG)Ekw z5$cTBH1uJHH9x|6eOYv?qU^7Y%Ixn@+c1`5>``)|rEelv9p2#!X&$BAFVSwu42)yZ z_f@}|iCv?Td6x@DnJ=unw#HnsauvWFrLIp+Z%^7t1#z<-&avlkR^r4UmOau1 zOQ3w8Pv?QlFIzs4WeHiiuUZGa4w@1HQX`&T+Xzh89y4@tpb4`V+a?O7cfiIF+B zao(yFKyQ>!|A-NTr(`bc(?7N5@Q+tOyg`s18wW`TeX`<#)ec zg%3~GIh`H|KZWifsU~vDV1#89&%e0+`>loezuf^@U&X!(WQnl{W4PzBTz=9nxn(58 zuk(xW3>K0Tqd}a4n!H{4E1Iz9N!tGqr}tYgeffRA<8}OPwwM*0$u*$u3Y^uf7iw;R z_)QL&^!U%CZ(w!Qgp85}y)wCpw$B4xVQD&7#V(DDV%9FqQALR(3*>UYSZ5`QU7v=} z+O*A)s~ucj9bLG&E|eCM!Qc-)6sAZ{Z3n{|GoveoH*ZPv*S?=l6>?oZP{<3>>KzJ2)PP-PhV5F^^>z8i;yu|W34*)Ve_nJP^tmHQ-^e7 z00vr9Dv5W$hm)@Vf{WQ#S&=#Fmb@)}Rr9ui&Q&JRnyb!68%ZqK*&sz&+cQ!b&lq`h zCgS+o`c_yR#JCo$4f`-?o@~5s7;o{I*}HIwbBlkY%JErV^RCYa7i_K{Xr$Z)Lal#r zx$+~DIp*j~wQBib{NS+ucu7KN%XpM8W&+xY(GDIRtLcn2miO_UZ;?N-az^Ue^^^#D zCNMp@EVdu;rc1!OcI@H^@!KY#82OGW^6N~}^3nZ{8vh3!`QIMViy!;UllW`CSs$4| z`C?sb0xf=vSps%Tz`iatJTYLT$CX*#60eu5_S`A;<@=Sl-wVYJFZtJ8mHPPRG|9jw znzEYXGdin?iove-Q>pQkX_hFdSU91T67#9eJP;$o@{2dL^kIEz-CNN=CsVeN3iRCz zniAx@&<0N?T!r=Xx-vV8vcdHRFXfNaJi7U=CD*|-Q@6fT_K>JLJgZlG-54=q7ooVw zEAvuiXn4W92U+JoTwBDyk5D13Cuz~#hzQUAmw{t~z7Nwrx48Hz>}!9&z2u^musb>l z2p7ko)Hp6oyBoLhW~IdyH8m+Z7sO5^Cf~hWdwrdM4m@i|Ch(1%Ff3ETB-Wpzeq4|i zH{t8q>pU8%|6DB$pE;3nH{y#2mW{t5$+Iz4d5!4g_G z$3!hLXyA?Pp6xfT4P}{Vv{8180AVw=N!n{(u&xhuX_@v~Dk5K#4BO`;n0KSgM{1JJ zefaP}zYO={(Ver|3aN+=0Tpt#1gxF+(izzu6$$pw93!3;(I~q17++Xd)e;DHt?gYGMhaT`a)@5*v`L!{u zoF>s3=!u^cY0^#A?t2|PR680S4pWW?=CP5X$=UZgMz3ef4F*1cK4VAM{vv&T;;~^S zFq8kMwMP1s)zJRPbN#$36n7PAi|K;LG8gGjD-6GwTG65awM%vL+0Y0RG;C->6^;JS z6kF7kF~Pawx0=`w{i`bqz;!;=j8~FkM&BUb1~b1-?>@1Iwco|vZjA3h*8z_eLJp%W zo3S#vmIw*T>GGh!jZU=cM3;bX&!;_LP%u{{-iTH_TRyW-S1NA)LM30v5n(Z-0E`@3 zv2G&{-CQRfX~rC;F1*g@^He+)bo{BJ;7NVs9$4R`dMDdpX0OUE4G;>+o^r42yjw4# zY1@@ci_@H_7Hfu~cjOkAJ%zHUnLx!|^e96DO@S#d9Lj$RrQ z8}y8W3cPK4LEJ0l`Iaef%B^%+1T;NSkMnL)Qee3!23yu?O;x%HB!p)QZn$HF`0 zodGi@*Z3<9Gy{G(@A_d`W_YPR7-$jwT;YA&cz=6 z?I|tAOIp{{q)v~W`XqSTlH&oF-UB*~*oaP{h6cArC>GA@rMO;>$f`OtWImz}V{vvc zk2tFtZ?|5XQvWfk(xQGh@wzqCOW$8`Zpt~uAzZF0>@t@f}PIC zuPk=)`$g9&;?ND!3%l}SzUBA?p4ZxOBMud!KluVPK2Kd)3I>c!A;sDmY$ui6!W}zm zA@K6m@k;E~3Ocl`8h54MSb}x#KA2!yQM<9B=AoiF_0&bg7)CZ!t-&USpjhj`-P|bk zF+jG>@WGdB#yJ=C(EETM*0GDVx?>I&XKStUZd9ENRPj>9G2gVDyCescpBjB9Z{0P< ze0MiKX{UN^RK)Xu(ylZWs5G)2Z@_G?R}$}`9AomL)6x&z6?#yzZ7`H18;c@Q1$6u_ z(M0E7?w^vQL~FdSc64S7O-c7-MsI1AHF_oi`=;AS6mO+uu=XdXh{rfo3d>a zfnTx^uoqwq&oqrT2T}J-9)X=k)nMfQS-<6%e&_Q4eve!En?y4($<}v}Gcnw-P>x)j zrY(v9LE3+Dj6?p3SgJ3HwupvvIwf@sCY}6c#{~AzI88iK{Hqkdpk`lq$(}n2$ z_7@NM>y8&;z!GmcPZQ-J3&9VI9S$|&VjWh`*T#`9NSgTzj>rKMgcW$#*LBAD9o==R z9)m`G>E8LZv1$EVi`Gw{Rk+3=8HxQhYzguTN1oNqNG@bwz)?mDmw-4aEW&fp)XBk< ze!B8dYSiJHmx3R%@-8;nBKm&aPyJV899eeOe<7+rw`=+>&RR*3?E|(mXpIz7brHD^ z3C4butBcV-CM^~oFLb%@&Wyj^8UI~HYi;=_8i`3MxPp1NZr)DpyFG5kis5D-E235~ z^q!x@jEFT-$1;KMF7u+?V%~N<)WE+FiZd2s>)v_Z`&g7e8DM#uiv@SoR1cmoWz#yMmzXv^Dj7Ka1#S!Rl zUbg)G97!9VMNABB+NF|r1UA=ykv4AKMVyxPUIK2Xk#^?88R%GaId%rdN?>#pF}>#v zy2^?)8y}qRtvz_}ey!FsQPG!AskY~gr;1xmFfzMlXJBkUUfZtd8-={rgCQ}7J|hW3 zmnv#{wU4LjYX~VdD<>fCHJX{U!1zhVN!;6YnqHxZ>2iimB6ihW&&7}0v2!AuKvRW! z(~^_ZDJPJ^W&+x-bG#??CJUoTeo7nko{wdw&j?9Rce4+k@RS}*%M-k^zb|MqO>47H8~17c}=V;X!Eg3*FO#0vbvSYM!lk0m7v&L>r|N+lq>#^Q(gP6cLVDwJl36&Wv*JLz@uU zn6Aa4JTV(uAa9QBv8BoZJ?gpbPN1@+%!D?qm@z90iHkMS{iQH|A8WpF6s3p@eGyl_S;*k{{i3T^VEmY&3n{)v6R*KXnQ9f=Gp3JIbK%XeR%(D?0Rsz=_Rr;VE~L+UaPzdS6{foF z<)0YXbxW*206bf{RWefa(x#N;y+HUii~_lt5+|qIfQs3*(3C{b-%!$3DEFR0o_!X& z30bgO9X@8mkHjfW|GOII=q#j!yBNLsgclL zNJ+dBQ?eRNnN_~n+8AnjyuM`klgX9MyYf?*+x(hAPt@VIxNXn`iyLx79 zot-h_Fh=YI?-jIZbYgmpWz$e6$h~)p*%@buX0XdjD*Cjq_w7tJJDKCTCs9Fcd!ft- z(*sT?`uN2S?*vWR##01+Fzi9n4*SwfzKi2Sd-ZHzMt<4%Ach6uJX#}o>I6EaTr|p+ z(HSY%8G}cT-ms8@hKS}jM(2dPP z8HOf4fvyU(M4z(LdIKr(O0^fEJ*i)8K-HM&I>Tlrgg{{_<*?+fZj9c%JZ$bW`u81wh1{HIDZYSXH_<#;IuO{n@ziOnAu?N*sEN_O+R&)BOq{^lG)}qGz`02wNZoTWsSha`gYm~A6Qh|$#tLy=Y zo!SE&V$h=SaAx&aM&AgCfj`AIm=*F zmPx)?yKYP3pi^3&u+N5X7-op!q2f;Kfg~G0d!Uo4JCngS2g&nynaFyS;>RxV07EEF zdkK*E_-L?RMfVG7`ii-7fu-Cv_-A8v__tjoExad#i+rji-V6QVknNZ2(N`1_sCHX@ z(&+h9rE!Seh$jtxWQP)ZE2VjxxD*Ziju9I^hqs1O$3n}ro-H`ooKM|orTehwsBDV| z{0?}SZO=Imdb4iWfC#qpq}&qhlaK#-eFz7Z!!`OOr!mlfI&Dz zdiwh)4Gw`{GCy|TuItC&I%?M;6kS!0dGLy?FSAiOjRZn|hx70u*=Xd}C!sKmQVd&?*F!J>yF(a7(RAsu%{~S#yj3ZO z<_fR0TXq#YUVXl5G@@fzpk9WG)B{77fQ@@udEA8AC4jmCI8P7(=U5Jn*h)mK@e2HY z)-F2eeXLYBOXgT{<)xB=4x4!8bvC!27r*b$VDl929>5wwu%@)15PNieD?{ zoY?vH@o2@ibtHgk0#O0ya&K;}Q~8ADH`IE7cjy~B!ZOQqtE^1DaolJA0%d#dvlQtl z<(uw(B%`f=E!p@LHO7D1OO_EM|86(-cU1C!Q-xeKgrRw<5PxCBh*)1)yd}kZSJ3=* z-y0bMhryjlDB?&bNPv&?!5#B5U=s5HBSh}=4Tc|RHk0iVXKxUS1suiIv^w~Rh7J6>PpDp#}c2P29ZmE%L?LT4^^ZH+(hA|Ad$p3 zt$v(*_*4-e@!1XP67Xhw{}QlQ1F&TDSCbp6+uwX<@B6sGulOY7yH6!5Ssng`J-@z- z=>5`aHw%J+Omi8XF@sK}Q?Etrjlws0=RU5Vcz@9*U1{tiMyZt*Inv6JP-eI{a&77< zVs)w0*cA+{DgCf32u@rCJRbbX;8ZCS1&N$<>itq_?ooQjMlj^t5TET%cHbq$9>MOOKs z$NEri#;>-X`tl{3jRQ}dK! z-A6#hrgQ&=A!_ewLP`+tnK`gH!sHUjQuZ6DJ<}=Uw`99PSMc(Ha~`6uvju z*6N|GhMORX0RHqcWF*n|iQh*k>wWXM6dRltgg3p!+i9O>5uH*xPA4rC@Mr=vvj5$+s)(?F~ zGuau{SBnbsU)Xrt8+Ha``Tk%-wfNAvvNH=*(Sp&UnG{w?BUU=d?;^VVSc8?O@Kop$ z@I2RR(XnPG&lj^Hq-t$SVgVDkNgY024Sby?qog2uRMSyHF$>uuMZR$AWQ5%-KqGjw zf{Ll3aMlDB$`_$bpouv2b?khEH-i#0EDU-wry3S7Ua0o$P5kOqhWK33`<9le2H`i! zjZltJFiHm1J0nNHX4Z=C=B#y(yMusS<&CT@-YHY0yQD)RLpFvi;on$|A? ztBn=B>jYWvzuASVmV5Q3?|8ne@%_ZLlQU1(lFT7OW+P_NQ%#7m`oinOR@^M;O%AO} zLYFeOXg@ivbL`E5-8riod*``~lw$i#Cjj;E208KVsIUvuKW0*K(K@=?`9pR0-!F5j_Bma7ZV^ z)#3R}=@}IJ81Ge5z89@jvw^k}=TaZwWK?F~AE$ElN#nhG*W)#dWDU~CYLcPN{8MJk zjPz|BeN?oZ^_3AF$B?dJ8P)Ez_a)~ggoPPeuW_eGxvS}YkMS*o&AD?VLU`7?O~koj z$a?Jl5iVTY;uADG&^bDD>*j8~E2fnVrQVn-;HU!c`g8>w1XXr)15D_05zoJj14$;%<}nbQU!hr z_EHgfGK}pN(-z&k3T{=6tPY*0B2RK@Dm^*eDD8EpYRxA0I^3ds?QEN!x#>nS&f-#} z_t{)j5^xfCe?u(Rz~8z)loYAgstB18MZBl=#vgp&!h`MZgM-8H3zf2+SJ^w30N5NA z+2sX%FXgRT8@z_C1~#${2m&NWpCus6pk0X;zu8HV=-L^BeRC1LcJfvFP~!It zgGv{$w2x$b9x~Xs6C`_hBJHk~>>%7_f%7gezATtm(&ZP!x*&7TJe)80^(jqYrd;A} zH<+w)%i-}xnUlmF7?dAKkeMk{+&L^Mq+sWNJAZlwzz5*X*(xNoFBFI>z#=9zc}dy; zJ%;$@Dprp8rfvyXTw%)xDM(+`g%M40{B|fSl^NKIS1V|B&$meE92lq+9=oR;+QlzD zv$?3AeTdLa6sQvbLy2V`cH2xD;n;Scwl%$HCKOh$-jwpm8VFwk{8sLKWbW-JldNuQ z7W+gJ^Aygc3jVtx|Nr~=7;}-ZyrW5 z+n+P(c6~ECg=Q?jnb+!fu(#?-&s6kW;g^g&;2)7gr6VEn1YP`UUK1F0H@viI(Kwrr zmo8?bAiVG9_JU_^_XCpe1W{Mf9_c>CO5p`Tg8)~S(7v5YoBDM&`jx9^GW6e^Cu_=Y zzf$>7kSYvK2dpHh<0|KSK`R!vaahWmwhHuGU!6XTx&WgxsC zc*&gc_c!^7kvp?un;As^9nEoJYw}*B0N&;)tRxhJ&RAK{UURJ0Q4TX7=6*`a5PUvV zd;i*V6~)O$z2{V6`WlWb_c6`e;Fdunx=aq|H#!kf_)zQv+vZiSm^JRmx9_g$Y7ccS zfDV7i+N@!lb5wiFX9rxGXaaT8li0JhK1v#Bt738UHQ|ZZ<;Pty{&&VxFmg*kN!~@g z4Rc~1&$PLScfWfJD&Ph6RMwX7FxR}cR!uqRY#VXKUf_ae^Xx^mgrPOt7rz}W&jy_y z;?+jkhm~^j6KaB1>vp!Lb*T8}e7;8&qE+ZlUn$~v(Yko*995REJ)+4*X!Y5LDuD_i z>Z0%M{6+f^*=sL~A|WL7j5J45h_MqY{H^M4%2bQ2U6=RHeBNqSyjj~iP(|g`fSo=? z*o-jkIVS<@CNyG8)yOn=zgV*tQIg{%DR1RP( zk&HvQU z|F}z|PKF#cELEK5u{QyC-{8939zxlkr^Y#bQF3mTG=doZR+X!z5rUZ`F zs8aUzYRrs1>a%{aMMrjJ)Odhgjm6Dk_9uuynna00i`6Of-Yx+$!Ia2hEpj7IiyoTu<5f-bXVb}I)t?%j1 zm$$B1sUjDS9yWsJmZmxf*dysNMEBXK#bXe1?^(Z)Tdq|>o}lIY=Rvd%9w(1mN!8%ifEU)|_@+;bPM)vBF!CfnsLzdz({#WC`f5=4UyIa94c za}A-Bh%yw){iq}z-{xSgd9dtByyxfI4=2A1DgzQH?`_KKBN@&<#jg6HM)Z|M$jh4ECS<4z8_7&pgnRMFB=D3fYun{lupoyx&+3(BpLHcC)lGl!{a3>LTK==6=<~v?G%e=WGs{GR9%*|HbZfNyroe=W2`&p|lpEI5T2(g~$ zurG7%t?v)rkuEWjcWjE;tZ>(C4pD_zPtv0$(*(=tP@h3aXEr($s;O@+@;$Wqs_eG? z`sS_pHJue6@NpzCiDe!}4zNusL6=c90;krxOEgWS?iMj5h}4K=Mr4fOk!E(v!z2Ux zz}UPa*s9i2Qv~&K(pgd&fsE%qN#)Vkasx#&*F-!f!QVRrj*Dqfd#JUkGs;;9EP$ko zpB0tYNR)=a0J@Aq(dRnhs;p?29W4o$&cW6l7Za>s;3pYvZjnMUkNCxhZlMXyQABa* zMth%6;i>E%;uaX>b1tl}9^v zH}=N7>@>y5qLt8RmVhBsMsrpaE3DaA<(1B?yhnB7v7OH1-S0G}x16#QU16A*O+UwJ zzL6)N1cVW1U?XHQU4iKGn4|RonaOOoU&oN%#>DfL?zKSj4($o(R;!L0qVp|gYgi68fbW;b* zV08HqsZ@Yf*{1m+D{LBic-J4Dg-(PM#{_g?_^o{7XwKJBn)}jII5oWYJT~2U04j@q zuz7Q(o>Cst5O%z775*sbP8|S+Y@mf1ec5%%-f?%%?W7*Lek)Jyij3YAMgi(m@$&|V zCGN?!N7bgMAQce7&DQfa*7;ygd^)yK_>sPve5Iw73_P)5+u9(0(k6TmHv{d19rPQW z=__YhH5n^*ms{)i`N-GX?^s#xHaVl+(Il(2aBdo5n0ysBYm8vVB-N=9UZhh*Y2JRq z9>Wsn%jHgd@jJcg(e0@Ca}4vncoNR95i*IL08W>;N|ufG^kxo?iWEgcYs6G`5Kn(v zs63eB2}h-)>XIJq8WEK4h7wA4BVE|gXH*kZ*KC9`)aJ3KI&E6)ls$(@dW4xys!&gd z3*5&j2t%U4HKht`DuBACV9clpwq9vN#n*2yy?ST19HqbOgV$jdKkurAV`*ZApCkt?CnR96IGWt6JY)QEurrqv$}KAQ z(Q@sw2v=@Q6D=`^!>@@{s^3TI3BOMk)P@ZahUt8Ds(9B|Jd{00huP@8eKKpk!_=I# zzsdO1op^{%G3Z?v^D#7KG$)!aoVMt5M||sm@6XvKCg%(r2n_w8F?O3etWF4A$1>l?eZsL}r9le!QaZ9+M6uAP z91^1xmAglLzC>o2n?AQyhxZe`$Z${88Z=byk;nO+$dp;X>q!5>&W%r_kEe%Lgeg2k z%K_h|d4gzW!(uqPi6)QV{rYWZ(6K$;s@Kzv_YO%@WidCymD9HmR${8+O0oRZ!5(yyw<5I`XH z7s~a>v|3rVF~{r`8Y)PLbAs#2ijlPD5Rbn(jI&D&8iRys-GU#jgW}@fbZhG?&jLdS4=14+CA8)mx%JcL>i)GmbSvLyUUNmxcwFC(dch|1rb`~JDH<-bx( ze$k^Yk3Ie3@%-Dx=f5ly|HIhRiu9PdbuJoT=Qke;I9z!fwU7{+0P>_=JB9_ ze{K@s(Xos0Pm~|fo_;Ev9ZsA?-Y1SgU>0W*a%K*4V8-{Lg5?sx4F#6pxO_OvlC!KG z%cf)5JTCi=W&gMwJpB3qN!aPYH>~&0&lqI}X+Whwv{kKfq|8~*(vs4e3>qLK+oBp9s|3jVV7wB>ROsDj}v>MB;^Z#zD z|55(_UqT3fOY0nFb)qhOhsBc~7tD-^;5Tl$^T>qS*)zHlFf^&WFbvCl`S2dYNt110d$lsdZ@kvQANSoc4VCm? z7(Co5(qYK=$b!cJ*vO<#tUr@gN2({cWl z3buS$A>4%BD*}Sp;1m{MoI?~d?th$e$L;hR`Rn5&wg?L7JjN($^7fo7K*e7kbVm4O zh78%Ooh5ebjKGH?F-pbE1P3rC%riI_k9qC8KC6qY`q`r4LVGttK@6Ho>U#D}8Jan? zWG#@&3e^}*O41j<%*_( zx^YJ(|2pl+==8`XgP=5S6W&5KN2{k*GShQ#15^OW4^{Wt4-EaYDm5 zR#%RKCwV$70K2nUMVgQQm9iQzR)M1;HM@e*NffD~B16;B*)>GhL3_*C?5~6Bai3Oi zimV;G=c^8*i*j7YUfPVU@Fb}A&R#CCNSE3@${~F+P(4p}z6$$x?N5|h{gS(04sMo% zoBsh92)o88cVo6ZxWC={>Khajj!}|iZ=0&#d#O5$d?8#xH$64GGAdbazi0qPa(oH6 zl4-NZSpo(`06$(Y_6xj=IQ1FJg@A{23G_JWBhAWY++zinZ^}*%`SiHvoX?s$2hCes zHM$kDeJwjrVHCtY&?^if7R|yuT;^=Uf{V)Fe*2S`LWR%pL@cOOj4jZHiCsYrRSF_`}b ztMx#S=AAEvV^R-a>tb^5{TQ&m$m%FS#FT|FD+<hSwu@SV4iwJZHxbmvXdf|&Mu2_;KmQS>^D z1c8rph?y73F$$xCw^YqT{!@G(mb~0{x3f}0!(dvLYxlZ=5|n$8HP#0@_8a(5$aW&#-ueTT&hp-`T;TInKO2 zUD{aD6I*X(e|&Vpp~zr8=CN^J4?7cRc~vJ1Zf;!smZkbSD3U*CEB9;oZM%*o;K`R# z$%&5`DZ|4MNn3-`4v#x5)db16mlIWPWGEo5+e})^0Za5n!_C2?V68@Aj>*>a6;bhs z_LcBlL45>WpDJ9Vc?l&N#Fj7I)!(>UMfcwO7yFYt+Ha2N`?MKfvgJ$KTpx-heY4)J z3G>`2*>vC4!mTQGPbx-lWvQ5v-g=VZc0Wm+`c%jhQ^Z%lYPiLsv6p#}EnO7|v|5>A&Gp z{@S|;J%eY&Hwvy;dC>&}3Hb*Yw))D0PA70O|ZV)I}Bn*Z|5`0vbw`OLmL72YeF zSe<|~?sQv6=hLDRp~>9yX%ioYzHS^LKx_3BfAK^9wwM23wrzi{C0s^G{NYFbPYhds z1407NV&m$^p3&Tm!kUPph7J#L#N$kMb3Ql6f|l0j9^oLiPV14%>K`fi3GgVZ%bQj_ zM``h~Iq0dmg`>NrKhWT_UwN}EHiLY~ajVTeDl(NelC=b&2-`l9Aw7jIh)G^=9kN2`acmH3OkVGiVl^p%za(>lck$QKy8Pz;-1*N3fxaX7r4NJw}zr--ZQcF_PR+r?I`4@M^}hdG!pe!9CZ*^&MUct?(^)-ZzpaeV4&eocU zp~@WFL`C}?cb*enb3$+Y3PzT)dL6fvc3S-bZ-W*DnD?Gt;2Bz<8;YEHeyfDyq+_7@>0*h@|bY*&7gJHGGel+qW$xo+}t`< zoI^{N689F-eKN<`fMsEqI+x-&(6j^ush`B0hMjIwfVFDFo;wmcXqDuK8A09#4{W*h zLPGG6K;1y_XrYN)+Uwwhj~QlZW{3O*WRi?x^{B!~aKl1eQLQUWjj<3PY#>=u+cOc( zV7#+jzftH`d#549o;Mi|;30B&J~7r3kX$Q-Zh(yx$$EzZy@qxgMbQ~Vjmp977ucFB z?WdkxFjPo}sP1CUS~)bmu-qV#8pgt)6ri0_s|`aK#KEGm%4m+|m{H)-*FoNwoOZR$ z^G*~_x85{cpLG2JKHy6PRNH4z66oazYS_+r8&I4X*0Ojn-La?cx#x!WoDzpgyW-Wa zEmvr{#;hZ4IHGhNI+|7@jOa@om~HrqKg0}~u`0x|zMWya<>Y)a#>bv^#-6s>Qm_`T zKPsv(0h=REm$N>%&L@JVxpO!Zr@x~)FOW*65s8c2ml9fp_OYGS2elss7mBjz*NY&1^!5Lihi zys4(g(@hd)Dl^^kBg2)vcB)_(RbR1%v{MdlL(q5T*P)bzk97R{mi+SV%;ne&Uo z^mX>fZPNv_NY^+JH>w&(J#xN^TQyy76Sqj5kq=~cHVTGs$i0y}S*)M3TZ#PMQalv@ zV%jDb+I)d_=i1EIf;Ox^Y$QtNVK6b)Sfr+M`v9)&jfKm_{jR2+Wn+dHAGRX0smKx! zcp8|)m@$2dMFv9*c%HjN`YOZjp0G5kpm>X0X*4~NT(Ne`+my@t5KR_?2yhg+k0J1f zhBQwK3-P3RDiTLe)7xfTvyZ>&gg43<3a+0Ii+GAH{Xgw}c{J32-}iTjDT+cxGLsN3mZZ%#s4OXzq=+dJ zvV|;V%viEyP5n@mQHe^LWQ#ENsr(pZ9m|**#m|zN()ebU?$7Ufp7WgZoO4~*d9JQ= z-`Dlrw||^D4)gtfmiOoLUS99l%QgYyi=ojO6`3vMa`QT%!9ErA-VgO`eQRsyljkF` z+1{!$k276kwW9@N3sAdsGPyFnK{~aH{(7Fj?HNbfk+UL@^6+v^du@F0JKZXS`(+nS zDRr0WtO(2-SJI{s;;@wovy0<5>-A~){u=ttmwMT0EQg*aNtQ2I=I2*g=2)b5$);TM zX=H)@v)G)T=0r%ucq*x|C`p;S#8W`+3;Z-7p*mC36=gR+gEK{&Y4Or z`fgW6qyR5@953?mC*&tR>^e5d3?a6)lWx?n%42*yQr7eM*704J|MJ>8Uhpf2rP>jY%$Yb}_(S#dyV>KL2k~~p`gwe zQU}I9n1Us`E+{8^AGhU3vbPa^#@}j?fab^Bhecku-o5SLe?a_X9orH@t(q}GX%^u- z2vrmMTX7(L7yqh0VEx^=dA^GMF4B2t#o9aBU!&*J)fIqb(GGkAd2_uM4lBsVtARv) z`#^{(*I9$iJi1tBl$kQK-Qw$o(48poEh_;{x0mR%lWu4@Qk7%a) zjfe{wiiw|Z%B7@4D^Tj75OS#_1)Xxes)c~UQ_-6%awEfB*aq5nip}%&+TVJg-m+#i z(QSWlY+gB{QAk58;`R7@1<&~#AM$tghxmX%LH%7tSO1bjY2Ft{joa-j4bc9<@8k8)|d^ii0eAnxv<|YR`u9yP0@GiRa<@Y2negEoBzQ@gb6!XcW zGFyD{e^SPvfr8gMjJNi%G^;43UXiZ>zr@RjTQutakhS$u@EMLDu_t_R=(IEpa1iYU z(Op(5&mZ4Tm#fwG3}cbj@_pFGZ-cUE$@_?U--e!@mn_}pnCu_sKV}L|0C73K9F<8< zHvfY%p6j5Wh38C8Z15K!o_7JQrbC z4n0M<2Hwf+EGszUG*h+zIx#6=zNn`9b>-N5rIPAPBllD0%&|}95Pkg9vD{aJxbFe0 z;pus9d>>HtJY+|<)-)S9E3^ApM&|IY+Zh@6b#=C+-37FQk?0fYXL@#pc-?yBI(#JP zc?8m~0j%vk*8G~wC>^$c2_sd#Wk86k?Jdb!8Dfpx9_U3u8(v&{NZJjsL2u;Z1;pB5 zl5hYchm&>ZnZW}`dkr;%(j#9wjUKJK{!S((IbKGjfmIEFS2F>$pAge?4#@~+pyM!Q z+}NibCGh>kmwXFB-s0N9!%`i;^UkWc1-0g?D*>d#ZVqzx3GXs|s5z|uU=O%fQX@|G zU*&n$-#PZiIoj)!+}o{XzfW1LSlxp70xUFO)`BzNLPX;wDNL+lfh5V>G3XE4jqWXn z@7*cLwUDr!M#>?^b0{rzngO>HZf4pda4X;h^=3L0ZtU(8Rx&KUaihJ6sq(Gj+m;7R zrXk?xqr!ML(*$s_KNxppf3D_`?KuevhKHFuG3#3O`fKutSMFziJ9JM@XVxWpF4hG7 zkSw-WQGjKjZ|pTX&5dYpFWE{v`$hfMd)1eAGQU%9gRn`8_J3t{{zc`o<=WkU*D~E- z<(&Mb+MTFM>zGnGCoHalAc=icQD5S*_kM1?iH!0&p#l{M{M^}uZ7H#BAihp$Ar9r7 z%`pnnmM^^NdAZ};-rBF9sH8Cm{*)*U<7K;o!aE34xtHO41x@Fxx@Cr&2R@mLuT;>U zHEjN2hqULZwW8Yy!)PX*(sQIU_c58fEdz5Rwh`zs1|EUX&@fHFk)GZRHD+X3@qD+&d~J=5sm3kO^!enJ`hO@BhKJV?SMCn&o$bkPyN zpCyMm9{BI%o5~(LV&(FxpEBZ-NS68MlM=PF+PRVn+cq|0dod;jd+3b%?^w(mYcT}%b!;In&H+X+8l zrD~rx&G(!bRvIjQpD!&5F9P|pt?*tzY+?btD?4#a;uk-|onZ8*K9cySXOt>SA6tm$ z?xIL|c$wI(T2PMrQ->lrQ0z%BpP|mLE6% z)S&It`Kld35(>nOSufEAnJ8m0vKXRn0e!`TK{2d+jMbF58_@jGR5ET|o!ds;?i?E4 zrr(8Zq`yidT_EB6vE@>vLYp$Dkr5S(t+x&#t~AFOH3BC4p>Iyzdh_sh&(=|c6ImMb zdpB06y{m4#bn?k>*Kh9zsinwn&PIoxa$5*aK0TnGq$ug4_2~=Boc7kR@|`-ph-HEX zB6*G5{eXA}!y$aY@$2Z-QHz!ys|y)z4R;R!!Kg2QL%50=Hn)aniaQ~AycaW6#to?L zHq^lxZ4kJ(=x5f9SQfZnIqc!l&d~fc6>l@uq9Yq?U0Ux$u)W9J4Vfb+P*N#ki^Y_>B!kdcElMt zYw1j{zve#YAzImbD=pOnCKEv$V{8txfM^jBuN1Dr{RIDD_(-GSVs1t$TRi)vnbw@% z1Eg8fS+}@qI}f$9Hke^T3E=mSH{RsJ*90q^7H-|VL~2P5Yg;O)37`dp7+nff{X|oV zLyy|&YXKzSLQ|CCA~y~gm?DeBL%4ucS(yn6Y`YcjA^iIq6q4UU`Ux%gLDweJGo6JJ zsf^80fe)1xzJKk2B1m&Uig#NsM^V`5{u45P0)^imynH>IFZ0~MMNMhaSk_#FcQizEdk=lby+XO;oC~!8mo*CQQU809Qxa;C+<;P=Mj;bi$5$GKJ ziKiO=l7TaNf+Gm(k9Ch=pLNfL1W3zxRKJr?k*u9yYlyx91H6Ccfi~BvORqU_GWWQ% zZB%{;n{$od#v!3(L`x+0w*Yzq0c<4yHGzIq`aC#W+X z+Rsfo{^;!GdX(BHVo=Ohk*WLl5%=woz<9+DymBV2!fo!EyhB|FXBmXKy%`f}DPRF! z_%BLQddWvVGE=WS^O1SFfDnUR^QBYBlpAj)+U=OEv=Y@re4THy2DIwI+%onQobAUcGKXClnn%6GiSAFPx<^Ou z_OjH7tBvbDjY5;4ub6ZUvVtCmDF>Do%$!fDSAnBTrgKt)tc^=GTGqXIBPn;y*a;9% zcR<&%d^wO{EF}YtwrFGZ{%99*MaJqhzWKIqjT1bP!YE_-?4$4-e{8*bFDwE1X=lo$ zG4Lv>#6jm%Jt5>_ZC2&8hc!m2%~^4`K3Vb(iN*r*eTk`7ZD=(VNrj)x=fHE`@F9;90+`oUI_af zNy4b=bT;b$@Kia_`SH6R0-$zZO~xq$xy&b=*rqFRt{q33dl7YL`udF~=iDM0991Rl zg_Rzn2j8XBis8#8k2kf;U#WZ>rSe7wHH*px**n{uwV~zM#R#z2S7Zkl-%Zm zv0m+8__nv@!u9*+EzvN*4ikY%l=YW8Q->a2wcf6>DJ}Db%gcvrG5UKdCwA$llt6zj z{K-B&AZPpVYKOU3tAJZ|+1GuSXzB6Rci*9PL_p8Gjt7WY-pjBp1ksv=1%!#xrxuP= zquTEsl?P4~1W)B(>_Rr>t%f^zXYhlrdpXC@VmQx7K;HlpA24ha@rT|-UEQ0&`&Y)l znovL3K^CfA$SlBu4jD#{OUIrT?uN5@mT(cJCc00#s`Ay_BbBdR8siyM~v$Yh*08?4w_XKGg<;1XQ0OS-tx^JsH0TVEbCgBCf7a?w8#?>{u$= zJF(-H@5Pkz*p$t7;L2v7@(Z)6W1}1CG9PZ7v3;5R*>Up^O*tEIUq|IYyxc}w+JoY7 zTl3z9dylg|d~RB`C46{?U4Gjd2)C1C_GO@j$UdcwpoL%P_jw@GA@#EB!SE^bmSXop zgxwJ+6fH~k3ZO|c)8`bP2|I{ok)LleVi{9aGbrWWl78k96~!2pom%2o#Cxp1lp{Lv zU4QBhwnboKjI}tnt@E^*R@BzYkL3f^ky<@HM*1JZR$NeZxFl6=q=Nx1ZS$}?iJxN| zhZzB<<}3 zkjy(@Y%7o{M^u}jCGa19LSG5=a&18iBJES^WmJ4ziJtVahEOw@{utV}f?s>O~ z>*MQkpe4*WnxBCMYx|d^#E~Ru{^`GifBhME=qIGyj$IljEbM?vrAPDE`~|uAFABPr zANzMff&b+6tb9pk^#?3{rhkaqbCvW1*(m%3IsN5heA&fTS8V~wuYTVjHKc?`Y~Q8K%HpR(9fs}KKW=HyOgZfC`{txBGsm~gTU8U+dLxbfcJ~j+^RRmyD^m`UzzN{`ap-BlG0~1ED(OX9A4)c1U-i%)fAc2O ze?pzGRB-0Q{xKyNF9hZ?b*PL&+-w-hrnaKi^_Cm>*osdlN8oGXT1wxmUg#@bYdNyJ z!RV;KOVolpARrn7d2rmpo?4Z0zeDEbwWWQJ>NCDueM;K1={rPGyf6GyVljmMg}Cny zL$K#)^+oR&vy7@+57n%w~AxKDU9$$I>dzCq6n4 z-C_-DtDqRiuq`nw4ZoS7v^UNc^TOcHCJgveIS_>z>4mF4jhW$T=?*OJV?Ez9c(-YT`!b{87RhpPs`tyY?-fY!BYN{U>C!*p|P0=4+V*w3HNO z=*TS*75Tsjhe)C$36DH_`wmbtuqvgDw zH6eZ@x!gA1;>MV==iUW{jm18xPr?Luk5U5Uza5-%iZa^BH58=PTJv_}EIDJP!7sgO z=?Njj5fPEwZ!;}w4dl!8rrjM*T46$RqKrK&;8p6B^x-g;OIij?5omP5$tLx}?(PsD z-Qa*L^3wNAS3KLic`YFmsL&jG;Yn8o=?ijdd060p)$&-x~|PPxzjsXzwJ}spQR4ZhMK6@})EI2k;bvtaiOF zW=@p14`)}&CL{-J{aPUz0VmT&?w>C;I2Rn9dGW%CTa>Ogcs7}4z{1}NxxhOq?3#IY z_JuZAb7OPXjGqTLwW$4e=o#iWv%JvXs64YMebNwy>j!tUvl~&$@DWZn$Y5|bM!)pC zSkdFV@SUK)_f}QT#n7AbA_eFDeNpjIh94~i$rvAOv{RfQVYZQX*gJ<1ukF7nd|@<* zekC?=Ld@%unZ;t%$-oXMl)jSeMpgp#kp5D5l6MSuHb4n3wgO0Kzmi&Gmj}h67jEUV zRO3#W=GlO3=Lcw9xF6t<7Ae^H9C9;OrhV6jngVx^mUDHr#UCt@hhhi6E96UO8LII1 z5*khFQGe|F2}#u|@s7c6(ksuVZ|!GB9nRh*k8)963yNL@yOQ4&5U$=jGVka)t^yu zzNaE@@teljsZg=9Bxq8&Bi#7}huln%fe%?_jTwx(AJ6MVzHuupuDK<-enm9(yq72y z<4%sL-w7kw2FGDPmi4IC%&D@s)p=HWLj|`*UK@XEwoDwNV6&nQVr7LLd4~N2-#JNc zd_`~hUiR3%Le2aAU(X%Yw!YEku)<>{71-YbiRR2GBy$qR!;+0R!LFa%=%)sJTkFcR zd-P38>YTOSy=XX(O7arXj>4|`E}ejZYWK6#DWW#LT6%LDf6$^TLT}T~2gz>_IlaS_ z0#tNASCic^w4LKsH!F;+xn}UZH)BrP@h)}S&63v7rlPX^gGr}+udZm5m(ukTeF9|A zWcen2c=a>5OM>UdyQEPwO9$5!dULzwN-G23`ChO<-g=(2=RJshvgZgqBf7AMu<{an zL;6e8f@!<4Baz-lO=V^-d%hZvnH-!(P#)&5Bzw~1>8PtjXnG7ODC9dZ$m@q~CA_)2 zy>Br#ygO2Q`_M$o8RE%R;J}qk=V}NF@hfL)Qi!h|DKkbJn``dR9qg`{s(m+i6VrUR z&|Ia=*FO5a9>^gn3zBLt<29Uc0fHjq?L>5V@v%QQ+l$@5y)O6v9U&oQu;bBF!|^Vp zBhM4x>3UG`@C8oNZ#>oFa5-W1%wzjn{rg{AP}+AA`ETf&U-P7pbs*-rAW9n?9=0?M ze`GnBb`JtA%%vtMWgb>Y4FdoeV$=3ovBxvFy!C%`%)mO?UU|{I@fbh7>Xy{?sK6;N zQSEVRBS3G2p(Scf+0EQXocL&_&vCQ9tL@UWUfgT@Vs!3a`s$|E2*m(BM3goIJ+y~A z0xPc&u7YKGN5cKl;)e5T%eQc=LIukyFs@BJS4;X`nik<|o<+wgH+ z$RyAcT6X#luvH0qv;9oaR88BRVD6mC$y7-}9`5`nQw96z`)kd0K{Nf;0FV_CO2|ff zO2^j0$L}g=UwK?hI7L;&YBwL&5pH;6w zKJ%!bH6Ym$8H@_nq5d}gJ4JQhgo+;G53(!>m#L_5Dz_RYa9Brs%Mb947-tNN2i1Y^ zFv1}B<)=JE>r6AFj1vcDFZJnZS{$poc-DVzTeReT4NtSj2j)P5V+~JUNJZ%i^7vvT z*q)MIqq(qDN!q&rRJN`3Te^26oBlmk z0Z-0&yq@R1iGHsn(t-pv$vI-&n0&9{diG3no=o4980!udoA{ov=w$QGB*YHO73rY1 z^|5AG(z|JeGiyz!jzG90Vc^}n$;es)31q;m;qC%2C)=C;o2KV22Q+`rXjPH1S(W7B zdy!H3jG~~2ux4UrMLD3d9;+RK2Cf3SfP+q#+upO*%x@uLHTvG+6Hnh?XuJ}|>FPrE z(91k;80&>^WB|oM;{)ME<^vVEB3mlo^z%nV?Ec&;Sv^MZ=VF zQj$KU6*IJ-wF@OpY?09$SUUYsac^l*(6!+|r$y8}FmDZXD1ax6@4_k=9xw30R8T3& z0qg$ISDgu#y7_2$WqxKO_4mVpJ7QC0R8-Tz?$H)XWIysAFqVf+8Epw3H|o`R>r$om zHJ#L>Ne5&nL3z@^z`9|-!t_-_DzUsSvnuAZOMn0M9(4I&+sJGx|DI)A_zwFi4beV= zhxA|%g-ht&i$RA|T2I1nDYU7riw>DKgPCb(-AAltY#r6ryQDNk@52n968~5|4C?yj z(z8Pxv*AXeW^M9^Ud?%?wog!COv_wgr?^8#LSPc~jw}G~tJi$$((%58IcwgbmrpLe zA`g~hrJPGDvT6H>T2@2u$sH2cX!e*ni9d62?wDva+8CPJR1{UO2Gg5s2IBm>QbpDr z#CApxy${XEQ9Ym{@6rLn*8Q^{y#3+x+-tUI?bHe-nOXR;i=PdZr^`GWdN{Zx@1l47 zWd6Iw{59xdXD)$L1jI0#D2;e=a`&8eNyV9f2j8tGl2kT%ZjomN=S2dkwMFzA?~hZ$ z%{}GGh2}YJA0)jcWKO*{m%C+&R6zZPcw&Oy0N>$S3kqu0K<)(Wl?L=pp+e7Wt^1YR z)BQ{3t9x#YNInu>{d`nP>eM$ArLei3JY|@~Bqj3=ICmJ>7BzNuOMrC4tz=3{MO|k% z{|xY=(rX%GV>CqX#d5I%lCkDt9ENuc-?M?lIJrCUNw`g)-xy2?J$qyK+M+kg(OfW? zA!#50Imgor|9G}riyz4VHHo;1J0s46W@!PqZ_%sQ_BxQWz-Qo;dkVXaH^8<>-?+RU_Tnb8x_($^ zm?(w(J0PEzo2C8%g#UjM=KQ}50R5lYEQL12Z4=xJnNJ{;SG5GBIo7L{zJ0}c)=`&Y zSJNKw&GWN+BOi4AUjL=8U+GPSl@*0)b;{U)}Uk>WRoyo-0m4A>#Nh-KNc^W%V$;%x(& zoe=ICkvx<9EVcj1vvbjtt|RN(EA^!sf}=;ekk9|F5Ehb3t{~42ycBj{fj1e+wq)sB zu?s8ro=xpNCJe$6cg#)UT^A7Zm9KIm&YX8!mA2Q+0=L?3MfqP_Y+O3XuxoP0GC7A% z!L1lsho>&RDc*KtSIWBP?+}o>BDtq&r={IWGC`>NA&;NBJtNo@DDT% zEO%J^1C#Yn&h@|k-+!UQ;(yZg{MwDOOw;tQ-`Kyla=&!O{t5@>|ELN2wG(66^<8#- zPyJ~p>&`_so2+4Hpf2U#o9wVp_q9VF`5!bj|J+d#jM}ngCaWRjj155_Dnm<}Z2C28 z{4YFDmtXJ~GY@~$nShXUVsgHyaKmC0z}6Y~09Y01hvHm?2u)*bv;gTxU~fYU zwW6e9=P^+rXE#R@u4o1@#4hj*$%qERf>Om#sNpUFu7NPiZ?Zfm%ll;6c9zeRbmcd7iB11fA?BY1moESNe and type has the following measurements + <[ + Measurement{statistic='COUNT', value=1.0}, + Measurement{statistic='TOTAL_TIME', value=1.011949454}, + Measurement{statistic='MAX', value=1.011949454} + ]> + and has the following tags <[tag(this.tag=will end up as a meter tag and a span tag)]> +``` + +And the following trace view in e.g. Zipkin + +image::tracing/zipkin.jpg[Trace Info propagation] + +==== Ordered Handler Configuration + +Micrometer Tracing comes with multiple `ObservationHandler` implementations. +To introduce ordering, you can use the `ObservationHandler.AllMatchingCompositeObservationHandler` to run logic for all ``ObservationHandler``s that are matching the given predicate and `ObservationHandler.FirstMatchingCompositeObservationHandler` to run logic only for the first `ObservationHandler` that matches the predicate. +The former can group handlers and the latter can be chosen to e.g. run only one matching `TracingObservationHandler`. + +=== Context Propagation with Micrometer Tracing + +In order to make https://micrometer.io/docs/contextPropagation[Context Propagation] work with Micrometer Tracing you need to manually register the proper `ThreadLocalAccessor` as presented below. + +[source,java,subs=+attributes] +----- +include::{include-java}/tracing/TracingConfiguringTests.java[tags=span_thread_local_accessor,indent=0] +----- + +=== Exemplars + +To add support for https://grafana.com/docs/grafana/latest/fundamentals/exemplars/[exemplars] instead of using the `DefaultMeterObservationHandler` you should use the `TracingAwareMeterObservationHandler` like presented below. + +[source,java,subs=+attributes] +----- +include::{include-java}/tracing/TracingConfiguringTests.java[tags=exemplars,indent=0] +----- diff --git a/docs/modules/ROOT/pages/glossary.adoc b/docs/modules/ROOT/pages/glossary.adoc new file mode 100644 index 00000000..5899d997 --- /dev/null +++ b/docs/modules/ROOT/pages/glossary.adoc @@ -0,0 +1,66 @@ +== Glossary + +Micrometer Tracing contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing bridges to various tracers, a set of modules containing dedicated span reporting mechanisms, and a test kit. +You need to understand the following definitions for distributed tracing: + +Micrometer Tracing borrows https://research.google.com/pubs/pub36356.html[Dapper's] terminology. + +*Span*: The basic unit of work. +For example, sending an RPC is a new span, as is sending a response to an RPC. +Spans also have other data, such as descriptions, timestamped events, key-value annotations (tags), the ID of the span that caused them, and process IDs (normally IP addresses). + +Spans can be started and stopped, and they keep track of their timing information. +Once you create a span, you must stop it at some point in the future. + +*Trace*: A set of spans forming a tree-like structure. +For example, if you run a distributed big-data store, a trace might be formed by a `PUT` request. + +*Annotation/Event*: Used to record the existence of an event in time. + +*Tracer*: A library that handles the lifecycle of a span. +It can create, start, stop and report spans to an external system via reporters / exporters. + +*Tracing context*: For distributed tracing to work the tracing context (trace identifier, span identifier, etc.) must be propagated through the process (e.g. over threads) and over the network. + +*Log correlation*: Parts of the tracing context (e.g. trace identifier, span identifier) can be populated to the logs of a given application. +One can then collect all logs in a single storage and group them via trace id. +That way one can get all logs, for a single business operation (trace) from all services put in a chronological order. + +*Latency analysis tools*: A tool that collects exported spans and visualizes the whole trace. +Allows easy latency analysis. + +The following image shows how *Span* and *Trace* look in a system. + +image::tracing/trace-id.jpg[Trace Info propagation] + +Each color of a note signifies a span (there are seven spans - from *A* to *G*). +Consider the following note: + +[source] +---- +Trace Id = X +Span Id = D +Client Sent +---- + +This note indicates that the current span has *Trace Id* set to *X* and *Span Id* set to *D*. +Also, from the RPC perspective, the `Client Sent` event took place. + +Let's consider more notes: + +[source] +---- +Trace Id = X +Span Id = A +(no custom span) + +Trace Id = X +Span Id = C +(custom span) +---- + +You can continue with a created span (example with `no custom span` indication) or you can create child spans manually (example with `custom span` indication). + +The following image shows how parent-child relationships of spans look: + +image::tracing/parents.jpg[Parent child relationship] diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..a9de0225 --- /dev/null +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,52 @@ +:noheader: +[[tracing-documentation]] += Tracing support + +[[tracing-purpose]] +== Purpose + +https://github.com/micrometer-metrics/tracing[Micrometer Tracing] provides a simple facade for the most popular tracer libraries, letting you instrument your JVM-based application code without vendor lock-in. +It is designed to add little to no overhead to your tracing collection activity while maximizing the portability of your tracing effort. + +It also provides a tracing extension to Micrometer's `ObservationHandler` (from Micrometer 1.10.0). +Whenever an `Observation` is used, a corresponding span will be created, started, stopped and reported. + +[[tracing-installing]] +== Installing + +Micrometer Tracing comes with a Bill of Materials (BOM) which is a project that contains all the project versions for you. + +The following example shows the required dependency in Gradle: + +[source,groovy,subs=+attributes] +---- +implementation platform('io.micrometer:micrometer-tracing-bom:latest.release') +implementation 'io.micrometer:micrometer-tracing' +---- + +The following example shows the required dependency in Maven: + +[source,xml,subs=+attributes] +---- + + + + io.micrometer + micrometer-tracing-bom + ${micrometer-tracing.version} + pom + import + + + + + + + io.micrometer + micrometer-tracing + + +---- + +You should add a tracing bridge you want to use, such as `micrometer-tracing-bridge-brave` or `micrometer-tracing-bridge-otel` and span exporters / reporters. +In case of adding a bridge the `micrometer-tracing` library is added transitively. diff --git a/docs/modules/ROOT/pages/reporters.adoc b/docs/modules/ROOT/pages/reporters.adoc new file mode 100644 index 00000000..fdb1cda2 --- /dev/null +++ b/docs/modules/ROOT/pages/reporters.adoc @@ -0,0 +1,74 @@ +== Supported Reporters + +Micrometer Tracing supports directly the following Reporters. + +* https://tanzu.vmware.com/observability[*Tanzu Observability by Wavefront*] +* https://zipkin.io[*OpenZipkin Zipkin*] + +=== Installing + +The following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added): + +.Tanzu Observability by Wavefront +[source,groovy,subs=+attributes] +---- +implementation 'io.micrometer:micrometer-tracing-reporter-wavefront' +---- + +.OpenZipkin Zipkin with Brave +[source,groovy,subs=+attributes] +---- +implementation 'io.zipkin.reporter2:zipkin-reporter-brave' +---- + +.OpenZipkin Zipkin with OpenTelemetry +[source,groovy,subs=+attributes] +---- +implementation 'io.opentelemetry:opentelemetry-exporter-zipkin' +---- + +.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender` +[source,groovy,subs=+attributes] +---- +implementation 'io.zipkin.reporter2:zipkin-sender-urlconnection' +---- + +The following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added): + +.Tanzu Observability by Wavefront +[source,xml,subs=+attributes] +---- + + io.micrometer + micrometer-tracing-reporter-wavefront + +---- + +.OpenZipkin Zipkin with Brave +[source,xml,subs=+attributes] +---- + + io.zipkin.reporter2 + zipkin-reporter-brave + +---- + +.OpenZipkin Zipkin with OpenTelemetry +[source,xml,subs=+attributes] +---- + + io.opentelemetry + opentelemetry-exporter-zipkin + +---- + +.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender` +[source,xml,subs=+attributes] +---- + + io.zipkin.reporter2 + zipkin-sender-urlconnection + +---- + +IMPORTANT: Remember that Brave by default adds Zipkin as a dependency. If you want to use just Wavefront and you're using classpath dependant solutions such as Spring Boot, you might be required to exclude the transitive dependency on Zipkin when using Brave (e.g. via exlcuding the `io.zipkin.reporter2` group). diff --git a/docs/modules/ROOT/pages/testing.adoc b/docs/modules/ROOT/pages/testing.adoc new file mode 100644 index 00000000..698343e3 --- /dev/null +++ b/docs/modules/ROOT/pages/testing.adoc @@ -0,0 +1,71 @@ +== Testing + +Micrometer Tracing comes with `micrometer-tracing-test` and `micrometer-tracing-integration-test` modules. + +For unit tests it provides a `SimpleTracer` that is a test implementation of a `Tracer`. + +For the integration tests it provides a `SampleTestRunner` mechanism that you can hook into your samples. +It will + +* Configure an OpenZipkin Brave Tracer +** Set it up with Tanzu Observability by Wavefront Reporter +** Set it up with OpenZipkin Zipkin Reporter +* Configure an OpenTelemetry Tracer +** Set it up with Tanzu Observability by Wavefront Exporter +** Set it up with OpenZipkin Zipkin Exporter +* Run all the combinations above against the user code and running infrastructure + +=== Installing + +The following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added): + +[source,groovy,subs=+attributes] +----- +testImplementation 'io.micrometer:micrometer-tracing-test' // for unit tests +testImplementation 'io.micrometer:micrometer-tracing-integration-test' // for integration tests +----- + +The following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added): + +[source,xml,subs=+attributes] +----- + + io.micrometer + micrometer-tracing-test + test + + + io.micrometer + micrometer-tracing-integration-test + test + +----- + +=== Running Tracing Unit Tests + +To run unit tests of your custom handler you may want to use the `SimpleTracer` test `Tracer` implementation. Let's assume the following custom `TracingObservationHandler`. + +[source,java,subs=+attributes] +----- +include::{include-java}/tracing/TracingTestingTests.java[tags=observation_handler,indent=0] +----- + +To verify whether the spans got properly created we can use the `SimpleTracer` as follows: + +[source,java,subs=+attributes] +----- +include::{include-java}/tracing/TracingTestingTests.java[tags=handler_test,indent=0] +----- + +=== Running integration tests + +The following example shows how you can run your code to test your integrations + +* by asserting spans that were stored without emitting them to a reporting system +* against running Tanzu Observability by Wavefront instance (this option turns on when you have passed the Wavefront related configuration in the constructor - otherwise the test will be disabled) +* against running Zipkin instance (this option turns on when Zipkin is running - otherwise the test will be disabled) + +[source,java,subs=+attributes] +----- +include::{include-java}/tracing/TracingTestingTests.java[tags=observability_smoke_test,indent=0] +----- diff --git a/docs/modules/ROOT/pages/tracers.adoc b/docs/modules/ROOT/pages/tracers.adoc new file mode 100644 index 00000000..782aca0b --- /dev/null +++ b/docs/modules/ROOT/pages/tracers.adoc @@ -0,0 +1,45 @@ +== Supported Tracers + +Micrometer Tracing supports the following Tracers. + +* https://github.com/openzipkin/brave[*OpenZipkin Brave*] +* https://opentelemetry.io/[*OpenTelemetry*] + +=== Installing + +The following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added): + +.Brave Tracer +[source,groovy,subs=+attributes] +---- +implementation 'io.micrometer:micrometer-tracing-bridge-brave' +---- + +.OpenTelemetry Tracer +[source,groovy,subs=+attributes] +---- +implementation 'io.micrometer:micrometer-tracing-bridge-otel' +---- + +The following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added): + +.Brave Tracer +[source,xml,subs=+attributes] +---- + + io.micrometer + micrometer-tracing-bridge-brave + +---- + +.OpenTelemetry Tracer +[source,xml,subs=+attributes] +---- + + io.micrometer + micrometer-tracing-bridge-otel + +---- + +IMPORTANT: Remember to pick *only one* bridge. +You *shouldn't have* two bridges on the classpath. diff --git a/docs/src/test/java/io/micrometer/docs/tracing/TracingApiTests.java b/docs/src/test/java/io/micrometer/docs/tracing/TracingApiTests.java new file mode 100644 index 00000000..dd4cde81 --- /dev/null +++ b/docs/src/test/java/io/micrometer/docs/tracing/TracingApiTests.java @@ -0,0 +1,340 @@ +/* + * Copyright 2017 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.docs.tracing; + +import brave.Tracing; +import brave.baggage.BaggageField; +import brave.baggage.BaggagePropagation; +import brave.baggage.BaggagePropagationConfig; +import brave.context.slf4j.MDCScopeDecorator; +import brave.handler.SpanHandler; +import brave.propagation.B3Propagation; +import brave.propagation.ThreadLocalCurrentTraceContext; +import brave.sampler.Sampler; +import io.micrometer.tracing.CurrentTraceContext; +import io.micrometer.tracing.Span; +import io.micrometer.tracing.Tracer; +import io.micrometer.tracing.brave.bridge.BraveBaggageManager; +import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext; +import io.micrometer.tracing.brave.bridge.BraveTracer; +import io.micrometer.tracing.otel.bridge.*; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder; +import io.opentelemetry.extension.trace.propagation.B3Propagator; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.brave.ZipkinSpanHandler; +import zipkin2.reporter.urlconnection.URLConnectionSender; + +import java.util.Collections; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOn; + +/** + * Sources for tracing-api.adoc + */ +class TracingApiTests { + + @Nested + class BraveTests { + + // tag::brave_setup[] + // [Brave component] Example of using a SpanHandler. SpanHandler is a component + // that gets called when a span is finished. Here we have an example of setting it + // up with sending spans + // in a Zipkin format to the provided location via the UrlConnectionSender + // (through the dependency) + // Another option could be to use a TestSpanHandler for testing purposes. + SpanHandler spanHandler = ZipkinSpanHandler + .create(AsyncReporter.create(URLConnectionSender.create("http://localhost:9411/api/v2/spans"))); + + // [Brave component] CurrentTraceContext is a Brave component that allows you to + // retrieve the current TraceContext. + ThreadLocalCurrentTraceContext braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave's + // automatic MDC setup + .build(); + + // [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's + // CurrentTraceContext + CurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext); + + // [Brave component] Tracing is the root component that allows to configure the + // tracer, handlers, context propagation etc. + // tag::baggage_brave_setup[] + Tracing tracing = Tracing.newBuilder() + .currentTraceContext(this.braveCurrentTraceContext) + .supportsJoin(false) + .traceId128Bit(true) + // For Baggage to work you need to provide a list of fields to propagate + .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY) + .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 1"))) + .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 2"))) + .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span"))) + .build()) + .sampler(Sampler.ALWAYS_SAMPLE) + .addSpanHandler(this.spanHandler) + .build(); + + // end::baggage_brave_setup[] + + // [Brave component] Tracer is a component that handles the life-cycle of a span + brave.Tracer braveTracer = this.tracing.tracer(); + + // [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's Tracer + Tracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager()); + + // end::brave_setup[] + + @AfterEach + void close() { + this.tracing.close(); + ((ZipkinSpanHandler) this.spanHandler).close(); + } + + @Test + void should_create_a_span_with_tracer() { + String taxValue = "10"; + + // tag::manual_span_creation[] + // Create a span. If there was a span present in this thread it will become + // the `newSpan`'s parent. + Span newSpan = this.tracer.nextSpan().name("calculateTax"); + // Start a span and put it in scope. Putting in scope means putting the span + // in thread local + // and, if configured, adjust the MDC to contain tracing information + try (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) { + // ... + // You can tag a span - put a key value pair on it for better debugging + newSpan.tag("taxValue", taxValue); + // ... + // You can log an event on a span - an event is an annotated timestamp + newSpan.event("taxCalculated"); + } + finally { + // Once done remember to end the span. This will allow collecting + // the span to send it to a distributed tracing system e.g. Zipkin + newSpan.end(); + } + // end::manual_span_creation[] + } + + @Test + void should_continue_a_span_with_tracer() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + String taxValue = "10"; + // tag::manual_span_continuation[] + Span spanFromThreadX = this.tracer.nextSpan().name("calculateTax"); + try (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) { + executorService.submit(() -> { + // Pass the span from thread X + Span continuedSpan = spanFromThreadX; + // ... + // You can tag a span + continuedSpan.tag("taxValue", taxValue); + // ... + // You can log an event on a span + continuedSpan.event("taxCalculated"); + }).get(); + } + finally { + spanFromThreadX.end(); + } + // end::manual_span_continuation[] + + executorService.shutdown(); + } + + @Test + void should_start_a_span_with_explicit_parent() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + String commissionValue = "10"; + Span initialSpan = this.tracer.nextSpan().name("calculateTax").start(); + + executorService.submit(() -> { + // tag::manual_span_joining[] + // let's assume that we're in a thread Y and we've received + // the `initialSpan` from thread X. `initialSpan` will be the parent + // of the `newSpan` + Span newSpan = this.tracer.nextSpan(initialSpan).name("calculateCommission"); + // ... + // You can tag a span + newSpan.tag("commissionValue", commissionValue); + // ... + // You can log an event on a span + newSpan.event("commissionCalculated"); + // Once done remember to end the span. This will allow collecting + // the span to send it to e.g. Zipkin. The tags and events set on the + // newSpan will not be present on the parent + newSpan.end(); + // end::manual_span_joining[] + }).get(); + + executorService.shutdown(); + } + + } + + @Nested + class OtelTests { + + // tag::otel_setup[] + // [OTel component] Example of using a SpanExporter. SpanExporter is a component + // that gets called when a span is finished. Here we have an example of setting it + // up with sending spans + // in a Zipkin format to the provided location via the UrlConnectionSender + // (through the and + // dependencies) + // Another option could be to use an ArrayListSpanProcessor for testing purposes + SpanExporter spanExporter = new ZipkinSpanExporterBuilder() + .setSender(URLConnectionSender.create("http://localhost:9411/api/v2/spans")) + .build(); + + // [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider + SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() + .setSampler(alwaysOn()) + .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build()) + .build(); + + // [OTel component] The SDK implementation of OpenTelemetry + OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder() + .setTracerProvider(sdkTracerProvider) + .setPropagators(ContextPropagators.create(B3Propagator.injectingSingleHeader())) + .build(); + + // [OTel component] Tracer is a component that handles the life-cycle of a span + io.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider() + .get("io.micrometer.micrometer-tracing"); + + // [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel + OtelCurrentTraceContext otelCurrentTraceContext = new OtelCurrentTraceContext(); + + // [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC + Slf4JEventListener slf4JEventListener = new Slf4JEventListener(); + + // [Micrometer Tracing component] A Micrometer Tracing listener for setting + // Baggage in MDC. Customizable + // with correlation fields (currently we're setting empty list) + Slf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(Collections.emptyList()); + + // [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel's Tracer. + // You can consider + // customizing the baggage manager with correlation and remote fields (currently + // we're setting empty lists) + OtelTracer tracer = new OtelTracer(otelTracer, otelCurrentTraceContext, event -> { + slf4JEventListener.onEvent(event); + slf4JBaggageEventListener.onEvent(event); + }, new OtelBaggageManager(otelCurrentTraceContext, Collections.emptyList(), Collections.emptyList())); + + // end::otel_setup[] + + @BeforeEach + void setup() { + this.spanExporter.close(); + } + + @AfterEach + void close() { + this.sdkTracerProvider.close(); + } + + @Test + void should_create_a_span_with_tracer() { + String taxValue = "10"; + + // Create a span. If there was a span present in this thread it will become + // the `newSpan`'s parent. + Span newSpan = this.tracer.nextSpan().name("calculateTax"); + // Start a span and put it in scope. Putting in scope means putting the span + // in thread local + // and, if configured, adjust the MDC to contain tracing information + try (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) { + // ... + // You can tag a span - put a key value pair on it for better debugging + newSpan.tag("taxValue", taxValue); + // ... + // You can log an event on a span - an event is an annotated timestamp + newSpan.event("taxCalculated"); + } + finally { + // Once done remember to end the span. This will allow collecting + // the span to send it to a distributed tracing system e.g. Zipkin + newSpan.end(); + } + } + + @Test + void should_continue_a_span_with_tracer() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + String taxValue = "10"; + Span spanFromThreadX = this.tracer.nextSpan().name("calculateTax"); + try (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) { + executorService.submit(() -> { + // Pass the span from thread X + Span continuedSpan = spanFromThreadX; + // ... + // You can tag a span + continuedSpan.tag("taxValue", taxValue); + // ... + // You can log an event on a span + continuedSpan.event("taxCalculated"); + }).get(); + } + finally { + spanFromThreadX.end(); + } + + executorService.shutdown(); + } + + @Test + void should_start_a_span_with_explicit_parent() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + String commissionValue = "10"; + Span initialSpan = this.tracer.nextSpan().name("calculateTax").start(); + + executorService.submit(() -> { + // let's assume that we're in a thread Y and we've received + // the `initialSpan` from thread X. `initialSpan` will be the parent + // of the `newSpan` + Span newSpan = this.tracer.nextSpan(initialSpan).name("calculateCommission"); + // ... + // You can tag a span + newSpan.tag("commissionValue", commissionValue); + // ... + // You can log an event on a span + newSpan.event("commissionCalculated"); + // Once done remember to end the span. This will allow collecting + // the span to send it to e.g. Zipkin. The tags and events set on the + // newSpan will not be present on the parent + newSpan.end(); + }).get(); + + executorService.shutdown(); + } + + } + +} diff --git a/docs/src/test/java/io/micrometer/docs/tracing/TracingConfiguringTests.java b/docs/src/test/java/io/micrometer/docs/tracing/TracingConfiguringTests.java new file mode 100644 index 00000000..89e47409 --- /dev/null +++ b/docs/src/test/java/io/micrometer/docs/tracing/TracingConfiguringTests.java @@ -0,0 +1,133 @@ +/* + * Copyright 2017 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.docs.tracing; + +import io.micrometer.context.ContextRegistry; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationHandler; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.tracing.Tracer; +import io.micrometer.tracing.contextpropagation.ObservationAwareSpanThreadLocalAccessor; +import io.micrometer.tracing.handler.DefaultTracingObservationHandler; +import io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler; +import io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler; +import io.micrometer.tracing.handler.TracingAwareMeterObservationHandler; +import io.micrometer.tracing.propagation.Propagator; +import org.junit.jupiter.api.Test; + +/** + * Sources for tracing-configuring.adoc + */ +class TracingConfiguringTests { + + @Test + void handler_configuration() { + // tag::handler_configuration[] + Tracer tracer = Tracer.NOOP; // The real tracer will come from your tracer + // implementation (Brave / + // OTel) + Propagator propagator = Propagator.NOOP; // The real propagator will come from + // your tracer implementation (Brave / + // OTel) + MeterRegistry meterRegistry = new SimpleMeterRegistry(); + + ObservationRegistry registry = ObservationRegistry.create(); + registry.observationConfig() + // assuming that micrometer-core is on the classpath + .observationHandler(new DefaultMeterObservationHandler(meterRegistry)) + // we set up a first matching handler that creates spans - it comes from + // Micrometer + // Tracing. We set up spans for sending and receiving data over the wire + // and a default one + .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler( + new PropagatingSenderTracingObservationHandler<>(tracer, propagator), + new PropagatingReceiverTracingObservationHandler<>(tracer, propagator), + new DefaultTracingObservationHandler(tracer))); + + // Creating and starting a new observation + // via the `DefaultTracingObservationHandler` that will create a new Span and + // start it + Observation observation = Observation.start("my.operation", registry) + .contextualName("This name is more readable - we can reuse it for e.g. spans") + .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag") + .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only"); + + // Put the observation in scope + // This will result in making the previously created Span, the current Span - it's + // in ThreadLocal + try (Observation.Scope scope = observation.openScope()) { + // Run your code that you want to measure - still the attached Span is the + // current one + // This means that e.g. logging frameworks could inject to e.g. MDC tracing + // information + yourCodeToMeasure(); + } + finally { + // The corresponding Span will no longer be in ThreadLocal due to + // try-with-resources block (Observation.Scope is an AutoCloseable) + // Stop the Observation + // The corresponding Span will be stopped and reported to an external system + observation.stop(); + } + // end::handler_configuration[] + } + + @Test + void observe() { + // tag::handler_configuration_observe[] + ObservationRegistry registry = ObservationRegistry.create(); + + Observation.createNotStarted("my.operation", registry) + .contextualName("This name is more readable - we can reuse it for e.g. spans") + .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag") + .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only") + .observe(this::yourCodeToMeasure); + // end::handler_configuration_observe[] + } + + void yourCodeToMeasure() { + + } + + void example_of_setting_ObservationAwareSpanThreadLocalAccessor() { + Tracer tracer = null; + + // tag::span_thread_local_accessor[] + ContextRegistry.getInstance().registerThreadLocalAccessor(new ObservationAwareSpanThreadLocalAccessor(tracer)); + // end::span_thread_local_accessor[] + + ContextRegistry.getInstance().removeThreadLocalAccessor(ObservationAwareSpanThreadLocalAccessor.KEY); + } + + void example_of_exemplars() { + Tracer tracer = Tracer.NOOP; + MeterRegistry meterRegistry = new SimpleMeterRegistry(); + + // tag::exemplars[] + ObservationRegistry registry = ObservationRegistry.create(); + registry.observationConfig() + // Don't register the DefaultMeterObservationHandler... + // .observationHandler(new DefaultMeterObservationHandler(meterRegistry)) + // ...instead register the tracing aware version + .observationHandler(new TracingAwareMeterObservationHandler<>( + new DefaultMeterObservationHandler(meterRegistry), tracer)); + // end::exemplars[] + } + +} diff --git a/docs/src/test/java/io/micrometer/docs/tracing/TracingSpanAspectTests.java b/docs/src/test/java/io/micrometer/docs/tracing/TracingSpanAspectTests.java new file mode 100644 index 00000000..17d8bda4 --- /dev/null +++ b/docs/src/test/java/io/micrometer/docs/tracing/TracingSpanAspectTests.java @@ -0,0 +1,294 @@ +/* + * Copyright 2023 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.docs.tracing; + +import io.micrometer.common.annotation.NoOpValueResolver; +import io.micrometer.common.annotation.ValueExpressionResolver; +import io.micrometer.common.annotation.ValueResolver; +import io.micrometer.tracing.Span; +import io.micrometer.tracing.Tracer; +import io.micrometer.tracing.annotation.*; +import io.micrometer.tracing.test.simple.SimpleSpan; +import io.micrometer.tracing.test.simple.SimpleTracer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.SimpleEvaluationContext; + +import java.util.Deque; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.assertj.core.api.BDDAssertions.then; + +class TracingSpanAspectTests { + + SimpleTracer tracer = new SimpleTracer(); + + TestBeanInterface testBean = new TestBean(); + + Deque spans; + + @BeforeEach + void setup() { + spans = tracer.getSpans(); + } + + private TestBeanInterface testBean() { + AspectJProxyFactory pf = new AspectJProxyFactory(this.testBean); + pf.addAspect(new SpanAspect(new ImperativeMethodInvocationProcessor(new DefaultNewSpanParser(), tracer, + aClass -> null, aClass -> null))); + return pf.getProxy(); + } + + @Test + void shouldCreateSpanWhenAnnotationOnClassMethod() { + testBean().testMethod2(); + + then(this.spans).hasSize(1); + then(this.spans.peek().getName()).isEqualTo("test-method2"); + then(this.spans.peek().getEndTimestamp().toEpochMilli()).isNotZero(); + then(this.tracer.currentSpan()).isNull(); + } + + @Test + void shouldCreateSpanWithCustomNameWhenAnnotationOnClassMethod() { + testBean().testMethod3(); + + then(this.spans).hasSize(1); + then(this.spans.peek().getName()).isEqualTo("custom-name-on-test-method3"); + then(this.spans.peek().getEndTimestamp().toEpochMilli()).isNotZero(); + then(this.tracer.currentSpan()).isNull(); + } + + @Test + void shouldContinueSpanWithLogWhenAnnotationOnInterfaceMethod() { + Span span = this.tracer.nextSpan().name("foo"); + + try (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) { + testBean().testMethod10("test"); + } + finally { + span.end(); + } + + then(this.spans).hasSize(1); + then(this.spans.peek().getName()).isEqualTo("foo"); + then(this.spans.peek().getTags()).containsEntry("customTestTag10", "test"); + then(this.spans.peek().getEvents().stream().map(Map.Entry::getValue).collect(Collectors.toList())) + .contains("customTest.before", "customTest.after"); + then(this.spans.peek().getEndTimestamp().toEpochMilli()).isNotZero(); + then(this.tracer.currentSpan()).isNull(); + } + + @Test + void shouldStartAndCloseSpanOnContinueSpanIfSpanNotSet() { + testBean().testMethod10("test"); + + then(this.spans).hasSize(1); + then(this.spans.peek().getName()).isEqualTo("test-method10"); + then(this.spans.peek().getTags()).containsEntry("customTestTag10", "test"); + then(this.spans.peek().getEvents().stream().map(Map.Entry::getValue).collect(Collectors.toList())) + .contains("customTest.before", "customTest.after"); + then(this.spans.peek().getEndTimestamp().toEpochMilli()).isNotZero(); + then(this.tracer.currentSpan()).isNull(); + } + + @Test + void shouldContinueSpanWhenKeyIsUsedOnSpanTagWhenAnnotationOnInterfaceMethod() { + Span span = this.tracer.nextSpan().name("foo"); + + try (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) { + testBean().testMethod10_v2("test"); + } + finally { + span.end(); + } + + then(this.spans).hasSize(1); + then(this.spans.peek().getName()).isEqualTo("foo"); + then(this.spans.peek().getTags()).containsEntry("testTag10", "test"); + then(this.spans.peek().getEvents().stream().map(Map.Entry::getValue).collect(Collectors.toList())) + .contains("customTest.before", "customTest.after"); + then(this.spans.peek().getEndTimestamp().toEpochMilli()).isNotZero(); + then(this.tracer.currentSpan()).isNull(); + } + + @Test + void testForDocs() { + + // tag::usage_example[] + + // Creates a new span with + testBean().testMethod2(); + then(createdSpanViaAspect()).isEqualTo("test-method2"); + + // Uses the name from the annotation + testBean().testMethod3(); + then(createdSpanViaAspect()).isEqualTo("custom-name-on-test-method3"); + + // Continues the previous span + Span span = this.tracer.nextSpan().name("foo"); + try (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) { + + // Adds tags and events to an existing span + testBean().testMethod10("tagValue"); + SimpleSpan continuedSpan = modifiedSpanViaAspect(); + then(continuedSpan.getName()).isEqualTo("foo"); + then(continuedSpan.getTags()).containsEntry("customTestTag10", "tagValue"); + then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after"); + } + span.end(); + + // Continues the previous span + span = this.tracer.nextSpan().name("foo"); + try (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) { + + // Adds tags and events to an existing span (reusing setup from the parent + // interface) + testBean().testMethod10_v2("tagValue"); + SimpleSpan continuedSpan = modifiedSpanViaAspect(); + then(continuedSpan.getName()).isEqualTo("foo"); + then(continuedSpan.getTags()).containsEntry("testTag10", "tagValue"); + then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after"); + } + span.end(); + + // end::usage_example[] + } + + private String createdSpanViaAspect() { + String spanName = this.spans.peek().getName(); + this.spans.clear(); + return spanName; + } + + private SimpleSpan modifiedSpanViaAspect() { + SimpleSpan span = this.spans.peek(); + this.spans.clear(); + return span; + } + + // tag::example[] + // In Sleuth @NewSpan and @ContinueSpan annotations would be taken into + // consideration. In Micrometer Tracing due to limitations of @Aspect + // we can't do that. The @SpanTag annotation will work well though. + protected interface TestBeanInterface { + + void testMethod2(); + + void testMethod3(); + + void testMethod10(@SpanTag("testTag10") String param); + + void testMethod10_v2(@SpanTag("testTag10") String param); + + } + + // Example of an implementation class + protected static class TestBean implements TestBeanInterface { + + @NewSpan + @Override + public void testMethod2() { + } + + @NewSpan(name = "customNameOnTestMethod3") + @Override + public void testMethod3() { + } + + @ContinueSpan(log = "customTest") + @Override + public void testMethod10(@SpanTag("customTestTag10") String param) { + + } + + @ContinueSpan(log = "customTest") + @Override + public void testMethod10_v2(String param) { + + } + + } + // end::example[] + + // tag::spring_config[] + @Configuration + public class SpanAspectConfiguration { + + @Bean + NewSpanParser newSpanParser() { + return new DefaultNewSpanParser(); + } + + // You can provide your own resolvers - here we go with a noop example. + @Bean + ValueResolver valueResolver() { + return new NoOpValueResolver(); + } + + // Example of a SpEL resolver + @Bean + ValueExpressionResolver valueExpressionResolver() { + return new SpelTagValueExpressionResolver(); + } + + @Bean + MethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer, + BeanFactory beanFactory) { + return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean, + beanFactory::getBean); + } + + @Bean + SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) { + return new SpanAspect(methodInvocationProcessor); + } + + } + + // Example of using SpEL to resolve expressions in @SpanTag + static class SpelTagValueExpressionResolver implements ValueExpressionResolver { + + private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class); + + @Override + public String resolve(String expression, Object parameter) { + try { + SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build(); + ExpressionParser expressionParser = new SpelExpressionParser(); + Expression expressionToEvaluate = expressionParser.parseExpression(expression); + return expressionToEvaluate.getValue(context, parameter, String.class); + } + catch (Exception ex) { + log.error("Exception occurred while tying to evaluate the SpEL expression [" + expression + "]", ex); + } + return parameter.toString(); + } + + } + // end::spring_config[] + +} diff --git a/docs/src/test/java/io/micrometer/docs/tracing/TracingTestingTests.java b/docs/src/test/java/io/micrometer/docs/tracing/TracingTestingTests.java new file mode 100644 index 00000000..c2f4bb48 --- /dev/null +++ b/docs/src/test/java/io/micrometer/docs/tracing/TracingTestingTests.java @@ -0,0 +1,229 @@ +/* + * Copyright 2017 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.docs.tracing; + +import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.tck.MeterRegistryAssert; +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationHandler; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.tracing.Span; +import io.micrometer.tracing.Tracer; +import io.micrometer.tracing.handler.TracingObservationHandler; +import io.micrometer.tracing.test.SampleTestRunner; +import io.micrometer.tracing.test.reporter.BuildingBlocks; +import io.micrometer.tracing.test.simple.SimpleTracer; +import io.micrometer.tracing.test.simple.SpansAssert; +import io.micrometer.tracing.test.simple.TracerAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Deque; +import java.util.function.BiConsumer; + +/** + * Sources for tracing-testing.adoc + */ +class TracingTestingTests { + + @Nested + // @formatter:off + // tag::handler_test[] + class SomeComponentThatIsUsingMyTracingObservationHandlerTests { + + ObservationRegistry registry = ObservationRegistry.create(); + + SomeComponent someComponent = new SomeComponent(registry); + + SimpleTracer simpleTracer = new SimpleTracer(); + + MyTracingObservationHandler handler = new MyTracingObservationHandler(simpleTracer); + + @BeforeEach + void setup() { + registry.observationConfig().observationHandler(handler); + } + + @Test + void should_store_a_span() { + // this code will call actual Observation API + someComponent.doSthThatShouldCreateSpans(); + + TracerAssert.assertThat(simpleTracer) + .onlySpan() + .hasNameEqualTo("insert user") + .hasKindEqualTo(Span.Kind.CLIENT) + .hasRemoteServiceNameEqualTo("mongodb-database") + .hasTag("mongodb.command", "insert") + .hasTag("mongodb.collection", "user") + .hasTagWithKey("mongodb.cluster_id") + .assertThatThrowable() + .isInstanceOf(IllegalStateException.class) + .backToSpan() + .hasIpThatIsBlank() + .hasPortThatIsNotSet(); + } + + } + // end::handler_test[] + // @formatter:on + + // @formatter:off + // tag::observability_smoke_test[] + class ObservabilitySmokeTest extends SampleTestRunner { + + ObservabilitySmokeTest() { + super(SampleRunnerConfig.builder().wavefrontApplicationName("my-app").wavefrontServiceName("my-service") + .wavefrontToken("...") + .wavefrontUrl("...") + .zipkinUrl("...") // defaults to localhost:9411 + .build()); + } + + @Override + public BiConsumer>> customizeObservationHandlers() { + return (bb, handlers) -> { + ObservationHandler defaultHandler = handlers.removeLast(); + handlers.addLast(new MyTracingObservationHandler(bb.getTracer())); + handlers.addLast(defaultHandler); + }; + } + + @Override + public SampleTestRunnerConsumer yourCode() { + return (bb, meterRegistry) -> { + // here you would be running your code + yourCode(); + + SpansAssert.assertThat(bb.getFinishedSpans()) + .haveSameTraceId() + .hasNumberOfSpansEqualTo(8) + .hasNumberOfSpansWithNameEqualTo("handle", 4) + .forAllSpansWithNameEqualTo("handle", span -> span.hasTagWithKey("rsocket.request-type")) + .hasASpanWithNameIgnoreCase("request_stream") + .thenASpanWithNameEqualToIgnoreCase("request_stream") + .hasTag("rsocket.request-type", "REQUEST_STREAM") + .backToSpans() + .hasASpanWithNameIgnoreCase("request_channel") + .thenASpanWithNameEqualToIgnoreCase("request_channel") + .hasTag("rsocket.request-type", "REQUEST_CHANNEL") + .backToSpans() + .hasASpanWithNameIgnoreCase("request_fnf") + .thenASpanWithNameEqualToIgnoreCase("request_fnf") + .hasTag("rsocket.request-type", "REQUEST_FNF") + .backToSpans() + .hasASpanWithNameIgnoreCase("request_response") + .thenASpanWithNameEqualToIgnoreCase("request_response") + .hasTag("rsocket.request-type", "REQUEST_RESPONSE"); + + MeterRegistryAssert.assertThat(meterRegistry) + .hasTimerWithNameAndTags("rsocket.response", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE"))) + .hasTimerWithNameAndTags("rsocket.fnf", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_FNF"))) + .hasTimerWithNameAndTags("rsocket.request", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE"))) + .hasTimerWithNameAndTags("rsocket.channel", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_CHANNEL"))) + .hasTimerWithNameAndTags("rsocket.stream", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_STREAM"))); + }; + } + + } + // end::observability_smoke_test[] + // @formatter:on + + class SomeComponent { + + private final ObservationRegistry registry; + + public SomeComponent(ObservationRegistry registry) { + this.registry = registry; + } + + void doSthThatShouldCreateSpans() { + try { + Observation.createNotStarted("insert user", () -> new CustomContext("mongodb-database"), this.registry) + .highCardinalityKeyValue("mongodb.command", "insert") + .highCardinalityKeyValue("mongodb.collection", "user") + .highCardinalityKeyValue("mongodb.cluster_id", "some_id") + .observe(() -> { + System.out.println("hello"); + throw new IllegalStateException("Boom!"); + }); + } + catch (Exception ex) { + + } + } + + } + + // tag::observation_handler[] + static class MyTracingObservationHandler implements TracingObservationHandler { + + private final Tracer tracer; + + MyTracingObservationHandler(Tracer tracer) { + this.tracer = tracer; + } + + @Override + public void onStart(CustomContext context) { + String databaseName = context.getDatabaseName(); + Span.Builder builder = this.tracer.spanBuilder().kind(Span.Kind.CLIENT).remoteServiceName(databaseName); + getTracingContext(context).setSpan(builder.start()); + } + + @Override + public void onError(CustomContext context) { + getTracingContext(context).getSpan().error(context.getError()); + } + + @Override + public void onStop(CustomContext context) { + Span span = getRequiredSpan(context); + span.name(context.getContextualName() != null ? context.getContextualName() : context.getName()); + tagSpan(context, span); + span.end(); + } + + @Override + public boolean supportsContext(Observation.Context context) { + return context instanceof CustomContext; + } + + @Override + public Tracer getTracer() { + return this.tracer; + } + + } + // end::observation_handler[] + + static class CustomContext extends Observation.Context { + + private final String databaseName; + + CustomContext(String databaseName) { + this.databaseName = databaseName; + } + + String getDatabaseName() { + return databaseName; + } + + } + +} diff --git a/docs/src/test/resources/docs-generator-build.gradle b/docs/src/test/resources/docs-generator-build.gradle new file mode 100644 index 00000000..0eb0e1fc --- /dev/null +++ b/docs/src/test/resources/docs-generator-build.gradle @@ -0,0 +1,41 @@ +/* + * Copyright 2023 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// tag::main[] +repositories { + maven { url 'https://repo.spring.io/snapshot' } // for snapshots + maven { url 'https://repo.spring.io/milestone' } // for milestones + mavenCentral() // for GA +} + +ext { + micrometerDocsVersion="1.0.2" +} + +configurations { + adoc +} + +dependencies { + adoc "io.micrometer:micrometer-docs-generator:$micrometerDocsVersion" +} + +task generateObservabilityDocs(type: JavaExec) { + mainClass = "io.micrometer.docs.DocsGeneratorCommand" + classpath configurations.adoc + // input folder, inclusion pattern, output folder + args project.rootDir.getAbsolutePath(), ".*", project.rootProject.buildDir.getAbsolutePath() +} +// end::main[] diff --git a/docs/src/test/resources/docs-generator-pom.xml b/docs/src/test/resources/docs-generator-pom.xml new file mode 100644 index 00000000..4cfb20fa --- /dev/null +++ b/docs/src/test/resources/docs-generator-pom.xml @@ -0,0 +1,88 @@ + + + + 4.0.0 + com.example + micrometer-docs-generator-example + jar + micrometer-docs-generator-example + micrometer-docs-generator-example + + 1.0.0 + ${maven.multiModuleProjectDirectory}/folder-with-sources-to-scan/ + .* + ${maven.multiModuleProjectDirectory}/target/output-folder-with-adocs/' + + + + + org.codehaus.mojo + exec-maven-plugin + + + generate-docs + prepare-package + + java + + + io.micrometer.docs.DocsGeneratorCommand + true + + ${micrometer-docs-generator.inputPath} + ${micrometer-docs-generator.inclusionPattern} + ${micrometer-docs-generator.outputPath} + + + + + + + io.micrometer + micrometer-docs-generator + ${micrometer-docs-generator.version} + jar + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + false + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + diff --git a/gradle.properties b/gradle.properties index e7faccaf..035f82a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,3 +2,5 @@ org.gradle.caching=true org.gradle.parallel=true org.gradle.vfs.watch=true nebula.dependencyLockPluginEnabled=false +# Required by antora +version=1.2.0-SNAPSHOT diff --git a/micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/BraveTracingApiTests.java b/micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/BraveTracingApiTests.java index 4e81b033..10ea2fa9 100644 --- a/micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/BraveTracingApiTests.java +++ b/micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/BraveTracingApiTests.java @@ -169,6 +169,7 @@ void should_start_a_span_with_explicit_parent() throws Exception { @Test void should_work_with_baggage_with_legacy_api() { + // tag::baggage_api_1_11_0[] Span span = tracer.nextSpan().name("parent").start(); // Assuming that there's a span in scope... @@ -213,10 +214,12 @@ void should_work_with_baggage_with_legacy_api() { // Baggage is present only within the scope then(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3").isNull(); + // end::baggage_api_1_11_0[] } @Test void should_work_with_baggage() { + // tag::baggage_api[] Span span = tracer.nextSpan().name("parent").start(); // Assuming that there's a span in scope... @@ -257,6 +260,7 @@ void should_work_with_baggage() { // Baggage is present only within the scope then(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3").isNull(); + // end::baggage_api[] } @Test diff --git a/micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/test/java/io/micrometer/tracing/otel/bridge/OtelTracingApiTests.java b/micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/test/java/io/micrometer/tracing/otel/bridge/OtelTracingApiTests.java index cdd684f9..4240881d 100644 --- a/micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/test/java/io/micrometer/tracing/otel/bridge/OtelTracingApiTests.java +++ b/micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/test/java/io/micrometer/tracing/otel/bridge/OtelTracingApiTests.java @@ -163,6 +163,7 @@ void should_start_a_span_with_explicit_parent() throws Exception { @Test void should_work_with_baggage_with_legacy_api() { + // tag::baggage_api_1_11_0[] Span span = tracer.nextSpan().name("parent").start(); // Assuming that there's a span in scope... @@ -213,10 +214,12 @@ void should_work_with_baggage_with_legacy_api() { // Baggage is present only within the scope then(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3").isNull(); + // end::baggage_api_1_11_0[] } @Test void should_work_with_baggage() { + // tag::baggage_api[] Span span = tracer.nextSpan().name("parent").start(); // Assuming that there's a span in scope... @@ -257,6 +260,7 @@ void should_work_with_baggage() { // Baggage is present only within the scope then(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3").isNull(); + // end::baggage_api[] } @Test diff --git a/settings.gradle b/settings.gradle index 0ce5a99a..4c642df7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,7 +21,7 @@ gradleEnterprise { server = 'https://ge.micrometer.io' } -include 'micrometer-tracing', 'micrometer-tracing-bom', 'benchmarks' +include 'docs', 'micrometer-tracing', 'micrometer-tracing-bom', 'benchmarks' ['brave', 'otel'].each { bridge -> include "micrometer-tracing-bridge-$bridge"