prr-0.20.0/.cargo_vcs_info.json0000644000000001360000000000100117160ustar { "git": { "sha1": "f6c69745644e7160c3920e02f1f2f98745f383c6" }, "path_in_vcs": "" }prr-0.20.0/.github/workflows/docs.yml000064400000000000000000000021471046102023000155620ustar 00000000000000name: Deploy docs on: push: branches: - master jobs: deploy: runs-on: ubuntu-latest permissions: contents: write # To push a branch pages: write # To push to a GitHub Pages site id-token: write # To update the deployment status steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install latest mdbook run: | tag=$(curl 'https://api.github.com/repos/rust-lang/mdbook/releases/latest' | jq -r '.tag_name') url="https://github.com/rust-lang/mdbook/releases/download/${tag}/mdbook-${tag}-x86_64-unknown-linux-gnu.tar.gz" mkdir mdbook curl -sSL $url | tar -xz --directory=./mdbook echo `pwd`/mdbook >> $GITHUB_PATH - name: Build Book run: | cd book mdbook build - name: Setup Pages uses: actions/configure-pages@v2 - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: path: 'book/book' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v1 prr-0.20.0/.github/workflows/rust.yml000064400000000000000000000020131046102023000156170ustar 00000000000000name: Rust on: push: branches: [ master ] pull_request: branches: [ master ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest env: RUSTFLAGS: -Dwarnings steps: - uses: actions/checkout@v4 - name: Build run: cargo test --verbose --no-run - name: Run tests run: cargo test --verbose static: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: targets: x86_64-unknown-linux-musl - name: Install host deps run: sudo apt-get install -y musl-tools - name: Build + link statically run: cargo build --verbose --release --target=x86_64-unknown-linux-musl --features vendored-openssl - name: Validate binary is statically linked run: ldd ./target/x86_64-unknown-linux-musl/release/prr 2>&1 | grep -q "statically linked" format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run rustfmt run: cargo fmt --check prr-0.20.0/.gitignore000064400000000000000000000000101046102023000124650ustar 00000000000000/target prr-0.20.0/Cargo.lock0000644000001501100000000000100076670ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "addr2line" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] name = "adler2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "android-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] name = "android_system_properties" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ "libc", ] [[package]] name = "anstream" version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", "windows-sys 0.59.0", ] [[package]] name = "anyhow" version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arc-swap" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", "windows-targets", ] [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bumpalo" version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytes" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", "shlex", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", "windows-targets", ] [[package]] name = "clap" version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_complete" version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac2e663e3e3bed2d32d065a8404024dad306e699a04263ec59919529f803aee9" dependencies = [ "clap", ] [[package]] name = "clap_derive" version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clap_mangen" version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbae9cbfdc5d4fa8711c09bd7b83f644cb48281ac35bf97af3e47b0675864bdf" dependencies = [ "clap", "roff", ] [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "csv" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", "ryu", "serde", ] [[package]] name = "csv-core" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] [[package]] name = "deranged" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "dirs-next" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ "cfg-if", "dirs-sys-next", ] [[package]] name = "dirs-sys-next" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", "redox_users", "winapi", ] [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "errno" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", "windows-sys 0.59.0", ] [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", "futures-executor", "futures-io", "futures-sink", "futures-task", "futures-util", ] [[package]] name = "futures-channel" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-sink" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-macro", "futures-sink", "futures-task", "memchr", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "getrandom" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", "libc", "wasi", "wasm-bindgen", ] [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ "bitflags", "libc", "libgit2-sys", "log", "openssl-probe", "openssl-sys", "url", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "http" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", "itoa", ] [[package]] name = "http-body" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", ] [[package]] name = "http-body-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", "http", "http-body", "pin-project-lite", ] [[package]] name = "httparse" version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "hyper" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", "http", "http-body", "httparse", "itoa", "pin-project-lite", "smallvec", "tokio", "want", ] [[package]] name = "hyper-rustls" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", "http", "hyper", "hyper-util", "log", "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", ] [[package]] name = "hyper-timeout" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ "hyper", "hyper-util", "pin-project-lite", "tokio", "tower-service", ] [[package]] name = "hyper-util" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http", "http-body", "hyper", "pin-project-lite", "socket2", "tokio", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", "windows-core", ] [[package]] name = "iana-time-zone-haiku" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ "cc", ] [[package]] name = "icu_collections" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_locid" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", "tinystr", "writeable", "zerovec", ] [[package]] name = "icu_locid_transform" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ "displaydoc", "icu_locid", "icu_locid_transform_data", "icu_provider", "tinystr", "zerovec", ] [[package]] name = "icu_locid_transform_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] name = "icu_normalizer" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", "utf16_iter", "utf8_iter", "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", "icu_locid_transform", "icu_properties_data", "icu_provider", "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", "icu_locid", "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_provider_macros" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "idna" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ "idna_adapter", "smallvec", "utf8_iter", ] [[package]] name = "idna_adapter" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] name = "iri-string" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" dependencies = [ "memchr", "serde", ] [[package]] name = "is-terminal" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", "libc", "windows-sys 0.52.0", ] [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "jsonwebtoken" version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" dependencies = [ "base64 0.21.7", "js-sys", "pem", "ring", "serde", "serde_json", "simple_asn1", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libgit2-sys" version = "0.18.0+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1a117465e7e1597e8febea8bb0c410f1c7fb93b1e1cddf34363f8390367ffec" dependencies = [ "cc", "libc", "libssh2-sys", "libz-sys", "openssl-sys", "pkg-config", ] [[package]] name = "libredox" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags", "libc", ] [[package]] name = "libssh2-sys" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", "libz-sys", "openssl-sys", "pkg-config", "vcpkg", ] [[package]] name = "libz-sys" version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "linux-raw-sys" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniz_oxide" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] [[package]] name = "mio" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi", "windows-sys 0.52.0", ] [[package]] name = "num-bigint" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ "num-traits", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "object" version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "octocrab" version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68a8a3df00728324ad654ecd1ed449a60157c55b7ff8c109af3a35989687c367" dependencies = [ "arc-swap", "async-trait", "base64 0.22.1", "bytes", "cfg-if", "chrono", "either", "futures", "futures-util", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", "hyper-timeout", "hyper-util", "jsonwebtoken", "once_cell", "percent-encoding", "pin-project", "secrecy", "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", "snafu", "tokio", "tower", "tower-http", "tracing", "url", ] [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" version = "300.4.1+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" dependencies = [ "cc", ] [[package]] name = "openssl-sys" version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", "openssl-src", "pkg-config", "vcpkg", ] [[package]] name = "pem" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ "base64 0.22.1", "serde", ] [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "pin-project-lite" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pretty_assertions" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", ] [[package]] name = "prettytable-rs" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" dependencies = [ "csv", "encode_unicode", "is-terminal", "lazy_static", "term", "unicode-width", ] [[package]] name = "proc-macro2" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "prr" version = "0.20.0" dependencies = [ "anyhow", "clap", "clap_complete", "clap_mangen", "git2", "http", "lazy_static", "octocrab", "pretty_assertions", "prettytable-rs", "regex", "serde", "serde_derive", "serde_json", "tempfile", "tokio", "toml", "xdg", ] [[package]] name = "quote" version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "redox_users" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", "thiserror", ] [[package]] name = "regex" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", "getrandom", "libc", "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "roff" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys 0.59.0", ] [[package]] name = "rustls" version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", "rustls-pemfile", "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ "rustls-pki-types", ] [[package]] name = "rustls-pki-types" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", "untrusted", ] [[package]] name = "rustversion" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "secrecy" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ "zeroize", ] [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "serde" version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "serde_path_to_error" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", ] [[package]] name = "serde_urlencoded" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", "itoa", "ryu", "serde", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simple_asn1" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", "thiserror", "time", ] [[package]] name = "slab" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ "snafu-derive", ] [[package]] name = "snafu-derive" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "socket2" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "synstructure" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tempfile" version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", ] [[package]] name = "term" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" dependencies = [ "dirs-next", "rustversion", "winapi", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "time" version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tinystr" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", ] [[package]] name = "tokio" version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "libc", "mio", "pin-project-lite", "socket2", "tokio-macros", "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tokio-rustls" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ "rustls", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "tower" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", "pin-project", "pin-project-lite", "tokio", "tokio-util", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tower-http" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags", "bytes", "futures-util", "http", "http-body", "http-body-util", "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tower-layer" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", ] [[package]] name = "utf16_iter" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "want" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ "try-lock", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "write16" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xdg" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zerofrom" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zerovec" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", "syn", ] prr-0.20.0/Cargo.toml0000644000000035550000000000100077240ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.78.0" name = "prr" version = "0.20.0" build = "build.rs" autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "Mailing list style code reviews for github" readme = "README.md" license = "GPL-2.0-or-later" repository = "https://github.com/danobi/prr" [[bin]] name = "prr" path = "src/main.rs" [dependencies.anyhow] version = "1.0" [dependencies.clap] version = "4.4" features = ["derive"] [dependencies.git2] version = "0.20.0" [dependencies.http] version = "1.1.0" [dependencies.lazy_static] version = "1.4" [dependencies.octocrab] version = "0.38" [dependencies.prettytable-rs] version = "0.10.0" [dependencies.regex] version = "1.5" [dependencies.serde] version = "1.0" [dependencies.serde_derive] version = "1.0" [dependencies.serde_json] version = "1.0" [dependencies.tokio] version = "1.17" features = [ "macros", "rt-multi-thread", ] default-features = false [dependencies.toml] version = "0.5" [dependencies.xdg] version = "2.4" [dev-dependencies.pretty_assertions] version = "1.4.0" [dev-dependencies.tempfile] version = "3.8.1" [build-dependencies.anyhow] version = "1.0" [build-dependencies.clap] version = "4.4" features = ["derive"] [build-dependencies.clap_complete] version = "4.5.2" [build-dependencies.clap_mangen] version = "0.2.20" [features] vendored-openssl = ["git2/vendored-openssl"] prr-0.20.0/Cargo.toml.orig000064400000000000000000000017761046102023000134100ustar 00000000000000[package] name = "prr" description = "Mailing list style code reviews for github" license = "GPL-2.0-or-later" repository = "https://github.com/danobi/prr" version = "0.20.0" edition = "2021" rust-version = "1.78.0" build = "build.rs" [dependencies] anyhow = "1.0" clap = { version = "4.4", features = ["derive"] } git2 = "0.20.0" http = "1.1.0" lazy_static = "1.4" octocrab = "0.38" prettytable-rs = "0.10.0" regex = "1.5" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" tokio = { version = "1.17", default-features = false, features = ["macros", "rt-multi-thread"] } toml = "0.5" xdg = "2.4" [dev-dependencies] pretty_assertions = "1.4.0" tempfile = "3.8.1" [build-dependencies] anyhow = "1.0" clap = { version = "4.4", features = ["derive"] } clap_complete = "4.5.2" clap_mangen = "0.2.20" [features] # Statically link a vendored copy OpenSSL. OpenSSL is used by all of `git2`, `reqwest` and # `octocrab`, enabling vendoring for just one of them should be enough. vendored-openssl = ["git2/vendored-openssl"] prr-0.20.0/LICENSE000064400000000000000000000432541046102023000115230ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. prr-0.20.0/NOTES.md000064400000000000000000000035741046102023000117310ustar 00000000000000# TODO - [x] Parse review files - [x] Create parser - [x] Create `include_str!()` based unit-tests for expected comments - [x] Test invalid spans (span that does not have a comment that terminates it and another span starts) - [x] Wire up comment uploading to GH - [x] Inspect response error codes and body - [x] Fix bug where `line` and `start_line` are being set instead of `position` - [x] Check if `start_position` is accepted - [x] Add test for trying to comment on a hunk start - [x] Figure out how to calculate line for diffs w/ changes on both sides - [x] Add test for comment at end of review file - [x] Prohibit cross hunk spanned comments - [x] Support review-level comments at top of review file - [x] Manual test that comments on a changed file work - [x] Support approve/rejecting PRs - [x] Need some kind of meta syntax (like go's //+) - [ ] Think about if it could be generalized to comment threads - [x] Support updating a PR's review file, but ask for confirmation if review file has been modified and not submitted yet - [x] Maybe even check mtime between review file and submission time? - [x] Support parsing github url from stdin - [x] Save commit hash of downloaded review file - [x] Support [...] snipping - [ ] Support comment threads. Maybe do nested '>'s like actual mailing lists? # Thoughts * Make a comment spanned by inserting a whitespace line before the start of the span * To compose with back-to-back spanned comments, the latter comment must be assumed to be a single line comment. Otherwise, using a single spanned comment always makes the next comment a span. This kinda actually makes sense conceptually too cuz if the user actually wants back-to-back spans then they should've just used a single, larger span. * Need to be careful to prohibit a spanned comment over multiple files prr-0.20.0/README.md000064400000000000000000000014731046102023000117720ustar 00000000000000# Pull request review [![Rust](https://github.com/danobi/prr/actions/workflows/rust.yml/badge.svg?branch=master)](https://github.com/danobi/prr/actions/workflows/rust.yml) `prr` is a tool that brings mailing list style code reviews to Github PRs. This means offline reviews and inline comments, more or less. To that end, `prr` introduces a new workflow for reviewing PRs: 1. Download the PR into a "review file" on your filesystem 1. Mark up the review file using your favorite text editor 1. Submit the review at your convenience The tool was born of frustration from using the point-and-click editor text boxes on PRs. I happen to do a lot of code review and tabbing to and from the browser to cross reference code from the changes was driving me nuts. For full documentation, please visit https://doc.dxuuu.xyz/prr/. prr-0.20.0/book/.gitignore000064400000000000000000000000051046102023000134230ustar 00000000000000book prr-0.20.0/book/book.toml000064400000000000000000000004201046102023000132630ustar 00000000000000[book] authors = ["Daniel Xu"] language = "en" multilingual = false src = "src" title = "prr" [output.html] git-repository-url = "https://github.com/danobi/prr" git-repository-icon = "fa-github" edit-url-template = "https://github.com/danobi/prr/edit/master/book/{path}" prr-0.20.0/book/src/README.md000064400000000000000000000012111046102023000135010ustar 00000000000000# Introduction `prr` is a tool that brings mailing list style code reviews to Github PRs. This means offline reviews and a file oriented interface, more or less. To that end, `prr` introduces a new workflow for reviewing PRs: 1. Download the PR into a "review file" on your filesystem 1. Mark up the review file using your favorite text editor 1. Submit the review at your convenience The tool was born of frustration from using the point-and-click editor text boxes on PRs. I happen to do a lot of code review and tabbing to and from the browser to cross reference code from the changes was driving me nuts. ![](./images/introduction_vim.png) prr-0.20.0/book/src/SUMMARY.md000064400000000000000000000015541046102023000137130ustar 00000000000000# Summary [Introduction](./README.md) # User Guide - [Installation](./install.md) - [Install Binary](./install_binary.md) - [Acquire Github token](./install_github.md) - [Configure `prr`](./install_config.md) - [Tutorial](./tutorial.md) - [Vim integration](./vim.md) # Reference Guide - [Configuration](./config.md) - [Review file markups](./review.md) - [Prr directive example](./examples/prr_directive.md) - [Review comment example](./examples/review_comment.md) - [Description comment example](./examples/description_comment.md) - [Inline comment example](./examples/inline_comment.md) - [Spanned inline comment example](./examples/spanned_inline_comment.md) - [File comment example](./examples/file_comment.md) - [Snip example](./examples/snip.md) # Development - [Contributing](./contributing.md) - [Releases](./release.md) prr-0.20.0/book/src/config.md000064400000000000000000000063231046102023000140220ustar 00000000000000# Configuration `prr` supports two types of configuration: global and local. Global configuration controls global behavior. Local configuration controls behavior for the directory the configuration is in as well as its subdirectories. `prr` respects the [XDG Base Directory Specification][0] where possible. ## Global configuration `prr` reads global configuration from both `prr --config` as well as `$XDG_CONFIG_HOME/prr/config.toml`. It places priority on the `--config` flag. The following global configuration options are supported: * `[prr]` * [`token`](#the-token-field) * [`workdir`](#the-workdir-field) * [`url`](#the-url-field) * [`activate_pr_metadata_experiment`](#the-activate_pr_metadata_experiment-field) ### The `token` field The required `token` field is your Github Personal Authentical Token as a string. Example: ```toml [prr] token = "ghp_Kuzzzzzzzzzzzzdonteventryzzzzzzzzzzz" ``` ### The `workdir` field The optional `workdir` field takes a path in string form. Review files and metadata will be placed here. Note `~` and `$HOME` do not expand. Paths must also be absolute. If omitted, `workdir` defaults to `$XDG_DATA_HOME/prr`. Example: ```toml [prr] workdir = "/home/dxu/dev/review" ``` ### The `url` field The optional `url` field takes a URL to the Github API in string form. This is useful for Github Enterprise deployments where the API endpoint is non-standard. Example: ```toml [prr] url = "https://github.company.com/api/v3" ``` ### The `activate_pr_metadata_experiment` field The optional `activate_pr_metadata_experiment` field determines whether, prr is downloading the PR description as well as the diff of the PR. Note that the effect as well as the name of this option may change in the future. If this is not explicitly set to "true", it is considered to be set to "false". Example: ```toml [prr] activate_pr_metadata_experiment = true ``` ## Local configuration Local config files must be named `.prr.toml` and will be searched for starting from the current working directory up every parent directory until either the first match or the root directory is hit. Local config files override values in the global config in some cases. If the [`[prr]`](#global-configuration) table is provided in a local config file, it must be fully specified and will override the global config file. The following local configuration options are supported: * `[local]` * [`repository`](#the-repository-field) * [`workdir`](#the-local-workdir-field) ### The `repository` field The optional `repository` field takes a string in format of `${ORG}/${REPO}`. If specified, you may omit the `${ORG}/${REPO}` from PR string arguments. For example, you may run `prr get 6` instead of `prr get danobi/prr/6`. Example: ```toml [local] repository = "danobi/prr" ``` ### The local `workdir` field The optional `workdir` field takes a string that represents a path. The semantics are the same as [prr.workdir](#the-workdir-field) with the following exception: in contrast to global workdir, relative local workdir paths are interpreted as relative to the local config file. Example: ```toml [local] repository = ".prr" ``` [0]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html prr-0.20.0/book/src/contributing.md000064400000000000000000000012661046102023000152650ustar 00000000000000# Contributing There isn't much process yet, so this page is light. But a few things to keep in mind: * I highly encourage floating an idea before implementing it. So that we can avoid any potential wasted work. My (@danobi) SLA for providing _some_ kind of feedback is 1-2 days. * Tests are mandatory for any parser changes. Tests are currently kinda light especially as it's closer to API call layer, but we should be adding tests where possible. * All user facing changes must come with documentation update. Documentation lives in `book/` and is rendered by [mdBook][0]. Documentation changes are automatically deployed upon merge. [0]: https://rust-lang.github.io/mdBook/ prr-0.20.0/book/src/examples/description_comment.md000064400000000000000000000016401046102023000204350ustar 00000000000000``` > First line of description. The above line will be quoted in Github UI. The comment below will not quote the PR description b/c the review directive terminates the quoting. @prr comment > > The second paragraph has three sentences. This is the second sentence. > The third and final sentence is on a new line. > > Final line. Final comment; no quote. > diff --git a/ch3.txt b/ch3.txt > index 159cf1c..cc376fa 100644 > --- a/ch3.txt > +++ b/ch3.txt > @@ -20,6 +20,8 @@ CHAPTER 3. ATTACK BY STRATAGEM > > 10. Hence, though an obstinate fight may be made by a small force, in the end it must be captured by the larger force. > > +10.5. new line > + > 11. Now the general is the bulwark of the State; if the bulwark is complete at all points; the State will be strong; if the bulwark is defective, the State will be weak. > > 12. There are three ways in which a ruler can bring misfortune upon his army: ``` prr-0.20.0/book/src/examples/file_comment.md000064400000000000000000000040641046102023000170340ustar 00000000000000``` > diff --git a/ch2.txt b/ch2.txt This is a file-level comment on ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` prr-0.20.0/book/src/examples/inline_comment.md000064400000000000000000000040751046102023000173750ustar 00000000000000``` > diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. This is an inline comment attached to passage 4. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` prr-0.20.0/book/src/examples/prr_directive.md000064400000000000000000000041631046102023000172340ustar 00000000000000``` This is a PR-level review comment. The following is a review directive to approve the PR: @prr approve > diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` prr-0.20.0/book/src/examples/review_comment.md000064400000000000000000000041321046102023000174120ustar 00000000000000``` This is a PR-level review comment. You can only leave one of these per review. > diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` prr-0.20.0/book/src/examples/snip.md000064400000000000000000000004671046102023000153470ustar 00000000000000``` [...] > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + We snipped the top and bottom of this document so we can focus on the review comment here. [...] ``` prr-0.20.0/book/src/examples/spanned_inline_comment.md000064400000000000000000000050561046102023000211050ustar 00000000000000 > diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. This is a spanned inline comment attached to passages 2 through 4. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + This is another spanned comment attached to the newly added text, that GitHub will interpret as a code suggestion [0], suggesting the added text be removed. ```suggestion ``` [0]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. prr-0.20.0/book/src/images/introduction_vim.png000064400000000000000000003666721046102023000176220ustar 00000000000000‰PNG  IHDR`țmĐőś reXIfII* † ` ț  H H( 2” i‡šögThumb 3.12.42023:12:10 16:59:240221‘ 0100    `  ț H H( D. ÿŰÿàJFIFÿÛC  !"$"$ÿÛCÿÀX€"ÿÄÿÄ<!1A"Q‘Taq#2UĄ±áBR$ąđ%35brÁŃÿÄÿÄ !R‘AaáQÿÚ ?üémmi$M—Bu2Șśf'8nGáΧ¶á–Ò[CÚ<ńÌwdö|ŒOȃžšĄKXÖȚssfYźNŽ0hÔê'Èô#ĆSCsÒÎ#QAžyàƒÓ9ŰïZÎYÂ8uŸčĂˆ"ìé¶g<öùtš#„”Ê€—ŃÇRL«hìsÈ 9úŐæ’ÚE”Óql3jù»č¶ƒ·1Ï#Ö±ÖÉ(œ^ÀYہ\”ÛźĘ>s©0‡·ĘÒUޚ;„+âcFA3œ@gRîđ Œd)Ûő«'‡GÚÆ‹Äm]Kk]zTŽ„éęČ+”áp‘ŸkÙ¶F™5œ&†8ç‰ÚàHK ó?üźŠș¶{} śEČ?G§ŸÀfĄČËqvVrqÇf;æBŒùię+łÇ B©Ä•„!„=ûiûˆÓčúŐiï,ÙRKÂHÀÌqú êÒúÎ8‚Œ— éîÒ"?Ô)șȚŸ}}txșĆnŃŰ·¶9ÊbëÂ\€sôźŚÀ“ÉyÀĆgäyŠŃŽòĘ„‘îr •TÈSÌŒTë}a€«IÄà~‡9ôŠć霌ÖFE2<Ćh­Ę·xiî°•XőŚ;`ƒR›û1T’û9ń‘cöÍ7/OŸŸČiWäžł•Ęek¶Hìđš7\ô"Œ>ÈÒ08†ź€èÇʌÌDžTŚ=Ś#»±Ś”ÆJ†Ș”„(6ąáò‹)g’+ˆĆÄ϶,Á8‡9đïĐr­՚9 5Œ}çV‘p”]O@ńüV?àüVÉÜÙ\ÙMöó2œŸ -—ln:ùüêäÜł§‰‰ T,2xÏ@3ËækÏaGÙVŽ›„È"`͗đöMĐmżęß§Z•ű(»-ò3*ćW°j>CoÔíA‘JłÜ/}ÚOJw ßv“Ò‚”*Ïpœśi=)Ü/}ÚOJ Ô«=œʀô§pœśi=(+RŹś ßv“ÒÂśĘ€ô ±ÄžÇŸżžöïˆM=Äò4’ÊϒìNäíS=íÀv2Ę,ŰLŒNç<łŽu›rú€ ł6–mËëž‡ęæ”m.;Y„î3\B{šńSúČ:`‡:–XźcÓpÄ+ È@êœá‰?éĄčvŒ•čN9‰ÙŠüqŠ»vđĆ9–]`jC'…q·öă#jŠK#Yg•ÉN»èô6čÀòÛçRÒșłĆMo™Ë'j#'!]§lŽ|«łtÜ»Ê.­ƒvìtüyoV-€œž9$’怷euhĆìjćq°îśR–•œŁLì‡gŐ$ 8Ț–MYă qÜ6œšY‡^òȚ#đźM㥊WËï‰ŰiŽU€â‹Č7ƊƒGüJ ·ôœíćPÿ™Ž€†áąRâFC},ç ƒóô„Yâ©ß FîeI@9\° gŠÛŚ‚æNŰÿšB„FLŰÏŠjôRʘfk[É`•œîśŃ͝òžőʃßÖR%d“,?òÆۗ:X՞*ËrL€›šBău7,?\Tw7Ź»9”lpRvmțąŽ^SË+Íp]", |F-ZAä<;yéçQńșžx–KqÈűe“ˆDú€ßr?ĘOZXՙÛ<——ÈćMÌ»>uÏ~œś™}kq»E’#$Ï€»ÏŽb,žž‰í^ȚȚÛÜ]Êè2q~Œ;ìù|jčćWă ż^{̞ŽïŚžó'­q!€ƒÙÇ"œ ełŸwéćQUm~~|Á.DĆq3GLłcíûT–öŒVÆ|Gn‚I0ƒXGÎF­łœmÔV}Â鞐iӆ;hя§O•h}žŽžaۉqqĘ{|oÏNF>tícû@oŹP@ŚĘŠ"%Ž5g'Š>5àöô‰Śt·Ó>#ŽC@6ŁË–äs$p.Ž›TĂ&wáLux3žy瑏:šKhÀ…Mœ:‹2ÿÒ\áé†Ăă˧: ÓŽ;i,â@€DXAævśÆçÖšûfû{aŒà‹Xúœÿmjqž!„7u‘nÎx;B@;InƒqRBŃ[™ìíb t»?%úŽ2?۠ėŠ^Js—†_ŠÀU,*ú˜, Œ·[G' ˑžŽO/„P~*tè;…Ÿș Gëš Ü*`yWŹrÄà ô+ÊҘB” `y R” R”ÍÂxCƏț!±‹ ò7ęȘß àöìì~ŃđùCapË(ëÏlzR‰dŠËƒš€/ÚÆ??}âÆNy}+Ž‹ƒŹŒ}±`úŠ-$Á~{vçûR”1…"œ=€)¶eűŁy9ŒM«ŒpîŐ[”¶Žq},|ÿsJPł‹€łŸeżH—ûCł ynMVî6_™GéüҔSžÙ~e§óNăeù”~ŸÍ)@î6_™GéüÓžÙ~e§óJP;—æQú5=ż á’C#ż·…ŚđŁ!:öóŸŽ„Rpû‘•xŹNÀ`»:–Ë…đč„)?‚Őqï`O–ÛҔÿٓxűFsBITÛáOà IDATxœìĘwTŚśđ;ł•Ÿô ˆ±+ŰĆ.öŰ»Æ“h5Fż±$±ĆcG±WDAQ "ˆ”„—…]X¶ÍüțpQ˜]DĆű»Ÿ“srČo柶9ç]Ț›YÂÎÎB!„B ʄB!„ú\`‚„B!„Bj˜ !„B!„&H!„B!€† B!„B©a‚„B!„Bj˜ !„B!„&H!„B!€† B!„B©}đ‰-ïr+cîȚ2NćyòNŚ2g\*±àÔr“KYśrŠ>ÎKΈÌí1H„}iĂĐÔ#ôa|1ăÌ)ï›1y”ÿ"QĆ3ż!„úr°?I-|„I#ŠŻRêó WQ­”#ïžżš•)çùŁÌ‚cJ•œ`i[ÚP{€ï)ifÆ{|–SœŻAčîÍîmipr„èSf‹ŸŸ^æoΗ ç!„BšÁ°hêcÖRŹê͊Sq2%5v2[G(űÓűЇźciƒaêm1Š€ƒ±ŃłsĆGj±™ÔՃÎÙŹSü‰śÒ>}œŒßœ/Î/B!„Pƒ!H•ÛŽ<1 Ț‡:ęSSVPțœ'L"kÎx4 @šÿ^„ §Ö‘*ۏÛXƒAe¶ïùö'“©—é›ó…ÂùE!„j8lŠÌčËjč6wœ{k ÿ«ăb…„țSüŐűrs[Z•ÉMŰŹŻRŸ)Ł›ìÉì?HÎÖżĐU Ź8HCžHŒ¶KÌÍ(Ÿ1ĆelÌZ°€ÎĐ?ï!ÈjÄTš©„ˆ ,§w!”°Šć)Œ7ć ÍëËœ­«`ì§§È{ÔĐRĆŚ Š|Ҋ^‡{čĐæÚyBc”,Y‹YŚ>rS[Š”“Ʊü§[Œž<Ș–¶’Jgo9aœ’[ćc}OqçE„ön*>›(Ïfç„êG­Ś-”p„}4Ő ’ ΎáÛÿ^ÔŠ»’­`„­łžvœE€@ȚlžŰm ÜĖbIɂ(Ę˜ß “’ őj™ŚČŹĘ"I“Î ]!~ŹódłŃ“h’Đ›?i“òÉËÈŰ·”˜—3z6y§‡ù!Ó8żVsdŸŽßŁBŁ–gvœłÊ§\śgőÖü3IOÊđęÖąG”ŽłfES6s »Ìšš‚ô9?~łàá-Ö»{·8żđŸœ_„B}Ű@ä59uCæö}q—sÙ-N…oŃË)Đò~ÚryțàÊÒPęÈm……Ìę‘ ću)‘ú«Ć™T:Š*[Q+»Șw兔Ë;.“*Î b# Ê8"JCéGe<Ł`èÏòÒë[ٔ•Źùÿò›q(âŸæ©^êÄmç€ȘńȒFbœˆ=\9!~š9;ÚDÖŽUtE?1‰%ŚU6š,ń8ŹR 0‹Ïšrá\æÚšH[ÌŻŒ$œĆęś âőâ~ăJŽźœÂҌVŸN#üšń–*“á%ƒe¶•™Èőî~ĂQ˜+é,ôe]Næ·mBæ\֍9ÂR(­{+ôTï¶č†z5EæŽ/vŽÄ0E7n‹~±Le=NÒ혂7ÆüAQvSWX^Űx€â^,W=ŸlEă~JêŸ %KĂ8CäglQ:Ű9*I`«šoI±ädY!AłUȚc˘łM=bg-fXgX‘W7~§ńcčÊnąžă|{U†çś?;ż!„ú2TŒ€Êć=YnńâHi§5%#BK}QGčeWiÛ© :JpiŠ~±tSó &ü.}S.Ïàdgphșwń»Ë "ÎËÍT­––Kêü{š„méÇŁWȚnŒ3ŸŠé𘊱bg-đôÙaŁMŸ€$ČYÁnߔĆÜŚ+«Ô,œßÿîü"„Bè‹PőWyŹȚíQŚ.ŃMÖć ™§ĐžńÁj)łÒ'2ÏèW€Re:ÂòŃĐ:ăZ*œęGߐ֊”t+·5&2/èˆ+ö©Ńș/Ó>Q›éJm€s8…E cNU™"ŽŒÉPey nzŐ‡Ú©dŽˆRș~#±¶`\"ÒDú?z•W„@P¶žr2['î‹éÎZêeˆLŰI·„ŒsșE$Ć3€x†Ć>`±;ÈÌÙ4™z‰§l\îÔ\}œ _艌—€9 fŒL”€°ÀNiÀęÎ2ˆUn'ł¶ÂZiÈ%‹Sêr|ŽúXi?ΔPȚŚ}ńæ»TÈO #Ùme–ŒJWàüț—ç!„B_„*ŻùŠuۖ”].vëJœ6ŒwNółÚ€ƧɒŽJ™TKŹíńŒ‰P5ٚÓÓăMˆœÿYžÙ]ŃŁÚKYÖ*] SÒ+őHĆgjuFźŸűÊFłÄ­†”›;P\>M$UÍ`YÊ\ìYÉçyïìíQńŚQ}~-qGœuVÿŃęԔšÚŹb$ŒQ„oES©læ—ŐV/CdÒ^iÈąușńCŐ+eŸ €ò[:éÒąÆ^ŠO8KÙžŸBuŚűU>S3މœ—ÌK„!Ÿ2ꊐ…èżì"¶ęŠz’§4VRj]æ±úXi?Δ(OgËßțOEH2XŽŽJÏ âo 8ż#Îó‹BĄ/BE‚Äw/k»ŹÄœ'UrM?žżțË$í^iGPU "šÏáÈ>MŠÿiręŰÛÊÿ­ôt†Òš–CÔG~ê € œ7çőïO&ï2 Žd—Š Š%ïpDdZć"ÚÖ[Ș—Š›]œ•DńÁÙ[ú_‹ÛÎ,%hąÔ·P™ŽU˜ś‘:Z±J3ŰE©äëődáqŁ„q-¶çêÓM‹')=•q;čü°ÙĘۄ†z™#«ŰOÖ4>V2đČòy€NNÁ±Tšv’Z§ Nźâ«—Č~r(áő”ÈʂH[Xù ă83GŠŰą4pțJźÒ/T•ÈË.-uêH‹Č+'„«€ÇæSĄȘ°§Q¶R»1łÊ TèæÊUvă%M 91;uŐŻ°ĂùęïÏ/B!„ŸuÚćš‘çgvčLÔeš€›­Há=ęÖŹ`LNŸŚgĂ8ČNgó[Œę3°ŹĘŸČv Ó jcšXÛûČ‘żÛì’ŹžóŽÒ.œhe'y‡qșwaÇŚ…Úő(§i ŻžĂI·4]ÌÊĘNjŐűˆ’łÀ˜śK‰ërQ Yź>YÇd{nÓ7ÍȒșv‡Ì_ߟ^Ż2I€NțWeMfKőŒiZÌ*ˆÒÚl˜QÀj_â}\òf‹Ïćç*Áđô@ĂüŚ ÇțíQf…ËÄ-úH:ĄU"VÉżŒÇBBcœ#+b /ăŽ],i2©ž©šbVÁ=~\• "ę2_æ]f ҍ«tțJÓ83EV±DŻ^[:őW 2nVĘŒ“Șü$+ËÉ’ü'œÊÏ4öˆaœ”@dÿaöŰŹ€ëŹâÖŽô9ÿțtÁŁšÇ™č^œßÏf~B!ôe ììȘęJ#Ș‚„èp)·mąéÁ%|Æ7!„B!„țëŽ{YĘÿ/UԐŽćM 0žę ^e‡B!„jPő=bśĆaË;Ÿ,6|ÊËzÆ.+ź­ÜeZ©U±Î -~ !„B!ô‡ Ò;TìŽËœVĂ€íÇ(uô@UÄʏ4üĂ 9ŻĄ†B!„úèđ$„B!„RĂgB!„BH $„B!„RĂ !„B!„Ô0AB!„B!5LB!„BH $„B!„RûP Ś}îá}Zpê„ŐbŸDŰÆ~:šQ!„B!Tè‡b žu#[CȘ‘â&æGÂéúÓć߇UÏ ćak|X@è72{Ξ^­Œˆa|ążś~”ŻȘžŽkç9eÎ䁛Xè* ^> :Ÿç`ĐK)­Mƌ‘YÆnǏÚŁ­‹”W^”ö,ìÔîż.&ˆ+"ŚŁ^Í ÓiÔs”Qœ;4”3ŐcÉó.­œ)JĄMœ€i» çèêjÁ‘柈:żoÇń=âtüțü¶Š•†š]Z6tƒ:2Śê«QS& êîæ`Ì•ćœžwéÀÎŁ‘ÙŠÊ­rè>nÎ܉œžmșôąšR_5Ț«©ż”Ff쑊Ræ‘|sqŸuÇ~ígđ`ăđ%ç ߝAæR„B!ôq±€$IŠąê†oœ]xJő<¶ìĂŽëăQœ Ț·#…GTțŒă2ÀÇK_šN“IŸ»æ9焝;xVH™·8jџ­Ź–ÎÚöPBÆ=WîÜĐ]8î—(Ńsé1rÜÚöäŽUŚs5Ž cdÒjۚmKšD\;~UL»zńęŸfòÉ+ŻćQő«WBđŐ"żăœd‰a7Ž_J-Vò ŠóŐQ5ÔËmî󇯏cN䕣—DzÍz žś»“Ț‚Ù=-`éÓÂۇÎĆUdytyrêël‚ŽńȚ|è»ŻàUdèčĐ,…‰{ßÁł671\4}[ŒĂĂç.ž9ÔĘP\Xțnƒ5Ü«Ą·L‘5őˆč”q$ßÒi3mNw]E-óÆ\ŠB!„>26i1âŚïnßw-QüțË2J”ęè6ìŁĄ2ŁŽGUț„0èčv2™~éJŹÏ©“ĘJ.ݘóÛ]1 çÎßNß”gÊ<ïsłŠR ßip/łÌ€yË·ĆÉ.=(;t`âàn&çò™ÿŰŻ!2•}á籥慹ŠĘ†“1k~ëŐŁ ïZêQŻ&„AŚ?ŽłO=¶xéwżŒő‚>ÓżnRtù»ÙżEÓ@Zć5êđC§±>ę–_ʧ4‘Șä›GŽ–V«–ÊșùŸrÿ«O_ŚIœyòÛÉ5CŒżÚs[ Žqswîę]‹śĘŽț.`Q§{™1Efț2d¶Ó˜o†qĂBâzśŻs)B!„úèHȘűItaû%üśŹÖŒ†ŁgŒű} ‹ȘpśÒŠö•ŸAât^uę¶ï°FmÇÿŽËÿjhxxđùżLh-xł(%Í:N^ł7àú­đđ 3;ś¶ ”•ƒźl=vú©Ș΄!„Bè @šxnÍÔń ÿNm1ŻÿŸFŽhŸ%ÉąüfÎZ°ä»Śû?©áÀÛÍgëOƗ·,›5sé¶HŽç7›ŸïgBđ[ÎȚúûŒȚŠ©—vț¶Țï|vÛ„ß4{»äŚqŸćśŚÏĂ­ÓźìÙŽț#Ńd·Ć~ŸÓ›ó€ÊŸ¶ćÏpȘÛÂć-I ž —öçGïȚx&”źKKÒaw{ˆčt-‚ËăAyYćG{è2aF!áĐہ@—>œ_ÖtàÈÖșÍœ¶,x3JęŹmÔn ‡QÚ­»6țúż]_šô[¶uí0+Rs䌞+[;§/űmy/ĆĘ}Çąšë}ș­;čsRo'(‡]uêë%mœùÒçÏ^©@§ŐÔoúsïìŰx9íäêÀÒP`E…ĆOO_‡­)—c™š›ÊâbɛއŠ€ IÍ߯jś2«52s4ô—y$€ĐÿjæŹNy»/æ’ŐßfÂ\ŠB!„>‰ŠżĄ+ócOݟtvèì„svùż±ßwśÙžÍÉ-ÉJ|’ȘÛâ1VŐ/ ő“ę~Țq”€€€?w»{țŃ·G[țrCÏ‰ŁœU1[w:C7" 7ŸűŃC}é8zÉ$—Źă æíˆ+ ‰WȚ1~jÏ3+E4•{ăś­‡Ö.\>0ze„ë„^ŒšM›ÎgÔù/ïœ–Ă‡6‘Ț]œGšr2sh3ggń€âè˶MkK–źĄ> @Ać]ĘđŁę–őŸÿ8ż`=hDłÌŸûćBŠzeźLÜ?s4MUd-ą]§ŸéÛŐäâÙ|M‘ŰÍŠîúkŒ ŽąàÙ„ÿ}óg`ȘzëFCœïŽrŽćÈ_ čƒWí›ÙÏ͜OI„ƒŽűíșű\Bkš—%0@aAĄ €í‡šżžôçÁ°ùË;S@Ú țuÏîŻ.s$ÜG.\1ÇoóőóWfQ<»î㧏ëÓŸ‰­‰>Et Ih€.NŠ MŒx&hæžӗŒ šČ7Q„±ȚśÆfł+{đÇü-ś_?}?źÌâÄȱC\.ïMT1ŐKËe2àpčÙł:Š//;š ˆË•DźZ’r*©ąą;Á!ńklè3iđÁ[‡S+7ZÇuÒúŸ>ÛłrÍÇ4ÔçȚê˜{€ĄżÌ#I Ł: 2oX;éTXjé‡ú•ȘædŐÈє[–“’ZhòőnC*-%] ÓuÆ7čVz(ŠbüŚÎ͐ȚŒtźgĚ[žŚȘĘë=%Ą‡śüòèUŸDN±šOĘúœł6‘«‘%߉ʘ>±E3"QÄgŹ·ŽĘźŒ.++يȚŽyóê òâ a’ŁčLő–䂱}ŻžęX·ŚxPJŠæŠ JȘé-tQDHti?gGŒMžGŹóÛ"ïìȘ•GžŚqëso(Æ1—2dZÓÉóúoŠúÀÀÌÂ$E…ȘL„„JŠ6#„BĄŠ @u]șkĘ(ë»§7ù J,ù4?Áą(ȁ‘„% b…Ï65ŻxÝ*K˜­âè*łbŐș‘Ći2aŐL·Ü3Ÿá-æO^5íîì=ńuÚDà4:Žčòáæš¶ÊT„ÙÉńÙ€cïȚ- iÿƒ< HKg'*éń“7Û^tIôœxćà&ÍlY·őș îaüâĐÂՇ^©#r­B›È5 x<AS ê}^Wž©2RÒ)}k#ȚŸ.œËă čœҚ±ȚìÉ„zƒÆ{Km]R@iÒÂ͆JMźùU,‹yùÛT†ă8tʟ˿’\úy‰ïʂș}ïêsom(Æ1—2Ž$iÙŠ­-ÇÔńç}*Ś·àđ…詇gMșÂT:aW<ŸÓ!„Bè“až8ÒoÎń«O ?ćŸȘU‰1q’‘úő4șœG!èÖŻŁž: Č"ÂçÍ1©óćwEoœ‡ĂV(ŒfSWMošuꛝ§ăíőÚïțăŒÈ™;ăŽN_·Łś@;ɝ=7]!ôšOünŠ[iÄș+©!Ê/PȜš6áĂuEșîm\ÙÊ̜ €ËçłèRɛßÊ%-{îŹOˆŽˆ lSkcqVȚ›Æ]†őČąR.Ƌi ™ë}Tà>h€SVÈ„G5ć\5•ÒĆśĂăš%Ł'ŽÚû: â5őìb«HđĄÒTŻ,.,R4È«üê B @§Ćۑmš§ÛîӄŽ._V&}SÛÖkèW:„±1Ï_Í8vƒÖnûŸkù”Ջ7‡Őœ#ÖȘ>ś2aîc)ăHÒ%!ÛŸ{iđö유ûŒ•CTgŚïÊMOSć3”âOÆ"„B}Jl*?tߎśœŸgâà`mjlllȚÁž|ÇN}{òò ČR_ć1ç*Ž8üšB·ËęÖ۝HWYv>ČYi„ÿș˜J đ=äčmÆÆCvŚź„Çg—ë˜ÙčŽńh%ôžùžűnÓWMqž\°ÿ±”†ÄŁÿńŰëłjöĘÛbȘÿ(iMăȚœŒón\Œ+~ç0!aĐjđđŠÜRZÇÒ”KÿțíÌòź­ùăF> tqXÀUŸ-Țk·±O_œ%Ó±o?dÌˌ3[‚ h ‹žÄŸ‚éÓ~YÆż_Ä”nĘgp[=Q„WO3D&ô»źđ_`őìáÓäŽÌ"•aŁöœ{·1Í8·é\ ŒőŸA:\±r¶KŽĆËq~OȘ%»5—RÙWvČĂçś=VçźD Uf­œFz9Šûoœ‘Kiè/€äqžß ùáôŽXżiŻÁ=„ț‹_?ÆnœèÈRûç1‰iÙ"…ž[·Ț]A쎜!"€0èŒtÛȘȚ„OŻž őq·í‰<}晘ÒÀÆÉZŸ ŰNM\%@‰ł^f‰iś2«=2ĆÜ#æRŠ‘€iáă»ÂJM°Č™HŃòäû…4HKB!„ЧSęG8ë„Óvî^ßao7©Ă”5Š€aAw[Q’°aŐák ÇiqÔÖùßf͞:dìÂÁ¶Œ0íÉÍ­ śŸÓ zqä§_ –ÍđšőĘpEAòƒËŸKn6^wp€‘éҘ‹'#GuoÛĂ»‡GUšś*îâ﫞‹{ę‚ æz+ĐùI 9Ł„Äœšvj+-v`ɂÂÙsFšćaD”fÆßÙŸű/ÿGZ‹z•/Oț°Dč`ț˜~“:ë)ó_Ü;đĘöœNQUI!OìĘźïW–Æ|Uqæó»qg?yœÏș‘­Ą}# LB!„zl I’ąš†nÉGC˜xèÄyș;8ăÓöńÓŚK‹ƒ7Î.<„z[ö‰jD!„BèËB#~ĘŸl°«Á—č›DZöêßbźßÌùŽùQƒÔK‰’ŁœčÙ.B!„B€*~]8rɁŸȚÿòĘ{ùßâÿÄòšcÙȚ{ü˜țĘZ9[rĆÏÂÏìÙ}æi1ęÎu€MoŻÖÊèßnTîËąÓÄyÓwjjcÈ*/ÎK űËïjČ€ă±öúæzšRÌžÙéÇÆwŽć+‹ąțœùę…l €0l6hòdïžmŹ 9ćùɏnĘ”+$U©Ą^͑ ŚS|ÆômÛی+Ëü7ìÌî]OD&Cț8łÒ6`Öĝńoja5›{ìÀ„‚­cdsûțvc}/îë*ïÌ‘[**·Š–ÈŒż\YoÿÏęGÒȘNșžŚŠ+?ń·[rĄèĘ­<{Tû8#„B!ô9b€4ńܚ©áçFÌ]<Żÿđ+{¶țuá©èsϒhŁv=ŒRnž|•[ȘÓšûˆ±Ë¶Z*&/ż]„ć€cßțÍ€QkĂ+gN€ăžő›æÚżžäżóhž‚gbăÒ҄%U€2zŚì™ÌÍś›·Źw›ék:É/oÿù_©©-—G€nëy;¶Mj,yrőÈÙ|…ž]ëźfȘw‡«†z5EÖqŸć·mšmúS{N„ËM[ ™°ŰÏĆ`țŒÿʊ"BÊVyötę+>țu3ćìáa§||*,—Eù͜`b,0kÿő·cŹȚ«Z#?ÏH˂ŽvÖ,HŁž‘™WQR *§X6ö¶ŹÂ˜t1Cv€E˜Æ!„BĄÏ[ęoe~ìéő3‚ΝœtÎ.ÿá7öûî>WđŻe•‰ûgŽŠ©Š|`„hŚ©oúv5čx6żÒȘžćÒżŸłä΁È*K}nśŠœŽ“Ÿ›ę[­‡Ž47ùYn2™i?néà¶uśű,;TiǃŽ>ÿk—Ȱu>«źçŸÎŠŽíŻȚșšêeŽL:Ž^2É%ëű‚y;âÊC╇wŒŸÚóÌÊ@‘("$șüGÏ&{âTd#GeÌ©°< hIVâ“,àPĘż› 1EO* ll (ržŒăŸ™NGfMŰϱu°áyMOi+ÆqF!„BèsTćč#JaóœI?sû-Ûé;ÙI»‡’H=3[»·l- Űš”ÙÛìšü—/‹ÁŰÄžJ›9-Œú:Šn>šúÒEjR*eŚêèÖfŒŻ{ŁËïœ{Yù<aÔŸSsvȚÍS!čLÉC-ő2D&­»yș Ś_± ÔŰ)‹tZ”ueĐĆwC”Û{öpaœŸÜÁĂĂIń(äNóŠÈ2az.XÙZłH‹¶íŠó‹­Ûޱ"I {;ź8=œšۈŐÇJûqF!„BèsQ%a›ž ˜źOû&¶&ú<I@Đ)$Qùź{ÿ>ÖyĄÊ«ȚȘzqxćŁ5Ëîÿűșÿ‘cç#Ó„5dTfRČ€Ê瀙„9K%L2îˆÔV/Cd–5‹c6ÿèùUŻ” l]yóAùjÏÎûŸ'ȘH;gùĂÓw 5æG̑©ç©™Ž™­Wß¶ƒ«8âÄ­vÚ”1 (p°aPF]¶}Ș•öăŒB!„ĐçB ±ÍúMœé3Șł ó։”“N…„–j»„ĆśüŒêܛȘ8)ț „ ă^«vŻś”„ȚóËŁWù9Ćj>uëśÎU.â·óêe–y-đIőw(„7}çDžê4l€Żçü>xâĂżZőw컏ÜĐ2©ŹŠæĐ4c#ê­=2MÓ œÿŚś‡âȘŸì.N‘ĐâÈà{Ò_<=$&[uót•?Ű!Òf°˜"Ó„ÂôBvK»VvîÄ3żË1:ăVŽkińÌJOšžžW—çĐj+íÆ!„BĄÏ€0êștŚșQօwOoò9”XRÇś3È3coe~”ÒZ]ś0~qháêCŻÔ­ćZ+8U¶@ŻÓ€F©g‚”5DZšćż9êì‘Ț?ìűuúBï`-öźšąüBŠekkMB­gì4Ő[#U–0[ĆŃUfĆ>ȘeăŽßčWö‹§gŁJ;öl*»żțn”WöŐ=2)LÒ=ŹÚ·vÓMŒű8ï©A’Θö ÍhatF]ÚÏà}Æ!„BĄ†Až8ÒoÎè +vÖ9;j \>ŸE—JȚ<âCZöÜYżr‚Dvőꊗt#(©úA1’UéI%EvôŁW*–Ą‘Ą\хŸ€Źz{w7źćjŠzPYa‰tó“: Șô‚ĂyûôŽű^pdYc{ôh.»©ĘF sdȘ(=Cb`ÓŠ©MNܓ\UțÓž, ·ŻœŒäiU^HÜ=Œy~+ëęÇ!„BĄ†Á òCśíhèvÔ ]ô$öLŸöË2ț”ű"źuë>ƒÛê‰$•Vô„ÀĂ«3/~_p ›,WŸĘ?čœș ,’±ź}Ævbe_ž—Źà;4Čł4łhìfJ’œfĘzu3ÏÍËJK+š”óûźęmè/ÍŻGŸ(Pê˜7nÙČôì’íQ ő2GŠR|yn›±ńĘ”+áńÙć:fv.m«Wzÿfdé†aK M„Q«ïUʏx&ÖŠÆÆÆæì9ÀwìÔ·'/ݰ° +őUž”9ČJ˜–ÉéĘŠ™4üdČ T/?-ÙŁ?ûTFć‚€ÓÈ+g»äXŒçśD©]˜Ç!„BĄÏ‘ö/ûŹš^ùéWƒe3Œf}7\QüàČŚPQNšśôê@>ö ÉȘaGŒÊ~țąWÿńœÍ|J’û2æűêĘH8îłvù4«ŰäèłhCUòiSöœPĐą;›æ,~9kÚĐncçâÈJòł’œÌViŹWcd鳃‹fŠLš>¶ïˆÙƒŒžJqvR̝ÓUvąÊîßśdUèw_R)tÛč{}‡ ȚìÌt˜ČŠĂ‡­đ]`cd*7=Ł\ߍ/yüăîà.Ș‡©™•wÀèü€„‰QBbN„~iêÓ8#„B!ôY"ìììș !„B!ôYÀçAB!„BH $„B!„RĂ !„B!„Ô0AB!„B!5LB!„BH $„B!„RĂ !„B!„Ô0AB!„B!5LB!„BH $„B!„Rû&HœÎ«źGœ]܊ĘĐ ùŒpĘçŸxЧ§Ą[‚B!„ĐÒ4AȘBà”18üÀd‡OÜÙO^/Áłndk`hßÈ$„B!„ȚH’€(ȘĄ[òŃ&ž:qžîÎűŽ}üôőÒâàł O©žÇ–}ąB!„úȐ€Ćˆ_·/ìjPŻŠ^“œÛšÔŁ>„”ą”șŠŽìŐżÄ\ż™óióŁ©—%G?z%țrł]„B!„>*€*~]Ű~Éÿ=+†57zÏ,‰Đm1dƘŽfÄ/­­ą ÛL\śśĆ›áá7/Ú0Łł%«úU€MoŻÖÊè· *g ,‹NSÖìöżz3üÎí +·,äüúXÇcmHdTTTTTT„ÿ7Óv>Ÿ§‚Â#ÂC/onőzpĂfƒlŰwújHű° óoZÔDZÚĂPŐëŐ™0pž`ăÁsĄáĄŚęw­ë.xęčÉßĐÿ-*ŚÂj6śdDŰÎŃV$żïoaQî^ZŃțĘ#v”Dæőű%8ü` gőŒ6Ę ß6ܘyJ4śšöqF!„BèsÄiâč5SĂύ˜»xț^ÿáWölęëÂSŃçż Aśû~œ4áâá-'ćœ'ÎŰČUoŃLż˜*ÇËHÇŸę›IŁÖ†ӕ?·~Ó\û—üwÍSđLl\Zš°€*PFïš=ó‚čYă~ó–őn3}í@'ùćí?ÿ+5”„âò(Đm=oǶI%ÏBź9›ŻĐłkĘŐÁLőîpŐPŻŠÈ:îłü¶MłMżqjÏ©tči«!ûč̟wà_YQDÈCÙ*ϞźĆÇżn&°œ=<씏O…ćRČ(ż™łLŒfíżțvŒŐ»#UkäçiYĐŃΚiÁ323â*J DćËÆȚ–U“.fȚ€ÓÔ#ŠqF!„BèsT±'ĄÌ=œ~FĐÙĄł—ÎÙć?üÆ~ßĘgă 4ŻeIŸÇ&>‡’ĂÓŐŃQ€J&•Ső+ŐL_/Őwîś§…ÜKăÛ0bjßă±óß.ëY.ęû9KîˆŹČÔç6qoÊI;é»ùĐżŐzHKs“Ÿć&“™öă–nÛQwÏČCɊ·ę”>ÿk—Ȱu>«źçŸnć±ę՛VSœÌ‘IÇŃK&čd_0oG\@`HŒòđŽńS{žY(E„D—ÿèáÙdO|‚ €läáṌ9–G-ÉJ|’ȘÛâw$ŠÈáiB„!EΓwü3Ó)ăÈŹ ;ă9¶Ö <Żéá) cĆ8Î!„B}ŽȘźąDń6ϙôC0·ßȝŸ“4·ă|”â|HhhhèÍ3ËÚóOȚžźN=K” œ”©^ĂÓąÈàûž[»ÜÊÍkáŐŚQt;đA՗(R“R)»țSG·6c<ïE—ß 8śČҊŁöšłónž ÉeJj©—!2iĘÍӕHŒțŠe ÆNyűX€ÓȘ­+€.Ÿò ÜȚł‡ËëS„€ƒ‡‡“âQȝb1F– ÓsÁÊ֚EZŽmïPœ_lĘŠIZŰÛqĆééEuŰFŹ>Vڏ3B!„BŸ‹*ÏΰMÜLž5Ę»œnò•]»Ż§k^+Ÿ^6ś ‡ÂĐcц^)›Ś_L§(QȘŹž„šŃƙ™’·ù"'+æ›š SÊuïßÇ:/4đQyŐ;U/Ż\cŽfùÂĘă_ś?rì|dșކLƒÊLJ–Tùœ4ł4g©„©BÆ‘ÚêeˆÌȱłfqÌæœ1żê•r€   K"o>(_íÙĂyÿóDiçáá,xúNĄæU0FŠž§fÒf¶V\}Ûźâˆ·ÚMhŚÆ0 ÀÁ„AuÙö©>Vڏ3B!„BŸ u‚Ä4ë7qŠÏšÎ‚Ì['ÖN:–ZȘŐB–gÄÇeaêTJ•ç$Æ=NT}R-ATęošòj;~;Ż^f™ŚŸ(à] áMß9‘§: ›0éë9żžűđïŸVęûî#7ŽL*«ihšqpê­=2MÓ œÿŚś‡â”U?/N‘ĐâÈà{Ò_<=$&[uót•?Ű!Òf’˜"Ó„ÂôBvK»VvîÄ3żË1:ăVŽkińÌJOšžžW—çĐj+íÆ!„BĄÏ€0êștŚșQօwOoò9”XòùżŸ#=âaE’À±Č6'ʟçżY}ëuĐĂ(őLP‚ČæûiiF”ÿæšłGzÿ°ăŚé œƒgIÓÔuȘ(żbÙÚZ“Pë;MőÖH•%ÌVqt•Y±jÙžŁĆśCî•ęâéÙèŸÒŽ=›Ê[ŹMąÁ™Š éVí[»é&^|œśÔ IgLûN…fŽ0:Ł.ígđ>ăŒB!„PĂ Oé7gô„»ÿ3Ù§uÿŸ6êç€A—>ődqăćê »zuÓKș”T}WŠdUzșJ‘ę蕊ehdšĆÎéÂÇ_RVœœ»Śr5Sœ šŹˆ°DșùˆI•wĆçíÓ;â{Á‘e=ztìŃŁčì^p€v1̑©ąô ‰M›Š69qOrUùOăČ,ÜŸr2’g€eWț*śÁ_og^§·Àżÿ8#„B!Ô0ŰT~èŸőCœ[ŰóÜÇ(ešČÈfŠï&Ë3·Ræí‡MègđòŰ?!ê·ŻÎŒű}Á5lV°\}vÿäöêNt‚°HÆžöۉ•}á^Č€gìĐÈÎÒÌą±›)IršuëŐÍ<7/+-EXŹ RÎï»:ô·Ąż4Œùą@©cȚžeËÒłK¶G)4ÔË™J đ=äčmÆÆCvŚź„Çg—ë˜ÙčŽńh%ôžùžúŹ^éꛑ„†-54•F­ŸW)?â™88X››w°çß±SߞŒŒÂ‚ŹÔWyRæÈ*aZ&§w›fÒđ“É*Pœ|üŽldVüìS•’N#Wʜí’cńrœß„v=bg„B!„>GŐ~àôżCńtï“&łŸżdœK”čśÛ?ÄI_—‘æ=œ:ęBČjŰŁČ…żhăŐ|o3Ÿ’䟌9ŸzśÁRŽûŹ]~#Í*69ú,ÚĐ@•|`ڔ}/TŽèΊ9‹_Κ6ŽÛŰčƒ8ȒüŹä'łUëŐYúìàą™)“Ší;bö #źRœsçt•šČûÁwĆęY•úʗT Ęvî^ßa‚7;3ŠŹé0äak|XÆ™ÊMÏ(ŚwăEÆÆË@ÿ8;ž‹êajfć0:?)!Gb”˜S©_šzÄ4Î!„B}–;;»†nB!„B}đy„B!„RĂ !„B!„Ô0AB!„B!5LB!„BH $„B!„RĂ !„B!„Ô0AB!„B!5LB!„BH $„B!„RĂ !„B!„Ô0AB_3ÇôjëdƗć'=ŒqìŻżƒ_I”*­O”úM‡Ìž3źW+#ąDqáï}§ć«4ȚÇéúÓć߇UÏ ćak|XömUÍBC"-;hüŰÿúóOÛ ő<ëF¶†T# Ä+>iËjAè:ő›6ûëŸm,ôÈò"ዾšÀ‡.<-Š?@đ> lśĆț{ÆÛÖđ§JtqÙĐÿE©Çôóg„B}Ű@’$EQïw?aôŐą‡P·ę”úOačŸc§áÓ~Üăf>ɉd…†Òúà4™ä»kžsNŰčƒg…”y›ŁęÙÊjéŹm%V}ȘWÁûv€đˆ*Ń\űx ò ë»ÌjšV5Ô,4,vłAs|Œ¶]|.ę+ęU/-Ț8»đ”êyl=“턎ČnŚÊźäËđ'݈H„œK«n-śŸÿ0á?ű,PYáÿlÏ7 €Ží1Ć»yÖ”}/U@—'„Ÿę[Ăç6Î!„úR°H‹żțèxwûŸk‰â:ŠI„AŚoV )ęç›%ÿšÿ~ü$ænTâšę?.óŸœ0@܅Ąôtæ{æd@xNìVryÜßîŠi8wțvúź=SæyŸ›}4•9.•p<ȘjŽžk'“é—źÄÖ!]Điê5șy1…oȘkšV5Ô,40ÒÌÆŠK|ú]0ÍőRąäèGŸŹ=öęFt6HśŸ?sÛăòŠ ‚ű@9懟*ÿŃĆ݇ĘÎjŽw“Wá'ŽĘȘé‚ÏjœB!ôĆ šâ'хí—đßłbXóy1Ülé5Ÿ·$ÀśűKÓ>Ëv ș}ëÆ…ă~#ćO$6ŰŚÁš©ÔŸ>O?±œÜ[èŠî?W,óʟŸòT4őìjU瞀YooOœWŻü[‡üˆĐm1dƘŽf•·|šUs ęqr^s֛OŰî îVzž‡eŃiʚĘțWo†ßčt%àà–ćƒœß>Bž\°ńàčÀĐđĐëț»Vuh=”FÖéŒűïÓCN/jĆát^u-2******l“WEŁHłŽ“Śì ž~+<<èÌŽĆœ-ć»Ń Łî+‚/m\ăÔÔXȘ©^~ßßÂą*ÜœŽąęÛq § Ù:mۊƒŚn…^Ú=łcËaż ŒzÁor‹ŠFk«śh3iljLȘÒ“Ë+}HÓ4ŻAá‡}œ+ß@:ûŸs{ûHKČŸłPkŽ }œt;.=tuûŰFűŒ&B!ôÿ€‰çÖL ?7bîâù{ę‡_ÙłőŻ OEZl,‚Żș·H ț=ŐiÚȚŐ=łvݚ›Đr‘ߎƆY çž”ïÎc(mŠ ©’śm5Áćń ŒŹò™șL˜QHŽiìÀ‚șmАƒŒÛCÌÖkiőĘKi˜V5Ü,é8nęŠčö/.ùï<š§à™ŰžŽ4aI+ŽAéžÏòÛ6Í6毩=§Ò抭†LXìçb0Țeő‰ŹH8u(‰$-=gÎì&čșíxL•ęDü–ł·ț>Ć!?òÔ΃IćŠG-ę֌E@ú;ĂæÔÄJßœÌIÈź6Æ5–jȘWć7sV€‰±ÀŹęŚßޱz7&ŻÓŒIAnȚŃꛄӷűć<<üÇV»ßNßùÌÏĄeZŐ{Ž€ŸJ—ł›{zZ]Íźš'Òą° ĄĆ[ v;âśDQ1îžNŠG›Ăr©úÍCGƒŃGg čÚê MŹYđê?»ĆŠBĄśTń’e~ìéő3‚ΝœtÎ.ÿá7öûî>WÀür¶s3§Č„c9nC‡6~yfő©©úeŽTRȘÌÏ- :»žYÔ^ÚÉԈÉûź=T9™9Ž™łł€x’ŻNGX¶mZ[Čt őYuy°†ÓrűĐ&Ò»k‚óŽj ÉáóŰÁç@rxș::JPÉ€rȘaZŐpłÜ&îM9i'}7ú·Úw…tœd’KÖńóvĕ†Ä+ï?”癕"M'Œ"+…ŃŚ„,ë±3șÄ_œRT)aè9q”ł*fëâïNgšàFdáæ?zŒ„J;żyÔ%7ôY”Í„ÚJ™ë %Y‰OȀCu[\}áÔË«ÿœ M{Ùnrż‘’kč‘ÒŠ•W«ÆÖdhŠœ6cőm òźí<ĐÏoȚO‡u;uűHÀÍŃÛriô„ÀÌA^CÛï{% í=<ețV@Ôcg?HĂh$3#?ú8•sí5t ńèÿò3z!„zOUސPąű ›çLú!˜ÛoÙNßÉNΗpMÍ s őíìć)ÉB }C}ąŽŽŒ tMJA›G H=3[»·l- Ôù•qójŹČĂ̟Šus2302wî<~톯U4­ąëöl…^go/됋%ZĘÇùjĆùĐĐĐЛg–”ç7žŒ/(44444p]†jŐGŸ&ŠÔ€TÊźÿÔŃ­ÍȚ}Ś2iĘÍӕHŒțŠe ÆNyűX€ÓȘ­«ïNdˆÌŒĘŽ»ž"öZPœ€§óÂÉȘő”.Ižqúrl~͋qæÒśŁHOÍ€€*Sò—/ÒT@K$„ ŁË'Ž«śksùó#‹§.Ț&k;헿Ïùo[äćŹWq4TńìòŐF=‡v3$H[Ï&ćQ7îš_pśȚł čG”F*ȘAęÇhIÒ̀‹Č1?B!„ț?ȘČ,`›ž ˜ú,0Rœ8ŒrŃšć wŒ|Ęÿȱó‘éê#†,;kÇlțŃó«Ț#ۚśÓ"3㘘‚H(ŹôȚ@ivVŃz'A=ĐÒđˆÄá IDATÒ2P*š.“”R@SIÔsŹ4Sd?8±>úü߇Nš9e̚ęœ—ÎÛ[JP©Ś.ĆN]8Ž·ÙÍóy`Ęœ‡kéĘŁ‘OŃœś,0ś(‡q4êÙŚ†g„B} Ô KĐŹßę>Ł: 2oX;éTXj©Æe-“–Óșz:„śŸgpŒș}e+íَWÊ·sphÛÆ.9.šŹ]›ZKț«yńO‹ïűyŐč7ûXTqRȚÛS0yww.đ>dŐÈє[–“’ZhòőnC*-%]óoœAÚđțŠû|šŽ,ŐÜ€Œűž LJ©òœÄžÇ‰•+üô­úèłđ.6§JR­ȚôyȘÓ° “Ÿžóûà‰ÿțiŐß±búő‹€śÿúțPÜ;OŸ§h~‰12#šŠhȘÊe*eÆÿŁQ)ß „B©Źz:Żžc„Z*ŒjSôÍÇŽŹ;„Ś‰Ç—‹h*7äÂĘ談xÙ^<źêȚŁ©űÎĄ{„oozÏY`î‘!0ŽF=5ô8#„Bè?Ž @u]șkĘ(ë»§7ù J,ŃvSA‘•Q`ŃȑśâÌȚÀŸë¶\R·ïÇ_Vl<ê™u~ćÆű¶CgŚZș^›wÈ3coe2] *ÍNŽÏ {śnIûhś(pšÚ\ùpłŠ­ČșúŽ­úšł@Q4,VćWčYXœû7~Zšćż9êì‘Ț?ìűuúBïàYGÒ(U–0[ĆŃUfĆ>zÿń­1rETÛqPä‹ÀÈҒPńú ¶©č Ț·Ț¶©æzëヌ•–šÂ'qé*S3cŠh ‹#.Ę,ȚÒżżóÍÏfఃŃû=f±G€á‡ï–V>ć8#„Bè?‹ @pxâHż9ÇŻ>-Ôv#ć5erlœlˆçWú7BÖOČߜSœ] „ÈiĂOđJsE2>ÁTú!ÿdLè5ŸűĘ·ÒˆuW4üÜPeșœÚIîìčùA4ùä­úšł •AgńŹ€ÂŽ{ﶕ~Ζd‘”êÍ[ȚČŁœR t02$(*+",qȚÜ“:_Țxśíóï‡ĂV(4fbˆ\q‰ŽTJ‘Öv6lšü[șȘĘ8ÉÈNęzš]ÎŁ€tëŚQŻZ:CÜ pÊ čôšŠì•©ŽæzëCÛ±zŸ6ł9JĄxûiÒŠ]#–"&ëínŹ4úâőÌA=œÇ‰ZĘÚSùunï; Œ=j°íŒz~'B!ôÿ€ÊĘ·ăœn–>ž(öó™ȚæŸ_LI¶z݇’æH5—ÖaĐjđđŠÜRZÇÒ”KÿțíÌòź­ùăF~Ő?iÿő¶żŠ;§ț3ï›ăï$)„qï^Æy7.ȚŐ|\štÁč…=Ï}­ú˜ł |Q8dàŒÿ}kp橈kŚiېF…ù”ș˜ćêłû'·Wwą„E2–À”ÏŰNŹì ś’•Tj€ï!Ïm36Č»v%<>»\ÇÌ΄G+ĄïÄÍś4­F#«;‘őR5sÔȘ5ćw… ]3ăąđŁ!Ż(qűQÿ„n3–û­·;‘źČì0|dłÒJżj€ÓÈ+g;gšŸż3ŸúűJk«x&ÖŠÆÆÆæì9ÀwìÔ·'/ݰ° +őU†îj7VïÓf–ëÌę:æÇÆżÌÈÊ+Ąœș Ô^'Íß?ŒÒ7L™pùrÒŚsGAŠÿȚ'•ŠŠłÀÔŁFCƒ>Î@6žvđÈ\—€ż&ùÂŚ|#„Bÿïhń>1Čžż7_èŽeÓvœ}șę,ŁX„kćÚĄ§‡Țœ]çTÌ„őm9ÏŸû„ĘlEIvrLÀ†U‡Ż%T;ÈvtmjlPvóßjGÉH›ȚuҎ_Š©ûS8Ÿ[«>â,Đâˆm+·‘‹Ÿî?ś»Ąćč‰gÖ.zꅶș˜Ê~țąWÿńœÍ|J’û2æűêĘTä^ÒgÍL™4}lßłq•â쀘;§ƒ’Ž˜{ ‘@őâđ?rû ·ž'Ÿ’äÆ> Oű{ù2éąùŁG-êÁ+M»vę’äÁ‡WW} Ÿ”#1zž”[S&ÊXZKœœ¶sśú{ûŁŁŠŹé0äakü ©ĂڌŐûŽ™ÊŒŒćܧU—ĘÍ:P–ŸuۆȘüŰ•|ăÙìŠF!Ań•w‘ë3 ő™}FœëĐۖEe?z˜ÙB!ôÿagśìĘw\çđç.›•ö-8pàÄmmŐșêš{ŻÚZG—«u¶UkíŻjmĘ­{ï=@ÁÊȚB Ùwż?Ią ÏśÓ?jŽŒyȚśčńŸwïĘčÖźÒ:àłč_ïĘDÈ"€Vć=żŽùÇ_.–ô-ô/51ÒsÒÎ}3'Ÿń[Dę™@c’šêqP`ŃsĆŃU^G&MÜaà%DïÒgڞ=SžgŽȚôŽfłŽB!ô.šę©É:9ۘQČ܌,±ČҕœKMÆòŁ”§t?fŐ_€”_§–Ž<ûŽcfŽ)șòíĆ,ĂĘñèÁ‰ ‰Ű!„Đû©źź !„FÓé»țœèMŠăníYłîèsĂ/?C!„zçá !„B!„tHĂ‚B!„Bï !„B!„B!„BHH!„B!€ƒ$„B!„ÒÁB!„Béà©FX‹/Ț莎3ëmR/ÔÏÖ`.Ÿr|nËZœ™ĘbÖȚ˗vNiVŸn ż™ûCBËę҇[ËXQ}‚ùE!„@­z‘šța:ŽŸ=ő“ΏVYu[ę¶Ăi Ž“‡‹„ćaςšČF€RÏțäÆŃ‹ù”„œ[Ó6íŒŰŐ~tÌ&ęgNáÿqêRtŒ¶ȚHÉTÁƒ»‚Čf6n­?űhÚ/Œ—Oüárž)śSFć·úújÏmȚź2~ôë™čŁ Żë5!„Bo€Žșj‰ûM_ˆ‘à0©A#mÚ{AäÖćëś§żß©Źu_LJ…ŚE$Æ!,»ÌY2Â=ûÄś_țv;ŻthK]'y$mل).j˜ŹdZòâÚ±#QZŰûߝ„Ö~8Ž—ęŐĂYoyœÖS_ZsóXì#•Ï™…­Û4b„Çá „Bša"šÂ§aą¶óvÚțí ŠüșŒ)ÉČÿú ƒŸ7e”}Âl1ç蝠5}yș3ì;NX¶őĐùëÁ·o]9wtçŻ_śś~yŚaéÛï‹5;O\ș|ăâĄ-‹G¶ËĄíˆykț>rțzđíàëçlZ8ܟOè–.ŸxkĂ €ŃK·:#8űêÉ+ÆŽ@>Zs%xïïòżCzOÙ{ûÖŠOtj”€sÏŚï;{=8èò±­‹?mjI”ę1Ś­çŽ•œx#èÆĆŁ­œö;€ÓcĆŐàăĘ*ĆoțŃڛÁ ¶.-àw]tôê™5«ȘȘț„L @R(©8>hž­ńșh-mŐzìÊ]§Ż_?œû§©e+ĄŸÖnŸ_‚ÊnBčsæÛ¶oæț*Ò¶śˆȚ6ù7ęùrt4U–ÈjZôgxsw9}éڑŻZČX‹/ÜŐĘ^łöŁÒŻWż•‘Ž~œrqʀÒTaĘsÙé+›Gș3Œ)čźĐÒšg ZRh',ÛJôîȘß«Ț#UËÈúÒ2‰T,VuëYûùݜß4ÒïțD!„ê-&ÈcN,›|bèŹčłÿ:4űÜöß·z&~'jIśÏVŻŐ(öÌĄ?ÿÍUs„Î>țB†ŒŽƒÈk1}ă“\R/Ț~8UeÓò“1s7úXÎț|ÇsĂsWh~›~Ęű‰Ś\Jʑń<șčàwőűŻOéN@3›Où}iÆőż.Ű ±h:ä«_źeçY|Y$:uŁđŚțšïÛűT]e·î^êđuA90€&|&üÒQûđđÖ”EÖm†ŽűÍzŽhÌò›…4.Wo[Ô^ztŚú‰™Ï#ÆęŽĘęôŻ§§„dB{W'€P‡oËg«‹òĆ ŠáÜȅ!ŠH-ÒŻÆŽ6àeGBćłćú—Ÿ{­ńșHëŸßŻ–ż8œśŚƒ*ûöCÆNęőwóŻŠmŒ(6ÔÊЍөZ lێúf„c-Ă0·e{váőëdUW§Ú–L-ÙZȘÍ :5äđî8’tè>mZéù?öGPYOU%EëÙÊšŹ żțŻÛîæ|Ę/láčlŠtŸ3ÿCnŰokŽ%kišä:Ätrq$”9™čŽĄ˜ÁĐ^ć”lIِVŸ.Ac'$œßyBĄú«ô! šŒGGVOœr|àŒù3·|ùŸ [?É7ńvă~Ź”ƒÖí~^é—HśáóÆùdîÿâóÍOŠ.]‹ÒìĘ qÿÛÚąûo}zp/_“ËĂÎ\ÊèÿŃÀ¶? •șuśV>ű9(_W!đ杚9m[”.‡Ú^Ô„WśæM9/pÒÌÎìë§}s<ƒ€KƒSŚï[8cF+?†Š€k,­(đżyÏ4ŻŽ}ÓÇüĆrqs‚ô“ie}%*ćäș•rŸœ‘š*ê„)›Í"hŠą*¶OĂmŚfažŒaÖśGÒ)ž”Âúï§Ąûìt:Öߎ43æi&°š.sßۉŽsqâPéI©UgU_K^—èË`zۅt†ÓÈ©óŸ\=ź üșa`+Łr.ŻÿœÛîćsŸî¶(ÄwÎü8ĄkŚžLÓ€FÉ”F0̄ööÀłńì0lö0çÜ+^ÏŁ ÇŹwŻR FŚ—ą(`±YU_„Č/ü¶Œn&č†ÏOA!„ê­ =(qÔ©u3Ç-ŒÊî»àÏ ăœL= D—Lč~8qx+ÛWg€N]șû/.]LbXê0>óZűőä=șü ÊKH(kĄuY4ÏCî‰JÿB™žC± ԑgÏÇò{ìbE.Ęș7V„^Ÿ]XVžæĆù3/tW±hQTdĆ Í `6éÔAšžærFiŸÊșrúŽÌȘC—–,ezj8ș81Hû€¶n…y…N­[;’€}#W¶$5”à搀.zqùÈÙGŐ܍^íRŠ™[ëúy+ŸĘV\ék ”5^—êŃĆ+„?L‹ï^œ/ć4oӌmTkŒyڌKĐrčąÊ.·Ț–Ô}R}ő1Œ•QyW7lžȘî2gé?|ó'dÓŻg3Ț̅ÒeŰú§O8Žó·ŻÚæ\ôÚ[bژ˜őìUȚmÌĂÇƎœÆŽhïigQ9ZwęèéY8>B!„êŻ ƒ аùÇă§OÒÖ,țܖ­SMĘÒÆî]ތżìë9[Ž~|ńĐŸÿNȚMŐ=ŠáìêÄ`ÙÎțśòìŠßQ LƒĘ ŽkŚŃ“?ëʶ±‹Đ‚Ă :‘|yVW™—ûȏ_Òc&Ȓț$•|áÌŁ‰söČœ~2œșöđ•ĘùśnčY_Șôޜ—MŁQiHƒ¶œƒ5“š^țnUZjĘËȚÁŠ~–œAÛș8Č-\ÚùJBÜl3ŠMk«Łùnΐ~%­Ö§ș™-?ßčy8?ăÖæ9?©”žś­5€.ÌȐŸŒQ™Ksml- PÒ[ăÍŁ•r%Mpy\ąȘÇKèmI ôfPc¶2:ÿÆïż]ȚûsżN…7Wțzá=$Êœ±éŚs©ÜVŠÜKWłžœÊ‰;ëÌÒ/˜‹VÍÙžêĆoû­ÀGí#„B Žn€Ä4é;vڔa‚Œ›–;”,3M—‚ÉȘ0$S§_ß0óîᎃƌ5sꀱw-]Œë‘„ iäś·}żûIĆiGtaąÁ[ëo]Ę]zcïöáIyRĆh:ńśïœËę‰V[}GÊčvêÎŹ?ùÈćô~mŚ~’Û»ï•ż7DŁ©źODƞ6%ÿŠeé©"ŠżłkKŚDäÆłŒÏŸmăoéh.OMÍ­uŻS{üç•9ęÆMš”drìŒMáćÒś¶ńÊ/DI@ÆŽÆ›Gćfd©ÉVîźLH«êŽ=-©Ł/ƒz”•1….N<WäŸĄ§WÓòŽÇ!·ŁŽaÒf=ÿ2sȑÙJț†cź~ŻR…WöH”Çi:fáĘàîß«Ï=«zÎ$B!„ê5&Áï<ËÊaNą;GÖNùïJLQ#Š(ŁÜ‰lžœÿŐSőŽ<-ôĐșĐăûz-ÜŒjòœ!W§ïKĄŽ™éYZ–™&óQx/d–ô°ŽĘ=çÇĘ„śAłÔŐÜPș0äÌőÂ_?üĐûzQś&⠝aF=ÆX••™GtpkdFD•uÆ8źîDqtvM„§€Ó=Û¶jnsúqî3Ë8Țˆ¶E¶tzXZí»QŽ$ńȚĆÄđtkÿmƒ·Û~«Źû>¶|ggsâaéœj,G';B'ĄkĘŠ!ö(ZÛŁCÖŒĐû•ZWKU~É_Ż^&3f+c5łxZóœc‚›ÍżxҝÛŁÊżŻ”š’ëŽâÉ»ïX2vjśó+nÒFĆ ŐìUŒÜ#éc°ŸŹŸ ńS^ùfćλ&~Ż-B!„L„ XÉʍ3‡ùvë„:€J\P ¶>Ț]o‚°éÚ+€óČkA–署łÂÂ“Ž +Ÿ TfHP Ętèž@AùźQęósËasč Z&-»‡tè5 Đą&Ę yŰé‹=‡|ÖœYÁÍËƝ4ŚD‡„æp: êçZúaÒ±ÏÀ@óąûwžȘ*HM“Z:·ösÎ~ò4G›śìIŠ}ó^|UZJ…iK„ Ć€QƒÛŰU=?JÿR­(Ż€âXXpÊŚ”A·Æëb”ú°łź‘A§Țí͕OF©êą5LÊșvêŽÔŸßœíË?Żșäȑț–4Ž\&§H'WçŠWK oeœ&OöË<ü˟GțZł'Țm쒩-+>»ê’ë•{ùŸŁ‰üȚÓFù±Œ‰YÏ^ĆàÉëkaiE"1ÎŹC!„,&•wăïÍ&)\"ú€ßç?cyíÚqĐ'ą<ÊY·˜á;eëÒæI·Ă^€(ßȚ#;2ČNʋŚPÉG7ìîțÇÔ5»]/œ ŽÊRđl]}Zwk™Ÿaìș{ú;tÁÓGI0yҊÜ Ql§Vœ˜‹„5êwk^œ=7jÖ0È8ô—ŃœPĆĂ=[nt]ö㯠ÎGźĆń<{š}đÛ?7‹hmzJ«Wë&òàƒńZĐ&<~Vüi–ÜŹĂićË'œ>ęvŃ ï ›ŰŃFU~¶ŸȚ„:û{ ș5€l4êm“œ“ś|țćțdăcŠó œ§mXëpìfąÚźí 1}-țÛs-Ÿ0ĐĄ››“”””]»F,àșwìӓ“+ćg&'ćÊi¶ÀĆĆȚZ ęĘ̀thŃŁkQ¶H$ÊNOÍy›ËëÄLç]ú߆ź[—Žúę`ûĐÛáIbÊÜΜ™ÁîQ+ošő·€1šŹ°ĐíŽa‹—)ŽȚIW›ÙZÿ{-‰2°•q›O^<Á'ęàÿ<–Óóïš=ĘțšČxƝ©DÈ ”\öÓŻ™ÁòÔчvÜŒzűŒ~'Ÿ9c fœ{{$#òk°Ÿú‘ž“vî›ć·mܔĘű˜o„Bšž2Ùy_ZòÇą?ÈŻF}8뻁Šœ˜cËçŠùw§d1•ÛúŁGśČp)iNBÄț·î|P:ĆHčó«i‰ă&ì3tF>[#Ɋ‹ž}äŠï§ŚÆî[șÊrÁԏŠ7Xÿàì†yŚ=Wîüž&±S©W/GÎđă_»eü”/*ûòŠÏ‹ÇL7`Âüa\un|ŰÁeÿì蚬 rRÓÍ9wE©@őű{@'íĂäŒò5ąóâ^dKùŃq9Uő}ő/­ZCn `șûúY[_^łg§©Ÿę5ç pú—Łç}fËÇßęë›ÿí{"0ÔŹ€Ymôò"N» ËÚMUĐȏż»€n3{Gù„֟­XÿYÙÒȋRŻ3•yqÙŽœ'S'|ÒčÇĐN\$?őĆęë)”Á–4Š6vïÂ%ìčS>țlnO.%͉ÚöèĘÊx-§.ë™z`öΒŠ”nˆŽh֝©èŠûU[r­ZŁ"Z|kçÁç=fMšŰöêŻŠőîôîUôï‘XÆäŚP}őc»yș0šŹđ‡uđ({„B™áêêú¶cšŸ,zź8șÊëÈ€‰;âL_†Ž¶éűÓöì™Â=8sôЧűü„BšŸz‹/©ŚH§†uç<9}>±ÁŒŽ€E>M#ü‡LéÛÄȚŒ/Ÿ”Ö0śmêN€\:oôŒŸz !Æl:ïSk0x¶{Mٖ‘ûűq•WˆKż&ntÜĆóŐŒç!„Bő‚I§Ű5@€”_§–Ž<ûŽcfŽ)șòíĆ7öڗșĄțś§­>+Š/ßŐ».ȚÁò¶[ƒéÓ܏}ì|têO6ĘMç}j f«Ù;6d‡țœâïˆȘžÖ wÇą'.4šł.!„Đû§ŰUÄh:}ڟœIqÜ­=kÖ}nąŚA™iæàéÆÎN5öțꌭĐAX87v Ò“Čd”Ó1B!„Ț" !„B!„Țƒ„B!„B:8@B!„B! !„B!„B!„BHH!„B!€ƒ$„B!„ÒÁR-1šÍ>ŽŠ/Żț—Ìn1kïćK;§4cŐU‰ï«ŚhI†ßÌę!Ąe‚~éĂ­Ł’4lI„BŐ;Ì·zSŽ“‡‹„ćaς(őێŠ<ŠcàűÙS?éàühőU·Ő€Ëèmç¶dДFQ˜~ăÄȚ/FQo;Txœ–€RÏț^öæ€ą =öIè„»O=+Ź“w7°–dÌ?ž¶gń“ëÿmùëR‚ŒŽJE!„P=Ă’$)Ș~t=‘éВ«kfˆkŁżíP*`űŒ_ûët‡'śmșđBûòsmÚő‡"ŠčÂFț]{ęĄ{Ż+Ÿ\y5«ŹšŻÓ’tqúłéLEge]–lJ€Ó'+·,êL&_>xNL ùŽìâoęÏÉ:*ż”€6ńÜæíȘ!ăGÿžž™;ú·đj!„B €Žșj‰ûM_ˆ‘ÔƒȚ'2Jț¶ƒxiĐȚ "·._ż?œÂêGć>:ìHïè0çś”Ÿ}żđŃł'ëĂÉt-YŻrD6ê;4Đ2őĐìi·ŁÏÓÛ6üuöyau@-ûŻ?·ÄőÀޱ[ŸëzÌsn·ìŁ…Wä ûŽc?Ÿ4 ŁŸłCQ˜›uśè¶çăuSbKߏ'LŃ'ÀӖ­Ìxtl떣OĆÆ…śș%łș-żžîcsŽÉûfÌŸÛqÉÂŃí]žš‚ĐÿMûțTEÚ¶ûĆôÁ|ÌŐ9Ïn;ȘєÿĘZÄüÚ%ˆYÜë—Ë«?`—”Bć›óéŻKÛAűÉoÇč>öÏšČc4™őߎ1ùżœs4‹2ŠFżëÂË;Çę>}ńčÊĂęK˜,€€Pą§ŚM‰îoY{$đï±#ùœù+Fk°M”}=- Àrh;dôˆ»ŽôvŽb© Ó"ƒmßzÌšÙhÜ>úJ&œ'ïȚ3Ó·â|XŐ핟9/1PŁZ!­mŹIm|LŒąÜ‡4ęČ>ïcKÒ2‰TNŹêîm2k?çÏ}sÿž=śpR=Ë#„B𯘠9±lbđ‰ĄłæÎțëĐàsÛßvêYí;WF Ę?[œvVŁŰ3‡țü7WÍ:ûű òÒłČŒÓ7ț1É%őòáí‡SU6-?3wŁćìÏw<7<łćőKքm™1픝­gßÏôj=yy?/ŐÙM?<—ÛžPOr)àúÏű}ę·Œ»‡ÿܧ°i?lț7¶ Rks-J63șqÚôŁBkmÛQߌp,ÿŁtAÈ”‡ÊĆĘ{ún‹ŠÒ5Ă»[7WÍăĂA9”‘5"^-lÀˎ„*Hz—K}#(uì˜6vdL„?*“eśŠÌ IDAT_OKĐü6ęșńŻž””#ăyt:rÁïêń_Ÿ2\m„Ț’©Œ‹kæ=3'tÿä4ŸđË΅ńÉ Ă5Ș*=)UĆlÚœ»ă•óYšJ‹±%«@ZyűșX€$„BšA*=•ȘÉ{tdőÔ+ÇΘ?sËĄÁ—ÿÙ°őű“|Ï a7náÇJ9žaĘîç•~‰t>oœOæț/>ßü€àÒ”(ÍȚÍŁ'ö<¶è’ŰЙäZ”,ωÌ‰'3}6@@{łíSì.œò„Uï±ĂŒ”żÏęîHš.ß­;°€[íc&ŹșŚąd}1€43æi&°š.s_é2ÒâkaŠ%Ęș7ȚUréŃ­›»&âpP.elš”“ëVÊ}rnDVîDZ Àfłšą(9ŐŠ%§i>Ύ$ä4Ò•‰ČŻż%@óÏŽátYE.…ˆ·țČOgáéăy†VXZÉòÌš°LĘÿóZÌț*ĐüƞowFȘš‘Ö‹Êœđ玟?_șww—Ă{śœțBü2‡ïoKR,6‹x”쒅Ù~[F7“Ü«Ù@!„PÍUxÌ7%Ž:”næž…WÙ}üčaŒ—©ŸźNŽKŠ\?œ8Œ•í«óUH§.Ę}‰—.&1,u˜‰‹y-|xò^ʔL+î=‘PźŸĂôkĘÂ\ęè•t]ǛΠșź€ks•\)fèÂ;Ś(uïáĂ(ù)·nĘŒÔáŚnçÓÆÿ.]ôâò‘łòȘ>a^íRŠ™[ëúy+ŸĘfđ^z„BI‹Ă& Feąì.?ÌŁò ÁZh]‡ÛaÙ~öÒю‘­ÚŁ»šQË-ĆEôŸčçn RLZ±ëÄĄ?ŸúÈ[wùćęmImÌĂÇƎœÆŽhïigQyą-»~ôôƒ,!„B U…ź SŰüăńÓ'iknË֋©Šž ąĘ»hÙŚs¶ęűâĄ}ÿŒ›*/é1œ],ÛÙÿ^ž]ń;*€ `šóQ7%SqńÒògŹYB+§§—ûPž•Y ûWmbźł’+Ćl]tśúƏĘ{xÿŁ%]»uóV=8đűŹôęmINÓ1 żèwÿ^}.èYŐóFB!Ԁ1~çù[VsĘ9ČvÊWbêîmœEÁ`”›Ăłwàżz˜–§…Zz|_Ż…›WMž3äêô})”63=KË2Ód> ę Yu^Č:?O |.€TśÓÆN «Qę,Ù0ZrÿÚœâĘ»{ì‘”ïé§ŒżúŽîqaŠțĘÄ{ĂÓ­ę· Ün{ű-}ęy^À‡Ę©žSá"ZË1**Ó­WU",; èa»{Ώ»KïÍg;©«čQć5.-èź8óíúë&+š6GQą§OR”Ęll­ (|o[’Őâ“!~Ê+ߏÜyWĄçÏB!ÔP‘‹#č»qæđ1ßnœT‡Ł#P‰ ŠÁÖÇ»ŽŸOŰtíÀyÙŃ!ˏÔYaáIZ†ߊ*3$(†n:t\  |Lj`UûtĘ LTČ6&≔ӶoO;]ń„ Kßö„ÏÄȘŸ%CrïêĘbÏn=ÚśèŃTyïêĘÒGnû»„ Ć€QƒÛŰU}‹ˆț„ZQ^Ʊ°àèéł{ÎÿfcŃíƒç’)ĂQ™nœÒ‡Íć2h™Žì^*ÒĄŚ€@‹:êÖł­»”Lß0vĘ=C]“Z”̱vópu°”ślnC’Ź&]>èb—“›™’˜^š %ÁÿzŃeêŚW»IŐ:ŽüiY>eQòł”ˆčV%덀#tssȱ¶¶¶kڈ\śŽ}zrrEąüÌä€\Ę­9ČûŚïÊ~4ßÊFúăœ—Ż$2źF€Ś§ß.šáa;úÏšÊύӻT§ŠȚ/iŚșÿpBiaïĐ­g[Wˆ9ŽdĘć<ÚpTŠÊŸ–,xú( &OZ±€{!Ș€íÔȘś€s±Žì„[àâbo-„țîf@:ŽèŃ”([$e§§æËię9bûŽûaFkˆ>–íȚg{é*StëE!mäZG6őǶÉȚÉ{>ÿrȑïóöÏOíóE%€eæŃ|ŻNśoËK9t(XBĐïkKêGzNÚčo–OܶqSvăcŸBĄ‰puu5eńV-FÎÿjTŚ&vENLȱ?·„ùwgíÇ ŻÈŽ7wÊG­<m\Jš“qőż­;Ż%—Í[!xŒ›<ČO{_g>[#Ɋ‹ž}ùđŸcùoèí’íŸ;±ńSۊ;Žń;&Mű;¶€sOZŒújöđźM8ȔûÇÿű_ü€œ?Č~ùXśêÛŚŽùőK63+pń™ ƒ•źßš‚–}üĘ„ÒÓôŒź?_ڟ_tiń°e7eÓ`~śE;ìőëÔe—*?«NÿR ]Æl?űčd̀ŻÏ•Ń']Fo;8·% hJ-/ÊIŽŒőŰÇï€ÉŠÊdÙ7Ԓśg/˜úQksu~üƒłÿlŸîčrçÇśŠOű+F«ÿ»jœKNŸm9<żő+Ś1Žń;'O(ykź1k»ëgŚ}\|ì‹żEÙÙ'­?›9źwKO'{[Šó’ŁîžÛ»ăhx^é8śœlIVÏU—j|žÜûŻËăöXqfMßÂ3Gm|Šś'!„B ’‰HšÁłq¶áU;IˆVˆ2óŠßÏÓ̀ʰMÇç‡y$ûęl7‚ôœŽsß Á‰ŒPŐ,ûŻ?·Ű~Ś„I»ȘïûLÛłg śàÌћp|„B5P”S 2łÓ‚?śfW·XúóÀù§kśRφŠE>M#Æ ™ÒśéŽÛq92ìUš„čoSw"ćđù§8:ȘÏ֫ӄ‘mčg§U5œ',ꚾŃq{ÏWóVd„B58@z#ŽOț[üęeF”‹EŃ&zŹz țś§­>+Š/ßŐß*c*LŸæ~Œèc磱ß^ ÌVłwl.Èę{ĆßȘȘț‚áîáXôàąDŒŠB5\8ĆŐ €™ƒ§;7:”èœ)ąúްpnì@„'eÉȘ{ŰB!„Ț8@B!„B!ȘßMƒB!„Bï! !„B!„B!„BHH!„B!€ƒ$„B!„ÒÁB!„Béà !„B!„tp€„B!„B:$$“B!„BHÒ~èȘM űZâ0 !„B!ô^cXYYj”ü¶ŁçÌßÍV›§€ßvP!„B!ô60ŹŹŹ4ù/nžŸĄh(ràpܚŽćKD%?T*s‹‹ ŽŠć…rŠÖŠúźžæÖ‹‡itœž.WwÌ`Ž*<5鎂0c›ùÛ;Nh!ôŒŒż:»ź.%˜$ƒ@pl-€ó@[ł„äjISĆüúbŽJb–Ó$ÉrâÛśnÔôWKæW©©őw3Ł“3cwS.Ÿč5[E*§EÔĘ!„j€ @Ű»4ÿÚ,ÿŻ„Ź8MęĘkÖ'„ÇeCœ9lżËĄÀÚŠvDF•ż\9 ŠíŒŠźéË#ąC_öOêù lš5‡ÖdK‹Č„RŠ–¶TDæć?©QGŐ”Zúš . Ä Vą‰ÍN;UD‘œśM`Ë^źöö9©ÙuÔužA llm}é‚ÛVlm“e5ˆÖpKš&æÚhˆ9z3@òŻv=Ü>á§mŚß ­P’{Z"VYt'žőę” BèĆ  D.Ÿ›:蜏Ù“YTTgû#fßVĘŸæ„|u/>FW&ŃŹq§ß]%k‚žȚĐ08Â>ž -X„B­L+Ê;wEȘëßLËȚCŹĘÙ€RQt'-~GZaĄ±á±;čæbŚÒœkIRùÒ‚à”žÙĆ ;5ï¶Â‘I]|(ìá›fóÜŹHZ,Šû$=›à¶vvìhÓ܂kIĐEò»i ;Ó ‹€a3«owGÈb0tëœTč‘ĂŸdɍ™Ű€ęB[ɖ°g—•+SćRČ]Ó.+ž‰_§ČG{»Ž1gR*YxF¶Ä<ʱ™Ź>fƒő„_; †K~Ęú–[L’šą CwÂÆĄQ¶êڋžĐ go_^ć˜ÙôrëcmiËĐæI ź„&Α)HsíwbćœÜéą#QńčNMŠÙó”âĕO’cžú–ŸĐhvM»,çÄÏNbŽôrî`Ćł Uńy©ÛcRž©ZsLCoT†pZś·/™ąŽòtĝMec/Ă%WßV˜A}hMŃsʛ˱ÈÖےÛiuçŠNia3âŠÊŠM1,œÿjï&Ščû]š‚­/ƒzJ&»4ï¶Ô,izXrZƍÒ̱ćᩌ-!çUÀjoË'%ńGr鎟v9©'*lÂŐì ”€Ț” úuŁ–k{4ˆĘ|5j*!O”ćŃÈƜEˆUtœ>jh„žduś˜ }7”pÈK_”Złë–!d$&($ékîçsńžćÓv§Kæî˜„ó…Ș7±Ó!̆ú·œl&œ˜wXI±Ù›Qvƒ?! ` ŻűFjü 9%ä;oàĆ ÿ:±Èˆkî ï€5îæÒąœ+ÉéùÓE`ăÊŠ)êQÜĂŻ286fSüìę=›ś1§.ĆFÆhÙNŽ8V+'[Ÿ,çX–,OĂhdë2Ô·”}oiș‚ŠŠCS“ÂȚÎsŒ­æJlÊ „(T3Áö°äšłÁƒ šÜ&Ő.eòœVpĆ'ăŸî)Ší­]§y·ű…ùè˘‚b «Ù`}_? [ČVő­ÙÌڊ­Î U=•žä9/mÛ$@+:ŻazÚ»ŽôoÓ$úáéĆ40„ăĘł·FÇ5śńÓ2 · isŒÙx?OmÒÖÈô-ę9Gk0żL+ϟ›ÉƒŁ—ÄhÌ­\fùú,'•ÓŸf\sL©Úš }Q•;7,͚ÍZ7šăÊ­YÉúÚ 3šÉsâZ„"ŻäŸzbVćß* ŰÚyÇE—ž„ò°łuŠĆ'r•ŽÁ V[Č$ŁXBži4pX+’*R©•4áhÆcšÄéj‚% IIą8 Ț6ì“éeăĘêśÀ†ZRÌz֍’«QŻœ¶ż“9Ș„~ydŻÏG  s g&‹oÁ%H!“(=AC+ŸŠEÍÉNûŰËwR›ÀțÙ Æ„GȘL|m›ŽlfEŠ„ÄlL*Ș4ӂhäê;ÒB~4âáß%sČłrąéëÜ<șŠ=čfèt Ás™êfQœ5çYVnI%RʖʕÒJ)!ç „Z ™»<< -·„%{ĂîŒ<•WÈé4ĘȚF˜žžOËeÉ/nŁq6ÊÈìÌË:GÆĆLË̈”[(ƒ«ŒTWęR‚€îĆDÈŚ@‚T"æXțÏŐœgČűŒ’ÖłÁúÖ" Jź]}K°H€Š*\@â:óZč,­êo0Úyxu 6‡=>S2+/+7œUÇyȚ^]ȟĘ€ÄÌ€ł9ĆIÖî=]4Wă“oÈțžÍÍy€LïRčÊ/Éb&Æ>û;SE€4f'ßn•ƒ} FvVÿšcZŐGeà‹ŽFWšm3«ȘRő%ë]s4˜ÁÊ›cÇ.ÛŒ«Ï@žòf\N> †¶AŐœl‘Č™]‹„h @˜wČ5Ś€ĘUÒ` ƒúJŸ[\Źaòœ˜j‹‘m:L0— ꧈t2ăÒrY˜ íZ’òsąb‚x(óeg#HÏ(ĐUŠú=°œšț˜ő­A€ZŹíïdŽ^)͎/pĆ]‰šœGș·~Ô hH’Uu"èÜ̘_h+I^Aœ~ȚBš!«đè+J]t>úáÌ'Ù,żő­Ę=ăŠ`rœyŒ—ÿq˜Æ>’%ÈhgGśAΫ_!ží,HIö5aÁdZ0™L"č °ÁoaiűĘM|kĄ/Ą NËÉ54ÄS䧞«ŽwźđÄ Z•$Ulß`kłD’}*S,Ș&¶j—R…_ȚżKƉą$ż„Q٘«šoeĄÊ–ŹM}™ ¶«Ày”“čȘPôŒÂA˜ä1€ÖRUßMXuČąŒëeś,ъ›yĆLaGAIÌTz±‚šÔ%‹/Š4R p$Ą©1­AĘ•W łä Š` ˜ÆmHŠcșšȘ+Ù@[a+ښ7šU—ę]șìlßzŠ”òű“đÿćȘh0Œ ćçDhÍ:ÙY0€4łílA=ÎÉțE}%+ćò\à:ń‚cĘÚLŻæ¶p ‚ăÊ#„ĆĆ40ZÙZó”ą0) ŽìĄHÎ۶-íÏżźa+\7L™Á†—#Đ ê8\Gs~§FM—{ń5⮋ĘČz|Ô ă ć\û„îUő(h4(-#BWBŠRaÏĂd[ővśëb͓fîˆÏJ7îŰ&phöOaٙMQ\ćYŃUŁ„ŸFZ5ó›ŃŠÓpq։ä”sùĆșÙüυK09ȚÛ»{Wü%`©č-O‘ ‚Î’ÊdŻ~H:ÛșmäĐʒgÍ$Ž `kła”F-)W!Z„*RÈf €čȘúÖMȘlÉÚ šûŽ_çÊÊʉûțyjĆU‘Rh`Șž„Ÿä۱!ŻX^~ŸžȘž8ìíž,B@k‹54P4€VS\R" A w©Ö €ŠTyć.o–ô?ˆ·=>2]TՖl ­0ƒ•ĐÊàžèËĆ€ż{Óáœâđč. CÛ ­Îż%Ò~ggç‘(‰§ g[;OȘàdžWÿő–LId™àêÄ%-xÖ>êŒŁčÖĂ­Vi*WddË”À°î$d*‹dEž3€ŒX"%m: ™ŚČ5t öÀ5€Ę5˜4ƒ .G Ô *ęVv~ҊšŽÒŁs}>jĐ9Oż%›.ö űÛ3ëÇàÈP !„Ț,ʉÁČìéî5ÎՆ/Ï9yÿDźŹŰè"€ąÄŸžŠ3JÿI©„ùŐïűTyΖ‡ù'mœGž»Mjć4Œ é§§‰O5P2UZ!Š_žTXń:]hô”cc]źÔŸúҁ}Óßüíd9É»# R”~­ç™őƒ”Y‚$* g ‚,í^sćúBeĄÊ’kŽO{ŸNá4ÒĂûkOéÜۂ—+$­ÌRP č U>5‹†ÊÇűòĐeO| )Ș҃ő,ŐßMŚÇăžéąȘ¶dœm…Ź‚6CœZDGhű]Û8OrIû&„äAí·Aőƒ‘ąč]óÄx7ĐÎB%z~ÏšéúJŠ5òtєg֜LJąŰËŒO꬛rŠڌb% ÀæÛ¶ef¶~Û_Ÿ=‹nmkÍËÎ-ÛTMńòCë†I3ŰÀrP6šŁ)J“_,MThʧž58VnóŒm!?a}fîóúžWEœă˜`eăû›ż«œ*ÿԋGČ%’ŐTrqH5Oqą‚(wYaÏ­|1E›‘ŸúG~úAû&ëü=fždÏM.ŠhEŠ‚f2è,q‘ČÊĄĆJEđœy5~‡«œ“@šô}dRJéi6GȘÊӏīÓjłaƒëÀzY#&—kTŹRMŚ f=ê< ”%•‰źÉÄYlțoÎÎń!/‘Ú(±Dc'ì,`<UšO)Č•ĐÆÜŒEÒÒÏ8ffö SškU ­a|ƒWZsȚ=Ú 3X-eaòț|§ŻĘ<;eF†šÚ«HółĂ4Í;ۙïŚZw±€FćőąQę%ò49tćZû[1â3ÄyEŹŠk+•är€lbk#€ F„”v^ o—&Ł„v-čĄZăśÀ5lIÓ­5Ń@rTB7š«ôćz~Ô ›:čűPÙ?F%ȚÇj „Ț€`14ścN }Œ3«ÆŁ#œš"•†àXx–Nż#۶ĘäË}p…±•SPJ–, Žâ^ź”¶r)d—ßgd”Ïę,O,.Hnw[AgV\üćżí?Žyu»\«Ą ź3ŻâÁĘè˜ù|§O]Źm«‰­Ú„$ż«·ôcV{ĄUűžˆ22æj™, †kdx)] TŃ$ӜQáܜôûN߯^m*ÄВ{ùJŽĐčŻYé"‚ÛĂÙÆL#șWX»óuŃUŻ9ïm…Ź­ŒžšÌȟĐȒ ÆĆŹĘÊŚșÛÙ”±łś„D·ò*è/™V§kÌčž"ČP©UFÊ9M…æV”+ÒŽp©é0,m;pégÉy柝-ć>ÒÚ”·ăłDj}{`-©7fœë†±Ț‹RżîCKo IDATí·y[$Æßû2 ó2‰Ó©1i^ìŠXbŠ›ăä&ÎJ…ä^Zä"čËvĘč'JYpW*èćà֝ĂâК˜TĆÍWă;tGŠÎz Ą·â]ż5ltAaa:ÁÿÄĂĄ±ńïŚjž–Ÿf–•…ę¶ 3XÿaŽê7ƒăeï5ԚÈ‹«|Ê%ÁŽô5ƒÄŹÌ8:B™ PœŠ•$ÿ'â86ÿ3ĐŻĘ»Ÿ¶2-Ź|ÉćL ŸŸÂ Ö˜Łúđśi·”…‹•8ambA•ÏBg˜›Û«Eçłđî#„ á»᜝b§C2žnfdŸ€Xò¶#A!d:æÖ©ô4‰:ț§…oVùnFd:FfĄÊ ą€!f°!Æ\ï[}BŐÂÒë 욎èk™yüAźâm‡òîcX¶ïÓil`#§űkățMR—}N°œÚ¶Óʧ”‹…9Ą-ÌÏ{ú4òÀ„˜ć[ŒŐ SŹ9ŹȚÓ§.lÉšű!|zÜá4MÙł,Ęl薔Ў /üŽűòț3O8áȚ”ŚçÍkț㘅Č2»Ț;„ÂU›»k͑ęYށŻ—…Ș3X{˜A—Û­ŐÈ$Eq1±'/> ÉŐüŠ‘L•AÒ.à%g=˜œî~BÍ^%n %Mókiˆ9*·ŠiZ‘›™y'8lßę\™ĄĂÛÄpžœ€_WeÖ­kwś„‰°ŸƒȚKL ‚Šëó¶Z;Ž59–«Àv3-Ò«Ożę-bî„ÿużÜaà”ûtđČÖʌäà[14ÛÖȚŸ•Ÿ}î-†j S­9Ž4ęä”äܗeÒòŽÂòÇwș8îä'éÜ'ć;ŸŽ:#)-€T6ÓÔ8"ÌÂKtțƒk_€X ùź#ƶk’öpę•ÔŒ"iZź?`\ȘÎ`-a+ą%©G/%ælĄƒSŚv~lbłfĘć…uó&É aŚÜÛ  GŽö È+0В&‹ùő5ĕĜM“ls«Š­|‡ŽìÍ=úę-qÍło%ș|êžȘK›aă° lŽ­ł!(B €°8©—kԝœśs„Żż“a5nŚÂWüâ|\ń»?d Ì­ÎDzł~B"9tĘáGćV,‹æżî.È čđʑ€ü҃ A@}ç›lÍĄŠłŻ_xĄïxKfŠ=źÓĆ,”GÉ% I’Ł‹|òłî>Ïšë>f°”é¶#ynPđӒíèpdïŠ7ŰÚâæ-I”GĘg€0ëàoŻIˆpślnu(«°ĘnĂ-iš˜kĄ!æš|ÌpőĆ€ĂGśòovûöł·QźŽ"îńłűx­çȘž-|űŒŰüz)B&Ă Q1ß ÖłËó]Gï]JQŒÎY ‚ćŰ~pbÊĆžâ—ÏoŐOœœo›q&Gś!ĂqƒOg\öOŹ€ŽkÒzÊGMÚ6ČČ$5EbqtÔӝ'Ł“J{ź~Ł>nÙÓÇZÈÒd%'ž9z2Qnä~0łëÛ§MÿÖΞÖ\ŠJ–űÔĘ[90=țÒż7@›>vczółâjćŽ[vG°vđAË^țŽÖ\¶V‘ž”xúlè™$ ÀmÖő·áȚŽ|3KIÙűhCöìXŠ62fÂÜcȚŚ};dÏĘń"§ReȘ^Êp[°șżĂ…Ç-ÚNéâêfâÌԋgoÿ))i*fő1Ź/ęÚY0\òëÖś%‹ t±BRń;=zű‹bțwêeŻ |ŻŽéÚ*`B/ż6.l”4!:æŰ…ˆàl5ŃšïđÍ>‰Ûò=§tŽÖ€<úő”ôŁ1ș5Ï.]\~%ÇNßÒl…țÖ`ž-XĘÏæô჌€‰Ę}m8”$/ôfÈÖ™…ŽQkŽi0{N¶€”n-~öĘò[jrŹ«¶Ÿ˜ăéÊœ4ądÌàë‘%g%i}íùf$HŽzc¶üdÏhțé țI.kGČńÀQ›>(ȚČêÔé†Ám°ê’Y^ úĐćÊÁčW^čÔÀî5}ò7ìà1[ąÄ4D왈;”ûțîvڟd—[©Ș;jIƒûê֍Zźí5ÓrûjĐêüĐEŁz ĘÍáYQœ>vÓ „ŒG&ăŐ*è°Ú ńC[éȚgNÔìș%B Ôq!Wf?0°ËÔùcúß»·ćlÔóZ\K2ißrÉô@—ôç'NEäi™ÖB›Š–€ątŻÄóìžö‹¶N91'Î>Iژ5l=óK[ó?Nü›bęYŽÓ”9ƒ>sTFEDș-SsùțÍ’#ż6mÇïGÏóÍĘÚ~àŒœń”ÓôamW~)}t%h«m‡/û¶jt%IßÒËÁJƒù%›|<đÛüž}‡Ïn‘s|»t™=ž?»đÀȘ‡ĆŚ“Ń<8ql^oiȚșgśÁÖ5ûČŸúbjŠÚš íj fP_ɘÁŚÆòH:Ż@ZÒńŐł82î±úƒÎ­lw%—îĂHagŸ&áÉ]1m0ƒŐ–œV˜&‚6¶–$ˆ)‚iĆçČ5Š|©†&­\mq|aÉQÚȘ©‡?CtèEȚC"—èўÿôŹžtȘț8hš%őÇŹgĘ(i­Ś^ÛßÍœ‚ąh(;QĘ\7W+s ž—„,ŒÂ„Ț=„śkŠ2NęwôæíЇu\żŽùóÁ;ogŠ _K"Xl&“‹‚ÁäqXZšÒ(Ԇ·2–«ŁS|üè­ę)•~‰Žôi€—èŃ7܉T\ÈÖ~?xű‡^gvÄ:E8wîô©‹*dßŃUt»Î#çKÒê܌ìÜ "Óźć]8Ąs¶=L,7æÒ€ĘÿjćËÓšŚž)~ûĄSÏffnË4yiWóH‡ží;eĘŒÿB\>ăbŠrąțۧöÇżšj—ąg)W“ŽmïĂûJÈKH“Ûž}:žŻÏĄžš|Z_ÌŽĄúÖ" Jźe}‹IĐ4M•kgR`ćÈą3łÄU”9ncșłc‚ŸúëYpíIáȘ…=' đŒč'€]čœ#jŐ§ń'òèWbSŒÆ¶srIz—g ô”aÉËߟûΕ"€„cĄÍZ èŃʙû0NźÍ©5‚d m,^¶!-—H‹Ô2Qn€Tó.5 éÍŸłP3ŐGe蛆2X}ɘÁ"H¶@`a,Ą“렁țŽ…±ÿDÈh0Ž'”&ƊÖ|ĘÂËëlN,@:zvr žȚJÌŁôgP_ɉéy”…•bç€_żëàž>ï§»/˜Vź6q§P 'Àߙ“žŁÍ!R’·íԄw.Ždąï8hàXŠ?f}ëFŒ 6kû;˜ŁW+`ŃÜË D‰ 2œę·~ì ) XLQe&hɕŁW(wćœzđű„L Â{èÂ䚍żZÎè9|đêŸBĂ/Ib4šłbúéő3NŻ7»1Óœï°ëgœ^?ăŰDź?źÉÎOŁűœ>láoőê5\BèȚčÄ<ˆN!9<ŽcA<ŠWpœœ} †Ep[5±gŠăO†K ńhőĂàÈ€Jû…òSđéÂü$đ­x†ÖȘiEìç—â‹«Ž­ú„Ê€Ô§ewŽjòÂălżÒ!źQ1WUßșÉB5-Y‹ú’fV‚mú:ižżÈ.X%Ű,A+TUßÎÎläȚÖBóđnLVi‰TAì…(•eæ%m„§æÓ@+Ć2Z•™—N­P“Ç!ô/5Š54)IaeÓ”E™bšmÁ5ŻúđR—H[ÿ?NűwEéËGLöȘn^„±ôŚłPSŠ‹Șș’1ƒ5EÚúŻZ1qÿŠ1›gviUűx㯛!%ę}ę1ӊûiJ;Ï..% \ę=Ę5鷞>Ż·dmfŽ „|’°őqu‘ÉŠŹę…)81•é9rŰ.Ÿ,ы”x šœÔ‡"ÒżE#«’†2ț8XC†Ś Sf°áćšlPgmćîáùéŰ~“Œ”ςŸÇ”¶^ę=vkóÇ«íZöÚòȘ8 ÈÒăOßIËÆńz7Ux*-iíá7Č»O|Y‰śBw=0â^O*ûà¶—™Àí4ôŁnY·ÖßSŽŽÀ˜gÀhÓĂWîá~7ąó†e­ž>xrèZäƒ\ʅ'† ߑd:>šâwÔ<+€ț ’0·ÿgïŸŁąžÚ8ż3»Kï ]ìŰ{#°ś{oŰcMSSÔDżŰą±kì]Á»(X@,š( é°À»;óęÁZ»‹ âï99'ïΝśȚ;»{ߝ™;\ZfąÊđ9Q‰E~>ŠŒșŽÒÊźŽ…žŸˆa‰a>FOvbV—äŸs•=Ÿ•#áEzfșDR”c.©œć3 %ö€&6SŸ4P?ÇśÜù?Œß»Œ›—ÊŠxF[«ä%ê”L Œ)7!íĘÏ{ybŠ˜oa`©G‰D|‘4_ND<Çó’©œˆxâ‰a"„„êôFQvȚ;7 Ÿűbț…™9—”śTXÂÛn’%%hzÀ)o/FĄŹ*.ȘÒjÆ–—čÛęyŒÈfÔ芩qÒ^ß<«*fqè‹ûEĘ;43;—&gżhjVâ/țç>€Žf."%›76ČjÛ:Zä>}è[·eó:ÚçĆ&6”s;#"íș5[ëʞ'T«fL$‹+ÒiX«„NŰ-IYŸËHù±AčD9‚UmŒXR$uMŠ7â„âà«WŚœYÂź2wóâ«ûÏ Gś˜6gôűÀKĂżŹĐûe*Ɨ#k\œȚđŸm4ÔI~ôhőï!w_©7Ùć c’‰ˆŃ«YÀfŠ>LS:/cßżßOžűĐg᳐6_ŽŃ„ęJ§Ż^ûŐ#1—'â‰ă„ÁŻ~ÿӝ—Ä”ăâPŒŹàƒ†2șÎc†üŰŽĐçzÀÚ™iÇZ™Ő©–Z”Uȟ@đȚ/?–!âËó?ÛKT>ŁPrÍàÒ.óJmŚr̀źcNÿń¶v.+界ibe,ąì’–_*é«űĘżćܛCT&ûÇŃȘ€Tyo0Ć[šÀűÂŹ(„«Ű}D„ÊڋQ(«Š‹ȘԚ1‚eÄe?yòò9ŸWŁöșŽíûĘțûtńBíȘ> yIìíçÒĆMkŚž’mVó {ùƒc/ŐZ“@iÍùiÙYŹ•u5kÛZÌółÏi5ŸWÏÚ"ÆPŻ(;>›'4iê`Ìj9ćôvC»/”n=ȘĐUVU9‚UmŒˆ^'uqr^ZŸžòfIőÊțĘ-Źß”łkS&đČŚ”ÇŻ°Ô7|f„DŒN»ĄC–:f> ÙŽțá­űZĆźD<ńÄȚœ~UËÀÒàĂßFűÂìÀ[·ïÜw5hiïęîŸ>™ÂË3ČSxž\ü8ąìÏ àóÓĆÆśȚu§Țœ'· »—/ÓÖŻQÓ:ÿ΅żžÉI€kom\ÍÈ fM}†a›ÔiŸ›–‘“V #âĆÉ!É4¶WŻEaÏsV”ëöȘ§•óÁł—űÜÏ2ä}›,š =ś4GŠŁo"Žv{É©3kĘxȚèö5ÓőąVùęó'%%„yù&Łgô4óI⠚whȚE7Óęú‹ žHyÌJÛ«Ń(ššYÓö*‘tg[ă!ßv1ÖÿEf6§eneÙ(7xêáHiQüńs‘N:Ź™eôśęT±¶Ù—.ÍÚpńÛ.G‰y2Qw%Ńè˜$ąÒœ7/`MŸš=dŹmæńMçNœ*—KT„Š–&VFș&ú-« -“Ö­kkeI2srâ_ćIx±…q5cœ†VZ kŰšYMqŠ$S,NLÍ/PŐ^ŒÂ»X]Ă–†f&66Bš[;5Š‰s’sÄȘOb+^é*Ż#űńï#ù‹[>z êWÿÒźĐTub.ˆó•țôƗƒŒ€cßYßYé*Ż™Ï‰Og]êT+xüè%Gò€€g…M:ÖŸș•-#¶N“Vò$śĐwŸŸűÂàű‚f_ÔGȕ}ȘèI„1+=6ÔőYŒ‘ *æŸú»[ÖlÌ·#'ÛŠï[í~ÏA‚ÿ ’oĐ-'|aÀ™+;˜ŽCÛŽŸç$KKxyțĐ…ÄŽŁ–(N"q)/Łê:véZŚÌ@ÈKrŁ_<üęBàƒŚŚNK^.Ț1ąWłN_¶ï©/ć‹Ł^Œü;X­':óč/7ęyáeßÖ}7›Ü^P”Ÿś*1țt&GDÂZíÖĘÄüő//.CzčÉgŻčĆqinûœ ‡”íÚŻSYț˰gÛ¶żš1qxśśȘçąź_Y)ür\Ûæ3› 9Inۍxw”cæsÒĂ3‹ŒâÒSKúH)œ”ÏìóżäÚ3zžÔ3ąŹ€ŰĂ{î‹”©ˆYE{5U5kŰ^„8±ŚĄÓiŃmG:ŐèŰŃAG^”žšr_1CâSƒ=ż)l9Ą{ęQC›èÈóąĂ­Ÿ|+…SÜß MŽÉâžK;r&u«ëŒO+§ïíä…ęûŒœźŐ~ÔxûQD$^œäȗÌnê7ï–ê™ŰoțÒBUíĆ(ŒĆ˜·í¶}žâ”^›eőڐ‚*êÆ~t|nôћ)û·ć±%LȘFÌÒûścrÛÔ·Ê ßùü[€”ż•żËžÜ„T™~ a`dJÉRžÄ z6â“^ćÈYS§ÆÆò萀śoŁ?‹‘ÖlŚÔR‘$+ę{PEOȘˆYɱĄ¶ÏaŒT6 rw« 4q°`茄Geûòš*{{ûOš$pXŽČ_»ÆčĆ^'»ęsÇÏ"ß [ÂŹu›­‹ÛĘù{ò©DŹô©`Ș:Œ`ć‡1Șôêÿ¶Č«…ÇÉ9%<“”k»ăû¶Ú7ÏžțüyMKàsń_ż Ș6^ò,*›j6ŚșZ5ÿțÁȘg_­:“uă^2f ŸFĄȘĂV~ŁÊŐ5¶péÛŒ… ïITÉO|1°·ŽăÓ=ïau;űŻúïÏ9ĄJă^xĘŰ&ì6aÄîá"ŐŻŻÒŰZ5«±qÏŻÇÿÛKÂ;0 UF°òĂUn›©ßŒű©ƒNÈ%ÏC/JŒT­ne({ê™ô\ÚŸ)\bW%|¶—Ű)0zŠŠvÂü©j­Ê ‰Ńȶ3àÒČRÊuac€* €.±P@‚ € @ €$$H H (°DÄČH“ˆ%b-‡ü¶eQ?GC€IđYÊ㯭GÏ]0ȚÙBüâiDZ!ÿ©ƒűFFFČôç·Î_yPPoÀŒ…“;[ćE= O)@–Ÿ‘‘—Ÿê}áb@NÍŸÓșv·+ŒzöJ‚, >#Ż$""â RĂ|/] ł0}ÊèöÒÛçf"E€Ï†đœ?Ìś?mòàÖz‘—¶ïžÇ}Șš>E‚$0iĐcŹë”ĄN&‰·Ž/çæ“‡sGđ™1ÆnÿušMÆ]ś5SŽ^ÏÁ‰#ű, ‰‘¶ŰoóŒc—ŸdÈ>u8Ÿcooÿ©cšŰO@e @ €$$H H ( AP@‚ € @ €$$HđŃDNKŻȚőű©ƒèSR”hŚìč`ÑóŚœïÜčćqvÿś]̙Oi5yèšÇŸ)Êk,őgóőĂûśî:ćTóż Ü{Ș’3AbLz­öôÙ;ȚĄÄjRú!œ^kœęęęęęęîȚč}ęüŃ­ËŠtȘ^…&h‡”j?bRïúșU©fMhŐ§k‘š‰ëš_F4‘ûsőš?śžčü2‹ÿśĂxŁmSÓÎĐšzMËòJ žž‹ÿ[0wîÜčslž‘Æ•S­ÿŽòï šJ„DÄČ,ÇUü†1séĘ^ôd‡g|IûÒ€ŽD\fàńęȚÉ=s‡]zčțȚźÎò‰?_«bS”26è;cŠńŠsa’ržqW\͚Đ$ȘOÖ"ÖșE+;z±oćȘꑕçXäƞ«§gžÉĂæ—Wù Oˆˆ„ Ë©ÒIùśT%,k9ä·-‹ú9VìÙ$ÖȘKÏVôàêW%Í 5)-/~îuÚĘęűÁkč.»’aê2€«ćùŠBÖÂÖZ«B.ÖȘžš5ĄITŸ°EZÚ"â332+QŠIDÄeEĘ)ź<9Û'…Țűœ ‰žìÇA_-ŰÛ}đùțșű,»BŠŹmŚ^ÍeAżßN/1Ò T5>7ôI”Œ·U53†’‰ˆˆ1tì=aÊđî-kYh&>ó>œcû©ÇY‰œ–^Xkłwæ “Ił·­iÄgFß;żëÏęŸÉ2"9/żș¶·>CDò˜ĂÓgû”ÿqńè¶v:ČLÿ?]8—Ì)©™ˆH`Ù~ìŹIęÚŚ·5d§Æ…úÚčùr€”ÔˆjĆö‰‡őÇMÜĄĄ­Ą<=܊^4 IDATŚmóÆăČxÒušżę›n¶æF:†YzĆo)Ę^Öë‰û-•5“\ÎÚvš5Ś”_«šFȔ§·ŽnȚrö™˜WŐ"ŐJYeT"«ÖƒGïÙ±Yk#‘4;ț©Ïé];N?ÉæŐj‘&1ë8tç:Šw»z–Ú…)śźß{ôfŒ„ˆŰ_­ümdSccc#=Ë,Ÿì·˜ˆˆKv›3lĂ™Šz•ŽH“ž$Òéțû”•]ފ_Ç„žžûŐșà7G…ÒŁŽˆˆ1n2ìëŻGujh)ʍ ŸžskXśĘËŽŚö^|]ą:Șíç2fęÿ8œÄîÔŽ±ÛBßôž ÁÌŁ{Ç€o1śTȖČȚPłv§—VV?8ÖőpìûńëśZsé'œ«l 1”NHD’đłË&úœ2sțìżNșŽkăÎsOԜȘ­Ńœg‰ÿrŸçtš”ȘChcgÍÊS’R‹+Đm:móŠIvqŚÜvčĆ™7ë?fțæș†łgí}V|-°ńÔuóBÜw,ٝÀY”6gÖêM Šl Î#YĐöéźçȘYÔê1kQŚ“—ś©]tqËÏÏ$æv\H*§Șf¶ÆÈ•kfVžprۑT©¶™mĘ&f‰\€êšŠlü)ńÆȚu‹6ˆ ž·èë5Zic–^ːÆùșxÁČV.źźs/o:ö ŸˆˆK~\ôș•íW •5ńLĘ ż·—»íX“cÚjÈűßźŚÎłüV6ŻșEÊ(‰YeTŒq«>ÎÆŃ7Ž{ŒLÉÓ­ù搋6ZIÇs.™Sč­1łvVî\ÒVâjÿúp±^Ę.ĂÇ­ÚŐdęŽoÎÄÉùʧ'ù2ÄZ:OæœwyÓńûy<IącÔx«)i‘&=ITèżÙuÚ)3S‹ÖŁŸnęÏ­K=êxÔùûÆy ÓnŸŰŒç„ŽZëßoé+ÒgȘniÒÏŒ3}œ‚ —ștvÜȘèAgg{Ù#7ïNeo”ZsX|l””·P,Çh[kIsÒł 8mu;Aƃ81Č#€ȘDšűż,íĄûÊ©ŚÏ ˜ŸpÆö“ƒźíÙ°ăLHșshőêöìQ'śÎ^ż§ š”–Šè™YZZ‘źy­vCg”MœŸ­űfq¶Æ°ăê&›3kkH>‘‡WšìĐÖŃ;Ÿ^â‘EDD:Rß?—đË'ąˆˆ°L‹† ßęđƒsiœ$%òiJ$›X}äÂ~-ÛêíšČèÀÛó0ÊkæI«^ÓúąŰÖxöžUcdčù筗Óy"zń玊.tïÔR皗$!èJ‘ źÍˆ©ÒCx{¶4üȚęLíÆ­>\ó—/8u6ê+pTÖ,yĂÙśœ8ŹčƇËc©•ì™oÀ›I”4)!…™˜š1HJö«9ÙóËž+~őç3BŸÆsÚffúŒZ-Ș°˜ßæDÄ„EEe“©™©ÊźÒ$faƒ/ڙÜ»p-ńőt˜KŸ~țnžQ»ŽÍÊĄŚ?ČE€ńè—vÔ ë·mm"}xíæ›û%!Śn'š•kxlŒUÖś Ÿ}Ś+° șK§ș‚â—;8;Ś–Țśș“ź2ÏTZsaB\ YÛÙX˖­ČÓČmZްfYËêöZâžžL$HUÊ{ÓĄYăȚă§MÜZ/òÒöWăÊë{]«iÏn6©7=î”w©\êÍ-ë.Ćé4Ÿ°dŒY유Ć4J`ko#YÌ>rmöû™˜‰dDÄçeçŒsW—•‘Íë˜Y2Tűî,5ńEdî»ó*5KIqhÉ2ăeßÌĘqjôŁ«'ęÛ/N±ˆšQQaZê;òOİêL‘•ìWsE ń)oY‘ŒˆŐœQ1kÛ9zòÈn­ëٙh X†!†fU/Ê IÌZ–VŠ|J\»wßĆÇ%ó]-­ŒR}ŠG©mi<ú„u"K+3ÊLLÊ[ÈœJRo ·ÊüäsünüâҩΞ°p9kïì\§(ŰęŽ'ó”Ö̅Ć$òvÖZvmĆŸÇo”ÓȘ…Ń©t[Jž_n'âà_ĄH& zŒu2ÔÉ$ńÖńćăÜŒcòÊïČyVœșX$^ńx\âÄG“RexIü#ß;Ąò ÜF· ž1Ű}öń⌏çy’ÜÛùÁśoçłŁ ‰DÄ…ï%ŽŹ€%ą;„/”ŸÿoÊk&"’&ÜŰ0ĂÏ­ęÀ1ăFÍXßolđțŸ–î(æŐ‰ŠäòÎXK߯ÆdČRæȘ{C菍™1íČtÇJ—Ü›‡v­žÿ2-·ˆ4œžń‡:êìS٘y"†y?gaš<–ÊÓ€EDŽ~©GóÏŠqêĄšo^_æś /öó Źpq©œ7<ÒșŁ‹cQà*_”D„Źf>/!.CŰÄÖŸ™}Sæéæ‹tG~ŚȘ‰ćSk}I\\*N T-B"ÆžĂÂíż”ÉžëŸfÊŃëá9ćü}źßŸw'ă˜Óڟ—žT—&„j)9zÀŻßc§ș\^q+›'yRBČ\€'Kzxż€Sd""}kă·?ú‹Źm,˜‚çiȘf”*j~—ÄûŸ\ëæpŚĆ[›~ôK!MMÍ"'[=æÁëæ1пР©±€]čY3/ŸçżÂĆ„æÁŒ¶ëȚ[yW­Ć_”ŚÌ&Ä&đŹ[7oŹ~țQêĂșĂ[·Ï°à‚â?țł > –ˆi‹ę6Ï6æ»ćžcÔĄWGꌟż(éDƒ&„êâRŻí9mÜÍuT}qIŸȚá|Ă!ăœLȚb2"ŃÛ;4„MșžX).^cLŸèÚFżđńęĐ"RNeÍĆgą€ÉAś_ÊFÆFʚQ©"ɓpŹœí?îâPČ_ kVBĂ©s)QiéèűŒÜ7ś±V]û9|N”Œ­&1ËÂ|ęSŽÛ ìcÿ:›e­»pÒÏčw·ì§?ß§V‹J„ńè—Lô GÔČww›Ś5‰êtéTKTŸ\ŽöŻYàé—_ËčSÛNxȘčű‹òščÌžű\CÛőm_…`ć’Ohrź…}ĘÎÍ6Œ]P<•ÍÍź>éß,ÎȚMà,[ ĘĂ0úŰ!ÏtžHÛÔĄŠœ•…e­Ææ,+jбKÇj)©I±Ń ÙR"RQłÀqʎŸżŒô+îàœUVč=ê>+.Ù'°wêP“ą#ąqÎȘČ ŸÄț›„Mgn™mŸ–Ïë[7î>lhń͟=±*TeHà#ÈăünDŒìȚsB_;3}Š(;9"űȏ»ĘL/ż'š|ž @ś ( AP@‚ € @ €$…J› ‰œ–^ő=3żÔô/Ńj:óĐ5}S‰>u$ŸL„M*kŐ~Ä€Țőu«Æ~őz­őöśśśśś»{çöőóG·.›Ò©șN9†ĆhÛÔŽ34Ș^ÓòßO„ÖN“Ę}úꄟżDvŸ”ˆX–ć8îSGòo6è;cŠńŠsaŸjì—Ë <Ÿß;Y gîĐąK/ŚßÛŐY>ńçkić3rŒŰsőô 7yŰĂür©O}‚ș㌏›főüïĂ[ź<—ÿË;xˆ”òۏ5înÙ}%\\ÉÒ€ Ì\X [k-FRq;(ÿęòâç^§ĘCćDtèèƟŽŻé9€«„§[r9 —tż|Ș* ÖąeÛÚôtÇòőÇ*Ù៖ˆË~”ŃzÁȚ“»ŸŰĐž<Żč9-œêœexŁŽÓÖčtóŽÏ ‡VOëh­ž­È°ïzoßł ȚŒ^Űtî©»Ț«{ŒŸüŒ—óF-Æțșÿü Ÿçʚêd%űç^J&°l?aَ“—oűÜč}ęÒ©}ëŸé[GDD€ë4żûy/śyÍD"§„WüüęęęęęœŚôÒ%"9/śRü“ïÉ9Í[MÙàvĘÇŚçæĆuƒŹYŐ1cԠߜU»Ę/{ùÜńŸțśț5óșŐȘȚoÙđčĄOąäŹY53æőn ûÌYœïŹÇMŸ›WOn_:ą© KDĘőßpÓśäœFïȚÌ%h0󄯶¶aÖ,‘Nśß‹/Țóśśśż{á»Ö^ćVJÍڝVxúìïđFżŚš[>›™2”B(‰łĆÿêy<€ ‰H~vÙDŸłCfΟęŚÉA—vmÜyîIVyę˜/lkëŠq”rŸz]>|&MȘoߌƒƒ…œSœß2ÚŰYłò”€ÔâŽB·éŽÍ›&ÙĆ]sÛćWdȚŹÿ˜ù›ëΞ”śYaŠŻWpáR—ÎŽ;CC° ê8;ÛËčy§pD…ț›]§235±h=êÛáÖîšÔšĂâc“š­œ€b9FÛŰÂXKš“žUÀ l«Û 2Ä!á€*èőyYÚCś•Sݟ0}áŒí']ÛłaǙôòž#DGêûçò~ùD–iŃđŻaă»~p.Mm ôc6ÌüÁ=#ąkȚ±ąŁ«†Lì~ìáù4U“o­zMë‹bOlX{àهm%]I Ô”1”CzˆçćK™ïÖÆKR"ŸŠDȉŐG.ìŚČ­Țź)‹DJ_—*ß-k7höšșùȚżNYz5„8›:șGœęȘè™YZZ‘źy­vCg”MœŸíFGDla ÆŐM:6gÖ֐|""ŻPÙĄ­Ł'v>œÄ#+ËŚ+šàGg—z»B‹ońak:;ڐ=póN戈ÏM œDD"źăü$e5ûÄ&È mmÊŹ3~ëAŚÚń‡§Ù*Čs°Ą„żăŐΰ”ŽD Ïq*űôȚ»@ŠË =·vÆžĆžZ=mÛ0Ÿvč\nWű8àí}ÿÒđ{ś3”·Rs-鱇WŻ'*fÚ|–Ÿçœ\íÆ­i©ȚPó"†łï9qXs ÖEă N’Ș~ĄcÜș}Caê 7Ż”Šž›†”șțìùsgOîûc^ëŽKæŹŸĆkÓŃƑyîqő„ÀPAü(K·YKG!Ÿ}Ś+° șK§șĆČÎΔ„śœî€«LI”Ö\˜—BÖv6ÖČek‡ìŽl›-ŹYÖČșœ–8..Sê™;Ž0ĄOÂ'śžüÛkC”àœÇ Íś?mòàÖz‘—¶ïžWł|>/;GööO.+#›Ś1ł0dšPő¶Ù‰‰čogńÒWI©ŒŽč…!C…*æöòˆCK–/ûfîŽSŁ]=yűèß~qe_ŹŽK|™[†­X «jyBLBĆŹĆÆ„ȚÜČîRœNó KƘĆȚ JP€n[{Èbö‘kłßß ÈÄDH$ćsünüâҩΞ°p9kïì\§(ŰęN†ê–)­™ ‹Iä-ìŹ” ìÚ8Š}ßj5ŠU ŁSé¶”p=^.6›”oë0ăÄÛ[çźr/—ƒ @CŠI`Ò ÇXŚ)CLo_>ÎÍ;&ݜźxb„Âś’0VÀR©ËÓ Eï?–aæężKßö҄fűč”8fÜšëû ȚÿÓÒęËvc _(Q•‰ę3fâù șXŒ—Ä?òœ*ÊmÔyÛàƒĘg/N+xž'Éœ?‘œżAvt!/öó Źpq©œ7<ÒșŁ‹cQà*ß,uąTV3Ÿ——!lbkßÌŸ)ótóĆș#żkŐÄò©”Ÿ$.NÛ”HqæżŠô7i揓#Šoč_^‡ÀG1ÆnÿušMÆ]ś5SŽ^Ï)ßßòő­mŒz}ڐÈÚÆ‚)xž&æIÈńÄï\ǧkieünBÄÛÚê3ÁYo·­Æ„„©ćđ’xÿ“kęÏîșxëo“çöœv8öuăŠë`XuŚZ+Æ)™ËLËàvv6,•zĘÇíś=!GűőûqìT—Ë+neó$OJH–‹ôdIï—r†ßó È_áâRó`^ÛÎő ï­Œ›­N'*Ż™MˆMà;Y·nȚX/üüŁÔ'†/t‡·nŸaÁ'ĆËJšíŸQE\ŸŸ`ÚdçÀAmvĘż­úœ"@Ćb‰‘¶ŰoóŒacŸÛáQȚÙ ›tq±RdŒÉ]Ûè>ŸZDT”•™Ouë˜(rÆüËź-”ßKDÍ{v·}»m·¶ú…!ÁĄjŹúÆŸ›ĂH“ƒîż” ŒŒȚœ©J’'áX{[á?6VByÌ|ÆŁà(Îșëà/MKż}ëŁöû>.őڞSŃÆĘ\GŐ—äëÎ72ÎÉäœôR$z{ÿ•8ÀÓ/ż–s§¶:5, đôS/ÉT^3—ŸkhÛąŸí«Ç)òŽ'!I–ÛŐ6.Š-Ăł™äi™œ¶¶)#@9qi7wo­ž=äfWŸôÇogï&p–­Žîa}ìg:O${êí›ŃżÏŹÿ}kxéI––}ûękf€q¶o7ćÓ3m]7ʱ:}+ZZ­őÀ1= ŁŽôRœ¶ §ìű©ńË;AÏ2 &ŽĘFŽ$Ÿ ˆ|śfšä ÿ(čëĐ„Ë NĘMêY˜fúńzÉi›:ÔŽ·Č°ŹŐۜeE :véX-%5)6:![J*cæąÿȚ}yÀïVì«æqŐ/"]Š[­V“&yglń—ȘŰoÙ:Uvrï­A+‡MïsöÛó)\Ì© \6M]}ÀțÊ%ŸĐä] ûș-œ›%l»6@±ăŒ{7üòV \hd.ńÿ%àüHÛÌÁÁÆÜÔÔŽZ›ê"Ò©ŃŸ{gíԌŒô€˜—©ć5ËbE][4űœˆ”“<êѓüŻ:5ÓIv‹Wa dGP)hpC=|žÏ?żì<Â7őÍ(+:`ßśî(!"âĆŸ›–lbçê9óû)៧—ÏO|d…ö›m„Oțš{ÂlÚŚŁŒŽdEúęő퟇C$jì”KŸïŃąWÏŃ]-LtžÜ”šÇ~Ù±/đœMć‡ÿš5Jï‘ó;ëpč)ĄÇ‚މšNÛŸù+‹Ś'€șÍ[ՍHčw҄ĘrŐ1óYwÖ̘5mҀŽ#föæ€%EžH–«Üo™»5ëöŸÏ:͜4±”çșÀ|ÉÓ}ó\ŁÇMŃ}ÈôŸÆZ2qò‹wÜŻżxgÇùś<ïŠ{ö”ÎńŰ|/śí?‹ZÎükĂ@“7gŒÚLXÖfy/ëęœG>)«™K‰‹/0hŹíś0ވˆŠB=Śêś…<8&±bV©šhŒœœ}…U.rZzá7æYTæS đ™`« Ęrfłyی’|bćòš#€Æe<}Ï4<„GKę ?Ą  $űÄäaGVíž§Ókùțcß:iđX_Íá'{űÔűÜ'Gż~ÖȘ–ƒVȘ:˃T˜ œ  *Á%v H ( AP@‚ € @ TfZMgșæ±oJŁòz‚Ź țŒcŸțoxÿȚ]§œj.ćȚ^(›rxP,cèŰwŠëđ.-k[芜Ÿvtç~ϗ”J5 eĘnè„1}żlì`ȘU˜paï¶#~ÉÒŚĆŹy«1sg éàh)’€Dűÿœ{ë±À4ùë  êśŸ>cd—fÆLNBšïčę»Ęïż)U”c{— 3Æśi[ÏROšuÿú±]ûźGIűÏŽE;úŒ¶MM;C#źŠ„ˆB„Ș_Żwń î둠֐Ÿ|YŠőz­œșÂE‹ˆçdEyńaÁ^îûŽĘŽ+(Èˆ*ąœêZ;Ÿ=”;ۇ+ÿvç_Ț9@„!022bY–ç?r‚Ï·›·ęÏ 6öïÙü‚_52Ë”c‘ßő'™œŠR °¶ƒŚüí«ÚÒ0ŸkŚœ&j5ì>è+gœ‡—’eDDZ §nĘ2œčìÉŐżŻÆČŽĘ† ë( ș”"#"Qœń›w,lÏ<Ÿxòô”àxQ“ŸcFw6ńH*RĘ^ÓÎ?íțßWVqžn'/x?[9lìÀ: ŚoŒÈÓ,EȘ’-ȘűŃ/Šò}èwî|@jQ9€ DDRqJbbbbbb2ÛdȀFé7{EÉÔÜVT·ÇžNFśí8áôäeŽaănżêíwíVd~9EWțíU“ îÄ­ÛŠŐOó:|àbÀ‹”òj@•#$b-‡üöc»[v_ —1ka ;|œŽȚÁŻ +>-đűÁ]ÿđe{~\4űöÜSâ/””ș'j"qI7n–íčsùIGDĜ~üû‰eę·ûëÁm 1&Ę&Ș—yńûéżûfóÄZ§Ölłžęˆ)=N}s! ]&Žoœsń»żßóDtöïÛqÛwM˜5űìô#1Șb2h߯‹Eâ©Yßl )""ș˜`ïŰ~Í<Ί©=§Ô­ßkXÔKçdŒĘ]lŃż2ú\VdĐ}ő^úïàĆÏœN»‡Ê‰èĐŃ»?_ÓsHWKO·dț·>Q{Y‹–mkÓÓËŚK(§–TM,—ę8(Łő‚œ'w}7°ĄqYnJb­zîš{jñ(ón‹¶ŸŸ~ûÖ”sÇ6:Ț°Owe„Ő5»û‰Ïypńą"— ">ëÙÓxNÇÒ҈%"ĘV[錌zÊ?›'bŒ;N›ÚFšžĄŐÒ„­C‚ÚMéexŠ_Oÿ ÂÜNúIë»t°VC,ĂpYiŻÏ9ÈÒR28"Š,±3zúOȚÖâęȘ\‹*tôușÿîęæFĄ»Ÿkęöž¶Æ„}^' ünߕ[7/ìpmÛdàŠŁ·ožÛ<Ÿ‘.‰œ–^őȚ2ŒQÇik\șyÇçÆ…C«§uŽ.‡E@Ą[ IDAT‹I?Äç†>‰’łfŐÌ^ścèŰgÎê}g=núÜŒzrûÒMMX""ÆŹÿ†›Ÿ'ç4z7 Aƒ™'|œ· łf•¶WiÍڝVxúìïđțÔï”æ–ÏŠAŠê™B‘ˆHœ-ƙ#űܱD$ ?»lâèčûcÍțëäîĆCš˜š—Œ0&íŸlëéS{Òÿ~é,v_:sÁńDûŠ”Œ’‚ƒj6nę„ČÒzćځy53V–Ë±¶”kèHžŸ”‘nł‰_śÔșłuőĆXamG1ZÚÚTÿî-6|~B|ăPËA j7|^àÍ{ùőû|Őܐ!"FŻáà>M ‚oűg”ûÄČČ·šbGżĐłëŽ9 ŸÿqćÉÇ%ÜáŁĘ~ê8ƒKk·z5›Œnó$ƒëlô*h5aŽ“ą^aă©ëæŐ ĘłdúäYż‰Ș1vőŠč­őUőE™ mìŹYyjRjq_é6¶yçσlb/íZłòĂAlÇù›7LnšMÄgúzÚ»tv|; ‚:ÎÎöČG^Ț)œÊö–Zł4>6‰ŹímDÄhWłŹfąĂ‘À¶ș #6 @œN…diĘWN5cGXiÛOîûix3s•ska”óŸ?}ŐxÀ€ZQ§wž>JÉç%čyČŽ”tÆŒnc%„fæe:W„cŰŸ_g˂‡wïKˆH`bfBér"aáóŸȘödÿvçŻ2ÈÌܜ!ù«ÄWŒE:&o[Ű”hn%Đ32PÙdâR/Żúń˜€ï†ƒçOœùûțęs~żüœZŒ±"]]]]]]KŹH[Żű/­’:ąò·šbGŸÏM ìïíćWÒz\ÔćƒgoțęśĘ4F”teçákŻfèÔšeŁšWGêûçò·B""žÜ9čj„{ąęÀńĘ-Êăczf––V65uŸxńPÛÔëî7Ò8"bk [0źnÒ±og-ßsæȘÇĆŁëțt*­ț艝Mâł|œ‚ ìœ]êœ¶Šłs ÙOïTNU{•ÔÌ'Ć&È mmbëŒßúśùżwMm Ù9ŰPBLŒÚ—Ëii‰žă8$Tđč{oÊÈe…ž[;cÜbO­‹¶m_[Ć|RËŒšaFJ†}u“‚èÈŽ#&/ŻűoFÏLI)©3cő-ììßČł4,ń:)ÆìËù‹ú˜FŸȚw-#" EŒŹHFŹu߯nj‹;čùlŹ\&•’@KKH\üËem\šÔ±¶…Ąq”:NŁ—ŻUCÎór”VȘàóâC‚#%VÍûŒíb#~ô(Vœ[·DíŸûÛëæÍ›7oœ^ÔZ§ÖűĘŚoȚŒyóŠÇŻĘt«b‹*|ô•’ÆĆ$rÄćdesEQ±râssóHWOG‘$>x˜ÿæĆáśîgj7nU.kgłvCڟ=îìÉ}ÌkvbÉœŐ·łx"bm:ș82Ï=źŸ*كeé6ké($âłïzTwéT·8CbœkKï{ĘIWÙJk.LˆK!k;kÙČ”CvZ¶M‹Ö,kYĘ^K§ÎbB=s‡&ô©SűäȚ“|ŐŻűo{/ăš5î=~ÚäÁ­ő"/mßq5NùìŠi‰H*“Éär kecĆ=("C#YfŻ€4-Uő܍1íčìÄmßÌjeO·™v8öƒítÇ­üčŻŃÓ]Kö(.N⋠I€„eâ<}Z[ńĆEGžcŹ„EòÜ"9—pæŚŸ­–/™ČțŰ †xNqáÏ}ȚłżqÊÎV=dmûę¶kqӗûæ ?BMżšûƌÍ{źœę‹G’ȘeO-šyIÄcäaÉłŰ{A Š>[{Èbö‘kłßß ÈÄDH$ćsünüâҩΞ°p9kïì\§(Űꎌf*­™ ‹Iä-ìŹ” ìÚ8Š}ßj5ŠU ŁSé¶”p=^uȚ…ÍfíÛ:Ì8ńöÖč«ÜUŒć>ŠI`Ò ÇXŚ)CLo_>ÎÍ;FőÏ|Ą€€ŚÓŚÍ»/êŐ±ÙCIçVÚy:ö-[ŰG†\ÏoŐąÔÒàgȘŸËöțŒôì›óX\ö‹ÔąÒȘ5äŚ 3„žYșäpŰë<ƒKOË Óê]ŠșôÜțuo`OĚW3§ŹĆk p©w·Í|Àșf s­üWŃ1fŁvq±Ńq*ç“șŠ~íÌ\[Œô@°˜'zprùÌűÂCkÎtń]v+WUsâCC≈1ŻÇŒ yțÏV•Uűè+'—œÉ€2Ù?ŽUF(|/őg,•Ăy+""^ÿÈśNš<(·Qçmƒg vŸ}Œ8­àyž$śvțp äęUĂùìèB""^ìç YáâR{ox€uGÇąÀUŸYjâSR3Ÿ——!lbkßÌŸ)ótóĆș#żkŐÄò©”Ÿ$..U|GqæżŠô7i揓#ŠočŻárőUˆ1î°pûŻCm2îșŻ™rôzxŽșż"K“âÓ-kÖЎ8ę—Gś_Ś]êŸČûÇߌż[}Ä%éï%«C[˜^jéJuîÚ)J|x+±ôbQżțùM»Ü ?/Űp7ꝳ“#"óôûŽ,čżq‘W:ODŹYŁÆ¶\LdÌۄAž—šLDÄÖèÚ”œŰšr>ÉZŐ©mÈœxô8śő,’Ï •ő«ŚÀNp+LÍçČț7ZTᣯ}kc†^ŻS.ȶ±` ž§•ç’!GűőûqìT—Ë+neó$OJH–‹ôdIï—r†ßó È_áâRó`^ÛÎő ï­Œ›­N@ÊkfbűNÖ­›7Ö ?ÿ(ő‰á Ęá­ÛgXđ Ańê<߉G\ŸŸ`ÚdçÀAmvĘż]šz€ÿ0!#Òûmžqìò“ u˜YLù0€°żK;ƒk^+ÇôßSM”œ.áŰIƒŽkç„dê0ÊJ5ȘŠìû.ßôC‡‚+żÌ_ëęAPâí—Ő·WÁćœçŠêąÛhÄW-ž'›îęsBÊè7û愯yŸż^RùÈ âłÒÒe‚ÚőëéP`ńł}HŻi GĄ,ńUșÆSț*ÖąO:ú* ›tq±úûL2GDŒÉ]Ûè>ŸȘú±čeÀ„^ÛsjÌîqźŁNűîz.ć’|œĂgÍ2Îéâê»oO 1"‘P*U\†'đôËÿÍčSÛü¶ Vű©—°)Ż™ËŒ‹Ï5ŽmQßöUÈăyړ€9-ÛŐ6.Š-Ăł™äi™œ¶v9\„P„ ‰žŽ›»·~ÔÆ’ÀóâÍS&·ž·ùANČâ\'Éx%Q]ȘÆĐiኄ]-óž\NŻ;`JĘ7\ȟû„§âÜ»‡„ž|Ęńÿèú“lƒú]úurH89ÿŠbÆÈ6ë7šŸVŻkćűEϞ­,RŻ,ûăڏEe«ÚŽsr˜ƒłŸ>ö:ŃàłœO]žČnđòMBś«’ u«·î?Œ·UüéužȘO?;·óÙ*ßą }m3sSSÓjmȘ‹H§FûS32ғb^Š«ł}nvőIüfqöngÙjàè†ŃÇ·HËÄÎÎÒÔÄÄÄŹI =b­švú2çUFFÆ«„žtIÙriŰÉœ·­6œÏÙoϧp1§6pÙ4uőû+—|B“ t-ìë¶pn–°aìÚE†”wï†_ȚȘ Ì%țżŒ“)ioȘDyÍò„ŰDQŚ $>'"ć$zô$ÿ«NÍt’ĘâKZțO©2=Î àżIłÇg†ì_{źęș5[ôwït»ę4>[źgíŰŠłł~ÀöłÏćÊK5Ù/cT«ź„a›öŸÔôĘéCń•ËOĆŒ,êÄâČ9ł‡śç€/K‹Űûꖃśó^żL»ú—cæ|i"”æ$G>8”jéĄ+ÏÿqaĄ°†c}SĂüÏȚœŒûoœęmÒô‰ęGÌíg",ʈ}|căÜ=gjzńVUlQŽŸšćÌż6 |û<ź6–”™@DEȚËz/~ź*0">Ï珟_vž?á›úf”°ïû?ś?”‰ZÍȚûnÍŠ#WŹ©šù{2.âÆgĘȚwâY§™“&¶ö\˜/yșožkôžÉ#ș™ȚŚXK&N~ńàŽûőïŽ6ÿžç]qÏŸÖ9›ïœs‡—Čö~ï‘OÊjæRââ kû= -"ąąĐGÏ”ú}!ŽIÔű’O€ÏcooŻY ŹiˑóçïÖÀLÄ_”öÌcë/ż_-~‹òÒJŒ­5ißáé&gç ÿăA™‰Ż”*€E•pôENK/üŃáÆü!kƒțśo`« ĘrfłyŰŚîŻ*û[ Biž cuÍllÍőžŒÔÄäŹÂ§XÊK+%Ă^kÎÿRĂÍu܎ge»3«ÒȘÀUȘŃG‚ô1 fÙ3†»Žê·œw^€äęGŽy€ČÓì»·8IFBdÆÇ•VFÂșë ÂN_ûÏÌ+ČEÿ”Ńÿ ÉÎŹÚQwĆŽćû»]ęźÏŠ;È-àsU^g* œAúxŹžU-­Ô°ž,eŸ+$H Źê—| ( AP@‚ € @ €$$H ,±,Ò$b‰XË!żmYÔÏŃi|ÖFF†rčqëŃsŒw¶żx‘VÈê >‘‘‘,ęù­óWÔ0cáäÎVyQOÂS %ÀçF`ddDDÄć'‡z_žSłïô…źĘí Łž†œ’ K€ÏÈ뉈ˆű‚Ô0ßKWÂŹLŸ2șœôöù‡™H‘àł!|ïłÆœÇO›<ž”^ä„í;źÆqŸ**€O@‘ Lôë:eš“Iâ­ăËÇčyÇäáÜ|f„DŒq‡…Ûj“qŚ}Í”ŁŚĂspâ>KB"F€-öÛ<ăŰć'ČOÀ§ĂŰÛÛê*öSPY AP@‚ € @ €$$H H ( AP@‚ € @ (!rZzőźÇODŸ:ÿ8AęÇ|ęßđțœ»NI/Ój:óĐ5}Si2‚FłOúzŻîĄ«Ađ)—Ł *ù$Æ€ŚjOŸœăJlŹ&„Òë”Ö[1Çő»ësóêé}kæśs4`4‰țßÁZ”1©w}Lš? .îâÿ̝;wîÜn€q„ŒŠŃ¶©ighTœŠ%ŠȘ*àx.78êàó#$"–e9źŽIYŐǘčôn/zČĂ3Ÿ€6jRZ".3đű~ïdžŐ2¶kÒ©ŚÈ·9ê»Îu‹©Ü,lĐwÆăMç<Â$ü§Žć3Äç'< L "t(,őUbÏŐÓ3ÜäaóÿœĐȘ&ÏćG|~X"ÖrÈo[ős4üožMb­șôlEźȚxURŠąIiÉxńsŻÓîîî'îÙ°ÄuțÁș-Gi*üèűÿŹ…­”V8ŃőčăČ"ƒîżWîd»Àń\žpÔÀçFHÄe?ÊűjÁȚîƒÏïÜđŚĆgÙÿ©/BÖ¶kݿȠßo§—˜iPȘŽÂˆ;‰FŐźeÌÛŻę‹G·”ӑeúÿéúĂčdŽ–íÇΚԯ}}[#AAvj\šß©›/GJ‹śÄ:öž0exś–”,Ž ŸyŸȚ±ęÔă,•që:ÍßțM7[ s#Ă,œâ·”ˆˆŠn/ëőƒ‡€ű5r9kÛiÖ\Ś~­jÉRžȚ:șyËÙgb^Łę’aßő—~Ž?î:vÇ3yńż›Î=±kű‹eœ_—ŃG·WuO*Wú~•Ç,rZza­ÍȚ™'L&ÍܶŠŸ}ïüź?śû&ˈHy© :Ęż¶Č‹Vń\êéč_­ –Ÿû„ŁÀZŽ;gÚ /­ô„).î<%Sc—o«6jĐwüűÁ[Ö¶6€EȚżqdûvݘâ*t:sÓ»]=K픈{Wï=z3FBÄ֘°g_KïM‰.łúՒ=;ú붔țKæt¶-xŽoɇŸ[*+ •(o‘Èié…5Û'Ö7mp‡†¶†òôp_·Í?ÊâŐ9ž•W*ą”öȘˆJ%eŸ *¶TyŽ—Ö“ŒYÿ?N/±;5mì¶Đ7„ ÁÌŁ{Ç€o1śTČÖGuڝV\ZYęàXŚĂ±ïżŚô{­čô“ÎƁ ÎeâŽTjB"’„Ÿ]6Ńç쐙ógÿurĐ„]wž{௷J`ktïÙ@âżÜ§Äč†&„jâ8Žˆç9""ȚžUgăèÇ=^ŠäéÖürȈE­€ăż9—Ì‘,hûtŚsŐ,jő˜”šk‹ÉËûÔ.șžćçgs;.$•#bkŒ\čffőˆ '·I•j›ÙÖmb&(æé€ÛtÚæM“ìâźčír‹+2oÖÌüÍu gÏÚûŹÔ딊Iă|ĘŒ`Y+WŚŽč—7{ODÄ%?.zęž©;áśöò`·krL[ ?àÛőÚc–ßÊæ5ŰŻJß^U=©É~U6žșn^ˆûŽ%»8«VĂæÌZœÉ`Á”Áyj”*QèżÙuÚ)3S‹ÖŁŸnęa±ÒQĐi2}ăú i~nÛöœ(0o;tá·†âÔk^óY[7«•ûÔëòá3iR}ûæ,äĆœÈÚ XčsI[‰ÿ©ęëĂĆzu» ·jW“őÓŸ9Ç‘vû©ăźÿčvkłŻN^·ùUđĄ?6ÚOęvÂh§ÓËą”•ț|3_ćq%lvăÜàĄŸë?;q Ź©čÙjúävŠŸÊś>hzLlklcłÎùĆșč)'żLŠI_¶Č˜ûêËVQ|?qKŐ!›bÎŒâŃxö)tìóOŽő_ą–Ú=+ÓhâÈŰnwtê©%˜ž”ÌŹ2uń'>Ʊ]!ü‡+O<ËŹßłß*+)?ț~dîԑán ńôČÙqÁƒ_lîˆ@Ó¶Żśû…-^IâüE3ĆœßŒłĆxêA­xƒ…ߞO6u €±=›?ȚéNXžlN_‚m],°› 47އș\nP(ć„;UHÿ†Žîš<~a&ŰĘid%II*ֈû—żŸ1”JèÌÀ“ÇÉŃÎÓ’ÔŸsË^_öÊ3ŠD}žłbEApÿ–ïÍŒńÁ™łżłĂi™é"F7o~ŽĘdO/+Kc]v–ÔÙŃaĆBĄ oÈ„XSrȚ•Ś_sá|eÓgÏ>śeÇdߓIgŸsVzï·_íśv*&ó’'>ž€ïÿÔßSùï{~wà^|YÖòËźùùYó§ejT2CÚœò09ÛŐŰä:é%ÜđŸßƟxÿ·<śȚe‡Ÿ|ûżŻž«Łÿ]ąŒŹt‘$ćæŚ6Ę<ô3€$1€à‹'Ń:őƒC#‘±ĘîèÔ7RKQŸsÿ[ż]püű8Tó ŚÌd­XQšzś{ț[čsfëÚșhJfšT•YQìÜńæwćÊËȚ3çd@çfꀿ-!„Đ@ÿI”4cÍćŚ]{É‟ïȚ|àŠw¶”č'ÿâòòsÏLéúâ«ĂŐcIćÂö~ûś?Ö\æŽÆÆśÀڂšÏüęsŹt}ûŸÜßjrXŃÌ_üć·…§fAęȚGÌÁÎožșqŚ;‹.ŰpĆ„7>qțćUÿŸïśÿ>耔Rđîyț·ŻT}úžÚ[b} ŠrL3ÊÛK†,ŚGŁŸ[’:+_úĂï?8~àÊÚ{ęQôíò—™ˆĆC~fD PA©#ĆÙ”Ò“źN„Łőgôü#'2ôžÀ ŸĂ'^ …N΄#•»EáđˆÏȚ «‡lž§Ÿ#.•𙁧€§D;ßHĄÎ]_Wz\čČà„úŠŽe+‹{Ę!èæXꜩ»łĂ".ÍȚ“5›Ô<ęéĆÏS^Ș«I‹óvtđ?ˆB;1I\úëgș$ĘČóĘÿ»öőÍőŽ)Č‹[tȚ‰mïo>ń]±€rą^ęĄߌžr J◜†șá•[țűJk KӃ’á$Š^ęî·ßœńż«ïyæáknčđëëÿÛΆ»;{Âešûàț‘^ôë;$"Ă;eÓvY–‰^WèROȚțŰÔ7Đuđ».Îżˆž]!eŽKKO$0đàˆ$-=…űŽ™ŽŸčSG†»5Äf“ SS柁_%k“„ő3k5YXQff:§Țcèé6‘…9ÙJR{ŒČŹÜTâ©38ưF} $|ńč9]}Gefˆˆ€Pçž-•žWźÌ{Őœ`ŐtÿžGv z% wÎLg{'=#mțÜeęLJzÄ7*~6‘%…vîÓFE!„N;€HdÎ]OßžnĂožûjÊŹŽ€$,=wY\ăŠÍ‘N—Ç’:RRč\DĘźăÏ 0©«Ï_ŹzÄ >.öìÛß%$&0ÀvïŰVOg^tĆâ!ŸD"ț”…Śíe™ôʌá<;Óv6«RŠ >J’—Żž';‘ÏŚ7*Žíò–Ä„gźLíρ$-Y]ç?Œż6 (udž[#\ Ú%›żf•öűf—­Y',êšćPU3›¶úÂㆠŐíŰm”-ŒàGY+&í씋ă{vÿČë0j$LÔxæê_NcWßgBZÒYùő.OțŠ3œqÆLćŚ_IÝ3kíĐ»â3ÊŠgȘĂŠ#ŐĘș’…‰};ïkùBĄ @ ÀšŸęŚ3ă]ŽŃF’Vœ»XVûŻŻ#žŽ%u€šőđÁVžæêïQk•ŠÏ=ëüyq6ŚÀ&d꜌ŹÔ]~I2ĂHf,;s™ÖŰÛĘȚÒiˆŠŻ}ÖïśëŽúEIĆg­_$êùšČ)À¶œśÔ++ÿöËÇ^Éúâłí”=>EJVQي9O]țx„ ƒ7¶gßîæđu—üț~ß{;;ƒÊ”uûk[ZyêËvC5ÛvX~òŁ_ęéźűÏŽŰ€Y‹.űIžĆÄfô'ÇP_ž–äÆč]ž2žìÙW?ùpÊ;;Y]ù—­‰oyă?_æ=zȘ4)3S§NJJҔæ*I}Ær‡Áb±:;Ì^*Óää€'«ŐjmE¶äč‹Î^%ë”XÌĘm­œ^îÖpníícË~yçӏdmÜŃN­űéĆ3ÜfVûU-_ IDATĆßÀ¶|űŻÏŚțïÚ_Ö~őćźsHĄÍ/-uoŒęﻃà«zőÙo—ßÿ?O?•ńî–z‡"ŐșŸ-ï}òĆïԂò¶Ù±‹gÎțćÆYßXđÌ ÜžŁ]HKșś|łËęèżNHöîțcć őQ Qîlï’Ź.›áĘțVSÂ͇Žx.>cŽŒç}ÌOD"„B§ÁhŒćlbŽ«Î­`=œ„;âÀƐ:rá†ÿȚśpüż<śú»47íęô©ÛżÉèćó@2ûúgŸŸ8eàDöY·>z@žé„«ŻúWC۞ęÛÊÎ=çČŐ)IrÖel>đÆŸ{yïÀăȚš—oœźćŠk֟}Ń ?N”†œ=ŸwWÀ ÿčç^émŚžśóÛVÉY—±ö}Ż űŰÈ·K;țö»ż1·^zÎMwŻőëwŒÿÀmŸö Ź/yäőćkInœÛć)3Pśö'ÿĐșê¶«îœź[KćËwÿőßœü©’ò›_zê‚€ăŚ1Ô?đ‰Ÿ@`ÛęçĘęUpȚMÿœZqŐęWOőpśBàŰżïŒĂ{ëÍë.čő ™»}ÏÆGno:ÿ?v1†ÚŸÿżokŸțê”ËÖßôc‰ßaênÚûVO_;ȆMțÊłáș+ÎżêŚ—ÈƒœMûȚșÿĆWżn ŸôrÌłxæ‰+Nő çÌÀ7ÚŽ€gÏŚ;çü8ÍńŐÓ{\ƒČŽ!êXc‡Ț§*‘í:X€@íĄcÒ󗄫Úșđ !„&’••5Țe@h ,țę'O.ęæ¶‹ßá49w*B!„š(&ęW!„B!„ĐhÁB!„BőĂB!„BőĂgB!„Bš^AB!„BĄ~DŻŚs$Ż_żțŽ!„B!„Æ^AB!„BĄ~ž@B!„BĄ~ž@B!„BĄ~ž@B!„BĄ~ž@B!„BĄ~?„‰_~Ś+Ż?úÓôˆ•%!„B!4„0@)ïbŒ%’ž`ĆqĂś;{ŰQNE!„BM- 5múëĂÿȚÚ➚Ë$’Œhy 9ș}·)RębIE!„BM1 I(.MȘyćȚÛÿűÒ7MΩv„„€.Y>=|űûœ¶ˆ+ RB!„BS Čü5·üßSž$Łńő?țúÿÜÜà˜:«$&séČBÿÁíûœ‘Ö8±€"„B!„ŠœwˆÔ3ÏûŐŁ}đČüŽwűőïŸûČÎŚ‚QîČe9îȘí#Ț?K*B!„Bhêòr6&ŸèŹëzâź„Áÿ~đ?ê˜ô’Ä…Ë—f8ö~Ű;Ú©!„BĄ)H<ű‡°œaÛGïlÜ\ăËY”áČi“ęŐ֒éËë,•/ÔúG;!„B!4ő/ÂÎæżûȚЃNĘąóoęó+2d| 6 dł–/Ò·}_íT„B!„Đ”$ ÎŻ<đ·MŠÄyç]ÿżk—æ©&û…Ł~Š9+ÄwnÚŃńaȘXRB!„BS“BžyW=ŽöŒi‰ąń.Îè!ȘòćʶwŽGZăNJB!„šȘÄDœhęă]ŽŃFæ/Ÿ+m|ggW€7MNJB!„šČŠÈít'#š…+J™cßï6FüŰRB!„BSŃëőÉ댯?mEA!„BĄń5EŻ !„B!„Đđá !„B!„úá !„B!„úá !„B!„úá !„B!„ú‘ŹŹŹń.B!„BMx !„B!„úá !„B!„úá !„B!„úá !„B!„ú‰Ç»NdZÁążçljúd·Ùö!,,uÜ1%…gҍ«^s°ă]˜Q1őj4ê0bQŒFĐ ă û!4eę H‰is^){łrßÛ:ș©'QŠÍy·D+ ”n§ukGË»œżàąčæÂ4鑎ž†‰s#II-yf†üƒ}Uo»ùjüĐÎł‰—yŚŽ”ဎ;F§Tš$#'àïČĂϓŻF§FìÂXÎü#èq…ę+ÔÈû—ÈϛłđzŠùöƒúމŒkEhÊ!„Ò)<ò€KÓ4b{ÓwȚˆuŒ%5ŰßŃșÓG”Re©.íȘٚüš=ü?/‰Oż:_ò|Ś$[ Iò5ÓŽžźNèŐ€Çk?à‡“O]žr§Ž·ĐÖcUV=mŽMšàà‹çÉWŁÓ#ö‡`,gț‘ô‚°žÂțjäęK}››ÚŚ.(Œ)Ăt_§oąï_šBąË,yŒ8œHLÆ»0c‚Èu«ŐpŰ`4FšZbI"Ô`ĐÔŃțfÓ±ûöِ,ÍÒé„6-Ń(äRᛚ(HfzȚ*±ęĂûÄ;D›RŰ ë Őíš4;Ițxžl5BÃę+ÌŰÎücŚ ŰżÂÄÔżaWŚF3ÌÏɞ…ÏŒ#t‰šĘn”dÿ}IæçMőŻv;SjČ#éșŽÖú—ȚˆŚpbIćGCŽŁnz–\Š0ôć(Ž?+/ïÂTuź”ńû;őM/éív JŸ©Œx„BŠ‘ˆDwŹ8ëôÖŹ«îń‚xÍÜw*Úo­lȘï/ ™5mÉ_Ȝm;üm˜YRČâÁ41êy{_ŐȚäY·çšÓjł4ÜVʝ=cÙČŠ›[Ćë 2&(T4ĐdêxĄŸęH°żœ"™ægEùçhâÓ%Äô늏›7»ßSNâV„%°¶cÛO9œ%SjŚ䜭ŽO…MN떎–wŒn‘Š?Čtfș~ß ŽĐÀ‹â ÿč ÇRżënœrŽpŚ·Ó@äe9?MK.QÉă uxí»ôÍ/ëíc|_©hÔń¶†4uöÆR]ÿț•ú?>°óïÖ!œ%gfYɊû”­ŚïkÓíeڜwfŠžĘqàówx[R2-=śç™Ú9qòx†5»ŹÛÛ_2xB<ń 2ŸE‹Šb&O<Ç#vrG,@Ԙ€èęËÄć=]‘ŽłÁ»Ž0=—:Ț­mêMŸqNá·”SߏąÄ«æÍÛ đ|ÛŃô—Ő$fŹ›6Ż@Œÿ·Ÿőìîhm&D§Íż2%ŽčĄœ:Àúì6ÎlŹș”K–ŹLœvșź4żäì8ö«†šú°4ÚLČÄ ùšćĘÖRwo}(.!óŠâąÿő‡ V ʋJç\Łt}ÙŃűŽŸ•J‰RQxKB"S—Çцn‹íäÚgÜ7ÆŒ°ćăÖșА8_—”ŸŽ|F]Ő:=á€y«•œ#E[ŰäšXòćiS2šíƒŸć(G[ńŐ@27=%Ńm|żÇm ‰ČS2/*.ÓÒÊ1Ÿ?ŻT5âk€čá¶}z”TȘQgߒ%?yËQsvvy| Q€ĐSId ëꔀ)ą€­“śHˆr·€šŽpȚcčq.‡qs[§™g&%gI) |ńÌ]#źÈîxŽF쀏XŽ˜äì_ "͕č†çêKŠŠ7̙Śkm}Š^yćôŒ‹“őččRÿd sö>GÄÆ4óóàé…ÆQL9ó”§)ŚżÂöż«č†Ő•iT"‹ogDèôxIőÖŚȚbПWP|uùâšÿŃŰY˜ôŚ’DȘÔ3ăB»›MźŃNŽ(€2­äÒžòŹą” ÿwF3’UŒ^ć}ï@ŐżúîŰî1Öхçä-ŚWo zöxH<ûŠdĄ{Ópv^żë˜ßEŒŠ‹húűß{«Ț!ŸűżržtMT‘W°±>łïĐ'}OpőôvÎ]t{aÁ2ÑmĄ@„Á⟄]ŠjźsR·$%.lŐïòSŸ¶âź/uțgßÎOŐLvْëuɚÎNóˆ*(g©žkÄĘ@CŸF»$4ùŠ“GžrȚćń„ÄŠt1@P”Ÿ|áUqȚ·śí~ŃÁ€+ćÔëîâ­gKEæ/sTžȚÚ[ŽôôöęM{óÀy♳FܑÀÏ#‡;é#–+&9ûś{hénęÔèiUçźÊ }ĘÔö­;©4?”$NÁž9SÁÉÙûÀ±1ÍüÜ8{»Tc—3ÏHá6ûWŰț—†œu˜ŸŽO!„rO+t|^Wuc”A’:ę‰ČÜèu{gáČŽšžÂ]æŽż™;ßÒÍxŒ4ï†LĂmm3Ÿ;ą V‰Ÿàe}?”Ç)à8ț—L©ÔAžŃìk—Ù°/TČTśFXœ,ž­Ș5śż¶kmu*ɂtm’«ő·5­íęŸeÒŰńȚ”šQÔֈ%gâŐ{ač\]š jêș’fqÖÜ䀌űŻüp·$”ù,Qd(xž­ŽÏ\DΘÀˆlRF,gLŽ]\ńŽ•đźæH™Œb)SžyśżŒJÂĐPpÂŃ BS@$ąĐž†Ș«wzčgŰ«Ł ‹H’W§ˆ› †–H5Š%U(êÿŠčŁMą»*;^ ÔWÙëą ™ë5ÒÁ*a˜Á·9zĂ!J䊓&RÖ™*àFF"MY‘ÄŒÎ1ԐukŽZ;(‰—HïȘ©Ćç E†ü€süÎJł_ŠÉXŁű=‘Ÿ‘‘Ź Y*í3ÈČŐÎŐjË”șbÖČŐ<°ÖVQ0rPÈ{âgĘ9Éă}łżEkXrŠÁNO(NžT€đŐŰęażœÆ+›©‰K`œzț€ńŽ€ÍfmùÊ̔€è%žčk$ rÆFì`“2b9crìâ*ŠȚï7’‘2ĆÖVS°î‰ŻaȘĄ!4ń‰šÙŰüŻń.ÇšKLI«`ÿ1DŸ KȘp!gÇkœ™śfźé<ô…ŸvèëȚĐλj΂Œîî]NŸŸ‘eÄ'-IôțŁòXUÿ–šŃbiĄùkgÎòu˜»©(YŰŐfl§ìŃ^ł5=íÚÙÓUĘv;ŁŹÈHÏ XEß§˜$e\Š\–—š! IHY‘â4ù}nŻC@DȘü'g%Ž›Ź Ț€ŸHŠtÙó‰ïs‹Kđvp9ÛA;-^Jìƒï hkÜź-čn^YZ‡Ą1(ÊŐe]šĄê›wœžm1ŽßhvÏΞ9Kê3Śì;±Iî¶âźo ÆêüŒß‹6;yÒȘô$eàÄR‰"].MH4‰qJ șDíâ ÏœK˜'•w©„ô~ŽÖ™T™)—Ș„ÒdRąn9ă·ÛæÎ™v{Œ’Ô€â°iŁ‹uq„Śj“dŸŽNțŰàiIÖĘőŸîŒû3JŸ‘ő|mrZš8%.afžów æČG‹gî ‰^$3»ì©|UGëț»ÛȚ»ƒ;Ù#–;&9û7ŠoiÒV<9D)FÏÜœÀóY!ç˜ÚjêőŻÀę/‘Ä+ łŚuêÆĄ12a^87șˆlyšZdkÜń€c,©ĂÜŃÒQŻ-ې§ȚZgń„ŻŰŚž›wajæ/Ò%R4șl»;z_§ »Z<ÌܔŸvq±NNƒFGǁ6—©áÁrcNÚ532ü>g„ŸæwȚÌJ&ńȘòykeç¶tÓîÓPŚk{öŒ*àÎYżu—+iujÎJ™DFC&·őœšæŚűŽ­†äà”đ^˜ŹIÔwț*$ê3<^^W{NnńZkv[7Ö4żiđ ÎÚc1ì Šź‘‡¶4X†LęmĆS_ÚÜväqIń•©·f°V·ć«úƒ[ăJŸIëûkfNQß2NœLÊ.y8۝5ÛîïĄœ©œmÂÛ z?Jk0ł ç.UY^I *WÎÔäőúƉRł”޶Î攀'ł^whp·$v«șǕYFÊE…éb6hńčö·û0D‰gž ‰>$;>^-osz…ŸæÀˆä Ü1ÉŃż±^žĐV<D™ùŒ žč{»d»ûà'cú͖ Dâ6,Xô ‰ț7»ê«'âÓń Æóšôì9KîTêo­ljÀ,B§ËTżăŽ­«u[8éÂŹ„˜nd@hŽˆâ‹• ïé©ĆŁI4`<ÿ€‰U™'ÓœmúF\!tá è}±Á€Ê,ș nŒßŸ…€X•PDœ›șÂ„ChÂÂxțá"òsŠČSmÍ/ô}Í=BhTà-v!„B!ÔŻ !„B!„P?\ !„B!„P?\ !„B!„P?\ !„B!„P?\ !„B!„P?\ !„B!„P?\ !„B!„P?ńx`ąa*f.{DĘs缆šXŸ•‰;łhÚ„șÄ,©ˆ†ümƆ?3ZF­hŒi‹țž'êÿ‘Ę~dÛC†p„?Äțć!ž%'Š€°âáLșń`ŐkvŒ #Đd,s,~hőuÇ/¶3BhÊÂÒX`fÌč;KÒÜÓțŒŐϊ% ·}ŒË4^ˆ\sašôHGOÏIJjÉ33äì«zÛ}|ÍÊd€N»«(m†zí]ÿŹmÜá•/§ĘGg&.óźi)Qț,zÿùys^Ï4ß~Pß11Ÿö\™6çĘ­€RșÖ­-ïözüc»YA-9±1öőetJ…J9rŽQË€(ŚW,Ÿ>Țęß={ță^ôđ”䘕y€ˆ(nU^ÁĆ©ê|蘄Ę.ûŸžö7:íÇK[lLœú’”ÌČWŠË?Ü·ûEÇ >%Ș+,ŒšoÚÛÚ6f‘gęyÉôčCnĄ M•ÿÓêæ[͝ ÇšăTi?ÏË:C­ÒIˆ?àmș>omùÆžsjd#Ű1ßk]rȚuùéć Û;jwăJ!aÄ@Ąt"Ï<“ ‘ÏV+ÀŐòçŁ-­?űv•ħ_/yŸk„ÁD’|Í4­§ëÀ‡'VG@ä·ÍÌH65>f$+Š 3ĘuôPśš\ÀńxíŒâprÔCjŽț„ŸÍMíkȚ”așŻstmû„ę­;}D)U–êÒźš­ÉŻÙóˆÁ?б)€%‡§ŽBÄŰëú†¶«ČêiŁm”/ˆYòb°·8Eùš‹śvŸ–«2‘Ÿ[Z~G2i1Țï2YŠ*iQąä?'ț$¶ycâԗšÍŠz:m~Čòelj>%2uyèÛÌú±„#…ú{țŒŚ‘*“Ï˙yyąóÍÚ¶*żżŚăZ‚f±içÄäâÇggçČźJŁ~K€ȘdÊb”:—ižàûÒhË?{GßkŒÊ±™H•śÀœ|łëí†î† ȚˆM$bąË,čSițgsOcGÏš`€h0`ÇæąQÈ„0âĘ'ÉLÏ[%¶żĐaŒ“)UyÄóy«~› șUËÒTi,§Ż”čú7ìêÚhÎęMNöŹî†šŃ9Wû 5ô9(6Ó]‹çŹÎÒ錆qŽOá±!ÊÖćʘțwukÓ erÄۀ±ź/tŽŽNVƒä””bjęȚš°$%9­ÍĘ5ŒÒò·ä۔y„eÚO’%úŽę·6ێś|…%¶yc՗ú͕źiWk4ÚVśńLPkŠß'fŚh/à†Ž2ž—KŹ Óx_É\=ÚWFœ‰8憙YÙŸÎÔí>qNƒ˜à{Óh+höŽČŚ•c3ąIRçƒă„šșśŒŒ šXÄÔn·Z2‹ÿŸ$óóŠúW»ŽI?ˆ˜Š™Ë”·ÜÙ!œŹ0łk#3—= kșčUŒŸ ca‚BEMŠŽêۏÖK2-=śç™Ú9qòx†5»ŹÛÛ_2xB SjŚ䜭ŽO…MN떎–wŒn—śtEÒÎïÒÂô\êx·¶©7}Æu:…ßÖòPu[œœ+őX€ˆăÏÊË»0U+eü>ÇN}ÓKz»ö·sÔ‰’o*/^©i$"À+Îșœ5ëȘ{Œ ’i~V”Ž&>]B|AżȚaúž©qłkĐ>œÄ­JK`mǶœĂú}&ĐŠÊpKŠ'ʂnWśĐȚáÎ9zbéßăŸìî1{JSÏJjȘ±ŒÊńÈhŽPruÓłä25€űZ#zKòŁšÄÆqJUêćӊ.Ldś¶59č96F\_"MdéÌtęŸĄă%/üç‚Kęź»ő>iê썄:iŸțìü»uHÿFəYVČâ>eëőûÚNș\ L›óÎLŃł;|ɂ”DÆÙôn/]TŹ]$ëű`HœąŒ}Ÿ–”ń•9ÚŒÁ3șcĂH€I@[œźÁ+ÛțÚòԈYRČâÁ41êy{_ŐȚäY·çšÓjł4ÜVĘiÓqԗżF ‰ÙŚe/K‰CžC]MÿrŠț­„yš7žčQo„Éuu^rč€ă‹@%K5‰żĄÒ90rxf$ź™ÿžš#%Șú—3źűsŽ^_’œš}†4°ćXăî!W|O\F™l{:łwÄœÆèÌü†9đô7BĂ$Ÿłó±=ŠÏ2 o*šÿrfś+ő͟Û“ę>UqbÁƒrۇM‡_őP:ëșÂÙÿ+>ű?őV€Ï2ÒÔÛf‡:[ÿȚÁj5™?˟ó'ńÛl<Ÿ„c=o™ˆ|i~țâPÏ íV7@ž}à“â„ü?Íònk©»·>—ySqŃŒÿúĂçàD„…óˍs9Œ›Û:ÍŹ83)9KJûș‰QdÜ7ÆŒ°ćăÖșА8_—”ŸŽ|F]Ő:=Dš+s ÏŐ5–o˜3ŻŚÚúLœòÊéy'ëss„țÉQâUóæmPxŸíhúÀËj3ÖM›W Țg‹ĂÏ]#Öł»Ł”™6ÿÊ”Đæ†öêëłś$ćE„sźQșŸìh|ÇÏJ„Š‚D©hèMæDŠ.Ł ĘÛж`=†ŻìyŚfç^Źœ.ŃóÎțĄ ȝ3_búű+e IDATéß>«č†Ő•iT"‹cTΏæeéröûL}?r·†€> ȚŰ"V•_üËŹxWoëwwTù†źFąÄÆÈë0o”Čw€h ›uźyڔ jû ŚOæ†ÛöéŐR©F}K–üä EÍÙÙćńF‘J@OA&‘%0Ź#ôS’ŠTˆ¶Î ‘h'1­­–F i€ÂĆÉÒ;!Fû|-É]fŽyŁ/nc˜Żž„œn=KŠ”ÚTCśÉ—őxjÄlŹș”K–ŹLœvșź4żäì8ö«†šú°4ÚLXî>⬑(.ûeӊęœš;Xù܌ÿ—N”À_Đ“YŸŸUĄa0‰j±Ęl:ÖŃ<3ŚÌ߇{€pqÿòŒîœčêËÌR'HƒÆí–Đ©yÂäÜÓ œœ#î5Šä±B“ĆÀKšÿ°ŸöƒțŒ‚â«ËÿŰĐüÆÎšÀ$>ć@¶ČŸæMsš]N›,țŻYč«ÚlŸ xX›ˆĆúșȘô^zződń}™ygŽü‚çłÁ†Țî *]Vț ę»îîA{ŒDÜÒpä_Ę źú—”§êf‹ ÛűŽŁ‰"ó—9*Ooí-GzúŻe”7$Š*ò 2Ögöú€ïzOoçÜE·,3ùZș[?5zZŐč«2C_7”}ëN*ÍO-‰S0nÎTpgfŻWyß;PőŻŸ»Ì{Œutáă9yËőŐ[‚ÀY#ïÁ/)g_‘ìŻ1to ©0ńł}{ęÓ­QWÒű„|âÿÊyÊÓ#ÔûUkśÏËòÿ'ÁńNőĄŚOzWÎ$›ŻFŃqśï Ò…œu˜ŸŽQ»ę$ŠJR™Vri\yVŃZ…ÿ»FŁ™kèŁՅ/6ˆdZZÁͅ9Ăkj>±ùO=\Š#Żo Ò`ńÏÒ.S5ŚőÚ'qKRâÂVę.?ò5Ú} ĄÉ7|Pȕó.'$V€‹‚Șőć ŻŠóŸœoś‹&])§^wÄiŽsïgOÈGȘÜE—j““:»Źę•‰>öùZ’łÌ\óÆ¶Ÿ#ù‘ÎWÜšżç„–ÔÇ g>·0ùĂÖ¶ŒÎWKűjäő»Žù]Ä«žˆŠÏшÿœ·êÍÁڜčêË]#Ń‚ÜŒÙ`ùÛÁ#Ÿû(l1Űo^8ï"IL5ív™öxsÏMN’L~‘J3W:`껜g rÎü‚F ‡ś/g\qçÌYߐS#ćΙ§FŁ…u…ÂD,V}𜛐q4Č Ôżœ±n“‡)͝čNæÙoőöśokèŁ1@-Ɩçă 6dÌú«,é͖Ö/­țSŻíEŽț FX_4o”„ïÖjóZœM”d€hóYë‡&gk9sfînÈJ—3*…ș(hzŻWœN” d) Ëà €HœD#ö;Ü™"Àëqș˜ä%ńCˆręXpÏ„XF7?ÖhiÂÒùș&c}~*ÊâȚÙÄwóŽÇćvs«QkÄÈtR°{œƒÂ›öúßŹÆƒ­3™m™ê 9ä”ÎÓš‚6ęŸ] OLrśŸ ‘Âaìú7jÎ<őe}a "Fq最{ș|ł7Ś^cD3?))Zđx–€ÇŰűÛŁBwĄę $‘$~UnÁYɉ^ăû5{>èu ßQč,-îűF9`ƒ.óŠ„!C„0ŃVE§Ìsd8‡¶Ă@i,{Üh/ü€}7đ 1űôűa$eÙS)9R) àł4=Đjzn’ÚĘlÿ&bšQÈk|¶ÊüarÆÏrsźž›ŸÎÚúèá–Ăƒ¶D B7ˆâÒÖȘaOmęwȚ;V¶`έ%źx.-hȚegùræźŃš!§vîqËwÙL»ô@(qyyÆŐ™ú»Úû^őËߌ}4Ű©ăhdÂÛ§uû7·kÖæ^U¶äç¶ź7šÛ6هœ Ç3i}ƒ{_‰vY\K“[ŸX« XŽVžzĂL\9Ӑ·3@f*”%ŠDp4lȊ.žźž)s€ŠÂ]?&ŠÌ—eÊôN|ß -KQ+ œÇ{y,ŸˆoȚˆuŸ Üméű›Őx€táołóVtüJPkśó‡‡ÿ<\ÔEĘQŒ+)`7í„ÏŚ(_ńė'@mƒeà{ƒÍHŃz_ÈHá2vę5gÎúR%ĆeˆűÇIș§8{GÜkÄ0óÓ&ęŃÇ}éëó ïÌwĘÖ èl„ĐqbHH.~Č4K0tlï»§s˜{…€Ś¶cìÏ*ÉS%O ‰ćòd`üA @tC•H'rù€‘(ÒāăŸU€ÛèŽßșÚü–(2'jtë3űĄ™‘1ŻÉș_ï€Đp0D" íišșzśĄ—{F~ì5á0‰Ë”ò‰MČP§QČöC€uBDŠÊž™‰HSV$1CŠ@&i”NÁ ùŹí c_€(2äCêLCȋd}żőșLûœ”Ò`‡ÛæÍy4jďÈ3ć$ìóŽÒïŒȚ„țoš;Ú$ș«ČăĆ  5žúHÀ8â56ńž{_?ČçȘœÇŸő3ƒ'n} dÙjçj”ćZ]1kÙjvàƝ3 vzBqò€"…ŻÆîûí5^ÙLM\ëŐû(ű%)Č ”ûĘă6cß?Ă»]ŻDł8‘î±?@HKžRæ1›7űˆ™ĄqB€łŐq"Ö7ű»|GRŁXPçkH’”¶J1P4&n…6NÄùĄá2Yńš''*\ŠœÇkÊ“BzżO”‘2Áđԗ{BČ5Ó Ê„Cc&éžNđìaŻ1*3?”ú”b(#ô! fcóżÆ»ŁŽ†‚™ysï•vîńR­:ó’Tq{{ëÖ°G{ÍÖôŽkgOWuÛíŒČ"#='`'>ËúiùeÈőß»ÙuÆșTqk{ÛÖáÜû1êXwŚș3îÏ(}FÖó”ÉiĄâ”ž„™áÎß5˜C>ĐÖž][rĘŒČŽCcP”«ËșPCÔ7ïHcÙ,íĐŚœĄw՜ĘĘ»œ>?#ˈOZ’èęGć±*A»$jŽXZhțڙł|æn*J–v”Û)ˆTùOÎJh7YŒ?‘éČçßçŚà¶—łŽÓâ„Ä~âĐ)ä0|ăÎÚP4śwČîcŹą"#}ŸŰyÄ·bZń*[Í·~ʙ3O€Eș\š ‘hă”@t‰ÚĆAŸ-0z=§žĐŒ†Hâ‹ĐÙëîŃÚpGhÈÙńZoæœÙ…k:}áçi ΖäGZ2jlœÚNgÏ«Î!żŠ1Ö·ïûfśìŒ›ł€>sÍŸAá(“*3ćR”TšŹQJ@”ŁŃ-güÖ@Ààq›ÂÜ9ÓnW’šT6mtQ ź#ŽđZm’ÌŚŃɂ(>eĄœi3 ~u•ÛÒ{0Ź] M”XŹAź±ÏӒœeæœ7„"™ÙeOć«:ZśßĘ.đ.UR˜_ńÿ°ĂĘéő»@’›œ¶F-êèèŰuą”ŁŐˆIRÆeÊeÉq‰’„”)N“ߌáööżâŹ/w©B»Ûڏi n,›“Š7¶„%3ÒČW)N­ĐêÛÏm5!Ć?Jc:Û̓îă‰IΙÿTCG ë┩RY©BDyIŠÆë ôzĘ=VęÜă7†væ©/őž«OyjVÎŁ‹4ûÌÖö(eÊ鉁7wŚng'ăžNèìiŻ1Š3ÿ(>a‹ĐƄxáÜX !Ó?Žž—OËęńRș«ZȘŸk”őĘÁä25<Ű@nÌI»fF†ßçŹÔŚüΛùBé‰?!GóĘíÒ_ćü*[ÊĘ{›=ßfóEÛÒiŰ}ŹêWțe)Š‹Ù ĆçÚßȚÿ 1őŻ Ż+È='·x­ˆ5»­kšß4xÂ'œŠpŽŚìkÏÍ»05óé) ]¶Ę=-‚Ïf…]­fnÊO»žX'§AŁŁă@ë·îr%­NÍY)“ÈhÈä¶ŸWÓüÚĐUë”đ^˜ŹIÔwŸű:ÖńzulzÁšÜ„a“„큊¶œLÖ㠊nžaź­î6rçÌU#fNQß2NœDLÊ.y8۝5ÛîïșBŠKJžĆű6YÜòœAÁ-őڂ yê­ugÿrśç8ԒŃbCˆÈ±[}ûx,†=ÁÔ5òЖË ƒfváüÁ5*Ë+)ƒA5âʙšŒ^ż8Qj¶Ö±ÀÖٜ’ôdÖëîĄ$7%%ƒÚ?2跌-;mìâä”bb­Ą\cŸł%yÊÌ1oFČăăŐâđ6§Wđjö˜»śȘRK“ÓË€rYÜŽÍ Gÿ«òŒDä1‰W•Ï[+šnÚ}:êzmϞW]”ŻŸű‰oČÜę)={Β;•ú[+›&K‘'„ÉS‰Û°`Ń/$úßìȘŻžj“-ÉË[đ\źûÁí5»Wm*ŚŁ±Ûk”ŹyÿÏï:đΓ Çé{ĄáŁm]­ÛÂIf%ÄtĆi$Ve^œLś¶éqg4¶&_lLAąűb%è{zj'ÿjá”7™**’ăšÛ9äžÏ)T_4qŒć^ƒZíöN’ű“ŒÔiä;*š$p„&4è}±Á€Ê,ș n2ÜEMäçe§Úš_è‰ő+łŻIS‘X•PDœ›șŁôź·qDfÎȘŽűòŹô3ușUé97Í-»&1ű}{Oś ‘<…ê‹&Œ1Țk„mO6Zdi%ÿX<œű o±C!ôC—””uyvêŒDUșTİAƒÓúmGó[FÏËŐš ‘èéÿJڈ=8Ág„N“‰ÈWÿòÊ»«nűË~ę©_KêÉ$g]ÿË{戀†Cn§Ł±ŸáĂ/îèț”ëD;cöšűî{{}‚?3!ž3ŻțÙíêêÛț¶żu"ï)©mÓŸTËÉ]ŸúW%ĂIoDŸ“"g5Z1L’Ăžxž„5:í0bÆpæI/‹+ì_ÁÆoÏ.Jœòúł/R™6oùŸÚN•ńrK/VÄœŰłÊ8yő̇ï^*ùâęßołá(™TÄ@Ą”òțédEâ ΚÁꀥ3Ò '–ÔˆšłăœŻZŒŒT“šŸŒbág$?öűŠoíۗ)^ŽèòžŸïëőMȘ‰/]|ĂÜàçOWOèŐĐ`W«Ÿ €ńÏ ÜÆÜ©ăzÿú”śCÚ[íïąĆϓ°F§FìÂÎü#éaq…ę+ŰžíÙMÆÜdhțr˓_YN=Š‰Üƒ{V'#ïAj­{ń»Òüdùč‡?û܊Í9‰0D”öêŸȚŒH«"±d$™VQ~~‘2Š<ÆіM›Kș¶tE ÌXR#cœœÛ¶țđÛȘ—ßúôÖWëŹńùkË7-‰KS‹&^òa’Î[3-Ÿ©úĂáŚÊĐP{·țPÒL±üń<Ùj„†ûW˜±ùÇź°…Ç=»D,jsF;ȘÇ&ŠdÛvÚ ÙëW„JF”PhŒ‰šŻ¶Țó“K.Y”ìèżß«üȘĘ'űbÉ D2}ń‚Ÿ¶ŽÙè™X—HÂʊôpĘ·;W@1€ ànëi ë• 8ûšE•5ęÒóæŹ*Rk$Ąž¶–O>Ùęa‹—Èg-r]aZą2^Âræ»OŸ áŻŸôÀŸ (Š?üèêŒoßżácóŠÒnžśâŸvmŸäĆŸ8ÿžÿęńYr€°qÿíkŻŰ°ê’é ò°wïÆśïŻTÿú‘%üÎ[ŠyżXš[œ,cŠĘßíxîÛîËZŒvFÙ”çȟτ6[]íá—?ŹkŒŰaR‹ÎÊaœŐd<čÄYsç]”zzyŠJt5ŚŐżÿĆí† šÿäŐË?~êÍێ‡3mí„?ÓóìĂ}l„mÜőĘé©3Ï?sÎêÒŽ<”\öu¶¶|üéîOZÇűÌ_©hôń”†hŐ/Ż»·Lԗ@mGî~`ëÁĄĂ,rΒ‚{='só[·m¶ ÔÒŐŚ_s—tû†gkmœ"ækIąÔź9»üÇeùjč8ànmlzçŁ][,O<ƒ˜ŻFQ#D9wđÄs,0b'wÄBô˜ì«s”ț%ÙkÖ=SÔòŒ9ÿÚEêPûÁ?ä:wÒešĐ‘ŻŸ|`łQ˕jđqÔx"–o€Ä‚s”Ć4ŽbÍ9j[ 0ćú7ÖęoDLjéœWÏ)V)âd †KŻÙt)k©ŸëĄí‡ĂŒ30ìÁaő u”n© Ü[>œôӞ1ktúˆXKGó•]ŸÌ™W_R±\hm5™†û@‘/œ;ĂvôÓτ:Á€ÍțçkëŸŰöuw„ŃKj$ą‚ùćËT†/·ëM@œ>íČ„©æęû6”@‘żèÏ·.+g;?ĘRęŐs8{ÆekòàX}”Êú,œûkM™a;öÜGŐ[«[vV·T5›zŒ$)«Ïʏo=úIœ{`Qٚżræ gó;û-!êź;ÒČópÛ16eAŸ2%wf[ÿʧŐ[[­MMú6O’ŐÓËóóÄ7~ŽûÍíÍ-ŠÜ‹Ï.É1Öm룛ûè­KfžZ>üŠæ›šîV€(<»›\Bۘè,șz†ç“GŽz‡ü>}ńțzŐôÄîșw·Ô|ßêK›S¶aEȘ­ș±ȚCęvf֊%ț¶O뎦(yíĆć3 ŸÙnôđŽg}]”I™yóyšŽƒu›+ë¶5čTÓf­[ź3ïohZ<ĘÌÙçæzŸÿș1ÒmÜ©‘𕊣F|­Áö¶”í>ÜŒ«¶Ó–”=]aúú»¶žAĂ,zΐW^2?۶ńˆƒ%â„$eŒ˜őX`Ô+֔dé«ßźqrŸ áiIYú/o»đ†ÙŠȚcő›ö5ïïô©ČíŽy€'žyjÄ9À$rÇs 0b'}ÄrĆ$WÿBbᏠ—ćöî~wšlYé+R,ßïűÀ‘~ÁÒűæmͶ\ŽÔŠö0gïsG,ÏH‰g/Gă*МčÚŠŚ”ëߘśżŃАÛ~ŽĄŁȘŠŠ%öîùțĆïwT·ì:ÒyŹÇíăĄœœ=8‚ ÛdUèGjöÆ™ČFĂÿ%Iąì[Œță'nűű‰+nž&Î]sÉOÜđń7Œÿ‹"ù˜yDșŐćI¶êșę!%5:&„ôáńƃžčqÙ\ûĄ‡žțnGß1&wi6Ôï­kgd*…L„©ëÁ&ŸŒ ŁhżŠ«¶Śœzu>ÔȚșÏ9đCŰŃmŁR•<Ž„ f=›žúœÙ„ ą‘l‘(ÓŐbj±†NâìÜùȘPŐźúžßłÖ†/jń3òJÄÔ·ç€ȚŻÍ_–ÙWy’UšŸêÜzÄM‡ŐVQê;ű„#ÔnnuCb‚âô}éŚ)„â©gkpăÌ9Ümtƒ&1•!)EY™n·CQȘ!LRRșŰßit‚:jKùÜ:±­éĂęźŃܱóFpÆóXm#vâG,gLòÇUÈÖaŠ@ę67 t›:Y >żÄ áNÒûc±±»REË9ŠęàTìßXśż§öàIö kuô°D§QᗏNC^óÍšóŠŻÿqĆOŠ%-•»ÿœWÀćRÖđÖól€|ÉEçźèÙúÄ. @]։đViAńJ{ûŸźˆ…‰%•kkúŚ»Çô’ôK/+Sśv0 <4”œ˜Æˆ4\șń‚Ą*DŁőäu4wN=ŒŰĘÎż„,Ò7öÝûzU~śÏ–>uÿÜĂ{«ßȚRł·w8—ÿˆL„$ŹŃwҋ,€IȘDpu𠆻ŒNZŠÒ)ìàŹmÜ8{éÍ;La&qÉlM Ąz·`Xm±Ÿ’ÄĆgV\TžY˜ąŒ“!Žít‹œR*ȚqŽ7ΜÙŁ&&€ŠeĆ)ꚃ;ŠæÍ-”}ìLJÇV“€u GK’8]aMÖźŃ]ńFŽ €3oú7{ IDATžÇj»±}&rÄrÆ$wÿvĐ@ĐÊRêőĂ@é ,ŽT!œ?»±+UޜcÚNĆțuÿ{ÚažDh†üî Q(€ă>ê‘`ę $&1{ÚÏ~\±vŠŒçĐĄÇț·z§!ÂAvÔßŐÖĘD™çŁ~koM“iŽőc&žSQlźûŠ%b‰bIćBö#GZ±zwnÁŸ—-:ë‡ïśR , V}úƛ-CçêmÉ㘌8âÙ òEêș0Ëń"śpŚÁíż>Z]±€lꙋY\vđËM}Ő%üÍ}}ț”?4Á ú™zÛ· Ț3» ś S‹&oIVűÀ­ęè…·Ő©ő%Š.șw¶ûæÊÇ­ŠÿÏȚyÇEqŽqüÙœ;:œw©Š "Š Ű+öȚ{7Ɩ71Šߘ7ŃÆšDc‰±ÄȚ!(*‚ ‚ôȚ9àŽž»ĘśșÜíÜ]ïÇdogæyæ7ϔˆÜdîšÁvČZŁږŠÎ"*oĐäE•r5‡ÇĆMLLÍí°Äż_«x|ìhj˜„­QÇË„MœÓioâhæȘZr;­ê­F©Z€E?ŸÉÉͧ}ŸƒÚ“du)ŸÄ Ù&8”ĐŹ¶oMš^9Ê)¶%ĘQ±ÔšTžźh|%ûΩv¶”îˆ<-ć=źßŽśżÿ:š%B_ƒ,UmYY-ÛłD—†juÖ±}źűőiÈ{3;Đîć4@œôŸ˜R‰œȘ°Ÿ”JæłĐ"IÓuyź¶qjhT˜ïèIÎ·Ž%”ćŚ/GûźőȚțöĂgIe"56ÛȚÁ¶'lƅœ†æOVŸ|[&ç¶yĄđZ|…HMS—ŸôȜ Š"âcŒ}ŸšĄz?SÀ2ŽçŁWÎ#Mëïb©[šČtŽlm51 wrë1 ·’SÆÍâÔÈUđc&bSț,č$żRÄĐ2 lĆ(Oxю7KDé9e€»‘ƒ6Öê%uč範ù,ôĘ”FçjL _UP€{?"śĐíô束59„_4IGu*»ù‘4”Ż(í%ù…±…0oôȏXI‰• {‡ŃŽ*Íow3ۆl#-5¶–†«‰ †kśt·ć— Êùüü’ê’ú*„škA–Ú—æ `êëšèšëjiz10]//{ź Œą"·šJ@2Y‘[Šô0Ș‰{I€ž àm­›Ÿ=ł(”G« :O’YáÏűŒłh†aTÒóŒj‘ȘŠ­iő“żŸm\XŠgj‹dQ-žîÔ”S晗Ÿß풌 )¶›+–F“”ő«+“D€ ‹Żh .­„4Ò=SŚÍœÔș’#eč|őțŐŻlęoGjŸÊ€Ž*š;PƒZVÆæ$7<=AêF0éÒÁŰöܰ7WÓ$í/ŚŐvAVfœę§ŰoŒŚl§”_’„‚Ìš­{ËfŽv"N^æőÓ7òęfÎ`Úőßó‘›Aă‚EÀ”Ńâüš”»ž§ËpÎFqJfșƒÓĐaúZLRP™‘úêûQ/Ûń!,Č )7o‚»·łÚg-™"Kąn©ő\8Âyö475qUFòënG‡·,“0&&«ČŸłIUòŃÄVYRűŠÆ^‚ôG°ötïaƒÇŠȘ3“Ț:œjłhƈú_3,–m?¶ywąú”ES@˜ńĂ緃E”W)Ïë ­j_Š7æK6”,•ćì–ł[”Š*eą2ŻD€iÌJ+źQń›lÆšždAQęÓQjO•™ûŸ‘9Îkl/ś%uŐUEùč—Ë[ÖŻ=ÓX$‹rè`è:X©kŐ€&sÚq^>RlśV,&)êWȚ{|E”–ÒDôL] ÔŁBŐɑČ|ŸzïêW¶ț·#ьmĐDTƒíźAPőp5e–'F HĘÌÒÒȳˀèîàús?™9§úÉČCoșêÆićnÚïàÖț:Oź.蔏>\Žèî =È Úïî`ÚÎÛżfńűҚ›%ÊÜ'ŽP,ïûŽgÄżQvë~Z”ƒûD›îń%Ä{†„‘Æ y^ˆÆˆś€çTûĘÜ֦ÛÈșű„ƒfGĘ 4AB(ȚëÈ_ăT'LîmŠHˆÎ·ł5Âsäąę ˆś€çTûĘLßeùPíž[Á\ŽÁŠ{¶Ű!@ Dè @ @4€&H@ њ !@ Dh‚„@ @    @ @4€&H@ њ !@ DÌÎ.@Wƒaœyg gÔŐ%W äùæ±Ș©ăÒÉ^țöșz*d5Żìńß·ŒȘF ëêàF‹·NŸgÖžl LûnëĘĐ: ?DőKƒÌžì~°L—l/~œmߋ$qgFFșc™ćáCłWáÈŰ~‘ŸÒšśž_@Œ‡  ’2`˜,X1bŠçAđ“X©Ą­VVX󡎞1#—Ț#” źD•Ôt0ÍĄ‹glԋʰ?&ł)Î2ŰCŠ[îmąGV&<‹Űs5œH!'čśÏʈUĆ0›AĂÖô’ò3éő‹éč~û©/ëÎćmč]cÀÀŸbÙVwbQż"59ćêĘWá%òLÿe@&O*CJ·ci[ȘiúFLPì 7òÜÿ…ŻcaÔÚĘÏÓÛ§gO*ŻÌFĂÌqN ÇC5Ź–ÏKÏÈ yq;ł)NÊ„.d/Š9~Ęüôb7~™ŰąNqł~‡?ó&î\űè^™BB—ÄŒ&žaŃȘ“—üńĂĆs…tʑl‘PY~ÆTìœúÎ pècĄ„‰‰y„œžžűóś’Ók—…â‘;š”/·NÔUsŒmYv}~PnSœ•Ź {X >0m(}DÁĐö1pž•YZđü?3…ÊÈąĂ ĂHòCż+\ßÜĂÒïÿ€Ä Ő]À ˜§~ûEIÇæˆÚn>+=„·Ä6ώ3öŒĆO3òÚĂ'˜ęȉĂ?Ê+üú™"àÂüÌÜ|Œ¶§HZ‚őK–'ęêvhü Ńq·n—+ȘQÉÛBI~΄{ĆžŠŸ‰Ù ~ężv1űaśęxÊló2yČ}ÚÀpŒ$ZęN’6”l/Yúó^ÁUČ$VÁ]2fÔ˶FbжŒŁÒi‡°­ ń€ÒÊÜA0}ŚÏ?Ú/‹|ńê^ÎÖcÛÛÛžj?żŐüčâFČ—ŹŽzSLL¶ò2yšXĐd fädeƒq/$p•ŃA4¶Č4*x]¶¶>ÛrÆŒ~.čŃ{äp**sKdpšl‘P)~ÆÔûMŽ}°^m~VŰŁärRĆĐŰŰĂY_ćꭝŠ4Ć*g|ՙș +óźg”)Èć” Ă’”!›ź€—àƒÓ†ô…Bt…ۏ»cœVrDÌŻÏ•œhÚa`ZłLˆ8ęŒ€Čăîf9öëíÄMŒú>l4’Wv,& H.ÿƒ}jÔLÓTuű:ź;f€ŁvZűՌ–·Č0`Ćÿő(5xö>öCÍuPęï5oȘú%ČÂ_G >sˆÉƒż ł#w %%Ăâêƒâ‡ÿŸÂqB­ĐGüNÖ§ÌÚÀTőüGùŹ}úÍ}Ns,YJ·—ääŸVLR-À4ú»‹“Ó_ÚŰúôÒčPÈkLJȚ“Ê)sÁ,œÜúiđźžt,­čî0ŹćOä‹]È^Č$!+mr/­s ÄT=\Œ°Ò7Ïó<Ž}§„~z&?Áđ‚CiaäÛ|EIĆûY«—ï–Ęâđ;Ÿ^Ì,mt†ÉĘ)+iŠUÌűȘ-©+ Ș‹BB^&R惎ш\ڐ2ąPˆź0ȚÎúXÖÓĘAŻò»ž;&Y“\=~ÚŽ!~oÿžôì^vMGÚÆröńž”‘}7”șówp0Ź7ïgrçï+Z^Kę,­5[sśæ“łń|š;ûĘ0ó.ŻŒQÜPT†éÊ/ŠNÊ0íś”ú bPu>jĆ[{-(/Èș}3ü|B%­]ž‰Û‹ĘŽÔu4UŐq ›œäțlą,ö“ÿ†Ćőæc źę„îčÈŚÆÉ@•àsž††ù§@Æ„mLĂh䈟ăú˜Ûé©1ëȘ2SӂźE>*źŻ.Š„‡çÂaÎ}-ŽT„•éIÉ—ïŒ +`V#§tÈ8Zj·t€ž(ûՏŚ*GÏè§/zsïî7ŠšźŐ{CËÒyöś!zú,QaVƍOŻfÈ?K”H­ç ŸŠś0ekhłp zńÀĐzچŸ:ț͋úfŽčôY:ÚĆËJGUpčI q'ź&e¶èĂq‡áÖÄëżÒŠ[čˆ()«c&dh»è9­k‡&e©ÉSż% +3ƒêŸèëìvłđ„BfH iĄTefŠŒÙ8đë‹Lé 鞔ĄICm4‚©Űöí·f’»«0ëÏł•- —ąŽÛ«ç3țÔöőœçÏjÊwœ0û—ĄŐ‡żœvœœ1dÙò/ú4l,!čo>ęæŃ«Öȓœ2Ë~ëwŁ,ü”áÁ;Ëș*ĂV,ùD%lîá. ˜––răeałÎÍÆ($¶š…]ÒÚ>'™te–7hZ·|`ș:êžž4­őpœ~”CcÓnëśă†«ˆ‹c6îÏî7wÈ4g5± êÊćí‚ÁöÒZ„©čűźbç€Ëš*É»w#"”ïŽOYŠÓ陂“ùŽ`À+ĘЄ†%`s/{F鋬”ÆČQG$ÊÈßô#©-E2rŐ/„źdHYȘœ˜æàÁúÉ?_kC«%ËîÖÓ)4z·€‹êŠ>æĐ€Žń’GŠŃƒĆČș†ß‘{?:::DYNúgù5ź‹§ő€W—™ÉáŽwéc9őśpៜ™Òž áìĂœû9Úő§ŸșüôBdN©ăü@gô€š21° ‡ ·ÓÎ|{#čȘĄšž–W€« ?=(ŠL„łsv6±đ7„…ŒŒęŠ,Š±WOKŠŠß.GŠȘxoSrąóÀÁ‘]òüÉïĄ©á±‘oò «j0öÀaÎ}í쌔‹Ż\{z>,=CĘfêˆ^ÖĆI dG«š-Û0yeoő’Ääû/ÒcòjŽŹŰŒW)‰Ő€™ùŒęyĄ3» ébpü“ÌSś>sęMž±©ÉŐÀîŃsȟƒMIÌѧą>~năú–= ÿ»ÂląŻvúătź ĆŐŽl1šÛ űńcżŸDȚÍàŰ{oJĆV.sFÚBbr,šśłT‹HąŠŹ$&VæÜÄ#ŚbĆfDÄfD§s $àÆß}<Đ„2ăjH|H|A& Ő«ŸÆq*›mƌœ,v©ŸqćÍ[A+gTpƒ{»bBŚ@ßțü˜=g”Œ˜Ô)SYÔ2kŚȚŁmȘŸ]4șćK*{©-R”ž5Ò{șíDB1 ÉĄƒŻśĐ‘ËÒzˆŒ7YE#\úő`țóF€śp¶Ô­ÎyZżœŠ RF~™Z ŻßŽû™Ò^ŸźŽ)‹,(äJž‘vϞä‹ȚÒéL]ažŠŸ¶I‹ŐCżČB@Ż é mHцŽ…ŒșÂ,&F’ïŒÛ‹hąŐwH^V}vÄ0†LŸŽs€>ęG’VëwŹžŸgćő=óŚ:2mFNû{ÏÊë{V^^ä ŠŽ"ËHmfN\Óہ"NLjŠ­…łl§öŐ„&‡–6œŒ˜šX«jkÿDٙ/šgŠ+ ž€Š–š&Fu ŠæábÌäŠ]‘đŒ›ieă„%ŠŽL.lŒF”§ÜIšÓv±íU_f7§”Ȗ[EÖpò kj«©źŠQ_Ćôm|­ 9*)WŐRWŐRWŐÂË_„ŐšÙ›;4ŠŁƒˆŠJs ö°QœĘt’i˜é1É2^›ê0Cÿ|4Ș«E,5)&€iŐső4śȚê4)Ëb‘üć…fŹŻŐž$1 6ÛÜšùŸ‘zÛ»ÛßB7tûvÇąs;æ\ćçÁ{ęߥáőă_:oĐŚ‘2ÀŽÆ/șĆO#æÏ őÆJóIŐ@‡í%kžżÌ­5Čółšś+féfg#Ê{ôЊ¶û LY\P\úl3t°ŽšȘȘĐ3wÓÇp]]3fm^±€ 'VYbvDqNtîÖÛJ§ŸQ¶}y rŽnêJ.Úz-ŁÎŃëóÿ,8±ÎožčJ»S%…Ńań™í|ž#Í"Š„„‡Š8.:œéœsAzJ8G1.ćd>ç©öq5aÎötÖźMÍȘyF“Ô”/KKĄ.˜’êWzÊÔöb*,UŒŹ©“üú~7íéé`ôŠ u…șíűzáŸ;ÿ}3c‰œŒ}҆4mPŽ(:Š+\CG··Oߑfą·‰Eò-xœÇŽôăz¶Î3ÇőïÄÊxöô(Â-QôŚŃżï3@mà”Ńț…öDr ČČŒłO"U”-ž+Ü ÉÒĐW ßBV”VŽ%eՄŠŒśÒPÇ«jńȘxęÄŁoG˜Š±.FpÊ%Ÿ{©ą«Ć†ÊȘ€őcGLUK#ŠkȚy3èőÉ<Őۇkźc+¶ ÿtVц“i}='ydG\„IY‹€š¶Jˆ©«·ġ©[0gƒsSC$^;żáá;o­Žż…Ö§ĆMûíbb.Ëlöœ>z%9/O: ő})Č:üvžíŻ1ó§9DŸŸÿ6¶í§RŽQO‡íć'€ÆÔđuŚ?“Ăă쁜őëRbŸÊ°A›2e"„˜GČuL˜ȘæN†•ńŻÂ<=zš^çëšAĆ#Ș¶^êąÄÂ##6€0'§NÍŐÎS-)T@Óöć:n@%€­›?&$äć“}ö]0Șśg[,l_=‘VŚu‘éùíù=H·ˆ©«­‚ˆČ ’•EŠ:ˆR\ô4A0ÁÙșž—ŹcŃŚŒˆ{œ[ޚ$)k_––B‰òêWZÊÔö’BQ‰©ȘH^ŒìŠ=]#ŒȚTtžź^úńKIyÍ·‹ òäí>‘6€jƒjDŃ!]1̖~2iąfEű”ë?=Vʙ‡ï bĂÙVŽ3Æő›àȘVűúőßÇFÉÖń”ùYù€iŰ֐”ć%ńiE 2ćc0ZM€8 Í&œÙzíă]i+fD &”qàŠ€æŰòÿbą©RDą6őCq•‚Fߌs>Łu "Yą·Èa‘8ÿUŰŠ·±ęö™9tÀNŸ>ŻîȚÿïœü–C^ŹĄ-ÁíúśòÀČ~ș”RX Î[üČ|đgŁÔr‰C’6‹ßQ{IAöŁDáÖȚö6w8ú¶-Ć/ÏeÊôeÊŐ71525·ĂÿN|­âń±Ł©a–¶F/—G0Üz[łqŸ™ł}šoŽè€úZ©;Ăéâ†ČâU‹ÔUD? }ùȘàËφOÙărúÛ¶[P€ß,ȘiśüHȘE’†3ő§‚8áMNć@«ŸÆÏò,­œ đ·ÄƗíäŠH2”Șb)­~„ŠLi/Á­(an&lđ$Iż›ötrEoJ:MWd-766ò»öƒŽ!UGrèŠàÜ8\Òßsî„aóò.ÿšą(AŸg00”țÓŠlóŚ.ĘżçUhźÂNYé\4ôŽÙ4n”Í 4ńș’RHÀŒ-GEËX«Őł::šXŻé^ęÆ{; Čș”Oâ†lJÚ4íșr~XY±°ŹÚF•3,Œ”đڒâêwÜ.ÄeŒb’Ą!æÇ„HZc}4ŒI]M!kyQĄąžÄ̞ŽmŒo`Ìć M§’‘uU5€©©jbĐâDmÌÄHžYYŐŒűđ™î p'JφçŐÒ„Lc‘ą`©jłÈÊêvqaZzĄÄ+ kĄą7!ŃQ†ÍkśàLzIWżHź#’¶ɆTmˆ _íIJžĐÛ}á8ߟ|=ÿ9wmwtăÔLČ6ä¶—ŹŽÉ,¶ó5źv¶wæì‰—é°~ê”17ŸŽ7q4sU-čVőVŁT-Àą_ƒääæ‹&>źuŻ~)lèű†ăgyőímźö:ł†Čí·ÎŠ}kÿʋ텹(ˆ/!êhêbĐj‚ÔN‹äAȫ⁔™ŸJł 05}- Žą&5#ŠÖ±Ż“Nș•3;:Șąáï4šÄd©}ʖÒĆ ±·¶0.—đs±ï­šĘÆóĘȧSòűê}Ò҆TmŽQÈ©+Č6+1)+…§k;eŹŻćɔźęĄĘN†juÖ±}źűőiÈû2;Š­œŻ^ƒ 1-›'•šŒŒ$€PÀ­3vŁZő{śpg”ș—ŐĂi°A󜃝ïí,HÁ›”2BŻG ›zÛƒ('+ŠÇô<ˆșn IDATôu6o|f†ë9ŽqU©HÌJŻÌdYVDé4ÈłŸV«ż3eR@ «kI\ŸmÚfc,Ž·0EÄ™ÂcȘ:-țHV•‹q}¶Ië7ć**k0=cgvĂŁńŒžœ| ș<«ńÙ2EÊ °HúlYÌá+š5)Ź…’Ü”Óae:}ûO”d€ Ț Ș#Ú]i€jŁĆoêrb_|·ûÏuçSK돃iű»DmŽč»ö@ebjTžŻ»ć wășÄÔ(ٖEšS&ùÜüUS#“òÂ.Q–QP€kÒŚLMXÂ-"€imŚ_Wśôeđ«ŽÇőÿb^ĘIêžŰöbŃŽęÆìeđd”7èÀYÌVŠ`:択°ŒąùPŹY$ąÜÜžj†»·C“ąXf=|Í—}]ȚÓd‘“sÏțvŹôűæ/lÒhR–ÚoHHJKébĐÙË‘U„ëŒ2ЊĘ†úĄeśìé”<Ÿzt…Ž! I# E芔V’*ê*íô @V…ĘŽ7ČúæÁc7Q"EQU­;gŐ(ęđŹBËĂŚcšzùĆ©e$Q/ăíóŐ Őû™–Ąő8œriÚ|+YÎŚYžfŹńăô,‘V_ĄêeAśS©°S2dVűó>cÆ,ša•ô<ŻZ€ȘickZęäÆŻoĆP—{țZšÏBß]ktꯔđUőžś#rĘN瓠+O¶DùőËŃŸkœ·ÿ‡ęđYFR™HÍ¶w°íĆ [q!GаCVŸ|[&ç¶yĄđZ|…HMS—ŸôȜŒÇ˜ÉŸŰ”?K.ÉŻ1Ž [1Ê^ŽÚ-JÏ)#ʍޱ„æ…e"éEr–żŚŠU# ŸŐXö±ÒÊÍÏ4é±zșcÜɔR’2e‹lC¶‘–[KĂŐDĂ”{șÛòËć|~~I”ìßęŐČ26'čáč zl­ڀ854*Ìwô€@ç[ÇJhŒAíIêv$ƒ'„jŁ DMڋgi­ț$QrÚ 59„_4IGu*»Ćz)SÏXŚDG]WKÓӈ©èzyÙ«pćčEUê”ÉŠÜR< ‡QMÜëLÄokĘüì™EĄ<à=ÜlLÄZ|‰‹ŹŽÍ­q·hˈNS”} ö$e™)ㆬàșSŚN™g^~~ÿ”KEČʆ.Ű<ŠoE~Rݐ[Kjê{{;{ȘpŻ„f4{[šE,uKS¶‘Ž–­­&†áNn=äVrÊžYœmQ—Ju!€Èg‚ß+tźż.hš ìhÖ¶wÀȚ‹jcâ `zÏ*ÜK -Ț Ń$eäoK떂«kÛkë뚙1i`êă"äđ+ó +űô[đšÛŻ~Škƒe/žê5ć“!ă;e?M-ç*&Æ=+Ł—IvǞNÆèĘ­tE „6HJ]!mHAˆB‘Ł„4q2[—„ŹŽ û_ĄęȘ‘Ž:À-È>óû“siBČöٕ;G0żię|ì#âäe^?}#ßoöç͋ßÄÛ[Ś.ëô_1lĐœWuòŚ'ÒòÉώCVfîÿùFæ8ݱœÜ— `ÔUWćç^nL’%Ń·Ôz.á<{š›šž*#ùő·ŁC‹ ù_ŸdFmĘ[6sŽûàAFi2DŐüôÔÌ«Ń„2żiF€?žł“9hŸ·Çj&!šL Éœ@§dŠ;8 æ ŻĆ$•©ŻŸżőČŐæbČ )7o‚»·łÚgÍĂGQö‹§˜:OŸhWWÎyńđÎɇÙLÿ‰żLòß0 đ›§|ꔩ,bX,Û2~ló>1ő)‹§€0ă‡ÏoËúZŐĂՔYž]Đǒ•gÿ)öï5Û)ć—$!eęRÖu;’ɓҎ!“”!ŸœőcbČ*û9›T%Ml!G†ù’M--ȜœÀrv ‹šR&*óJDš6ÌšŽâ:żÉfŒêIUˆq=Ÿ^lqFìłÖŻ:ńßfÄ mûś6fŠˆšÚ>„'iÊL7d†Ąë`„źU“š,é“(’!ùQQÙvžfȚęmő5YP[•›™täÜóë)-cŹd‹˜vęś|äÖűtЌçG­Ęő< ł—f,#Nx{›hàČŚeźŹ:nqŰꐘ~ŁçËoo#‰™o™¶}8ńÏ ZĘK­IÊÈO fà=ü𠋆NȚ±ßvÇ~ .ù㇋ç$}˜Š”™”íW$Ÿéú‚|ú2'Ă{–ŸŸ”šžźŽ€8ŠaĘ€;ötČѝtEm”6hú€ ItéĆ{ fiiÙÙeP8 ëÍ;ûżŒ1?(··Ć!ź?ś“™sȘŸ,;ôŠž3Ÿà”LÛyûWĂ,_ZsłÉO‰tCmŒàŠęníŻóäê’KùŒ†€ppęčŸÌœYpwƙÌ&ÓȚg{ÒBJQ`šŚ/Xá ‰+A}šț­ȚDG ÊnĘO«vpŸhó/~‡G.p[_o"ëâš)—ś K#+ŒòŒđ=Őœó5ĂĐșż)d敷lÈˆźÒB ÊQ‚·é<°u›ïed€†&mA>AtmxŻ#S0č·uwcú.ˇjÇƊnÇqƈÒœŽń>‚ÛÙá9‰r»ÿȚ†Ù’§l›ÖoÒGÿ>ŽŁ‡ úvkuú•-ś>ŸGö"șHWÉ(yDA€‡œHb_8ó·Öí:béĂm±C ÄŠȚÛżß”Ÿ–źæl=Uš«â§§€^ŸVŒúńƒièéY0«SKd?ˆê᜜ !@ DG@[ì@ ą4AB @ ˆĐ @ @ @$@ hM@ ą4AB @ ˆĐI0œW ÚÄăïGšuv‘EŐvÔÆœ^đűɓĐ{ÿńéPŹł‹€=Ś^üĂHőÎ.ˆrQéœúôę{'–öìú_ż“9nt!MČ|¶Ęžś„oŚś.B.$¶#ĆötHDjąKÙÛyq’*šę ȘC èA$BäÜü߯ő댯_żqo§CßÄÆMÌ\<ÆčK„Îf”WȘźi/ËmùźŻgș ŁÎęüĂźŸ_y©”Yw:«ŽäÊS5ł”ĐÖ±Č5VFǏüîfđo 왊HMÆžŃ9š”»ö„ű 7đÓĘ{żÌ°aHŒ‰òjçŃ©‘PČ'=Ś^Û7ž±ï‰žńiż&ĆkŒȚęűé»DÜlń Z$·#ôtòĐU{nˆră$”ŃL9ȘŁh)T1‡aè>qőö_țŒö 4ìÉăWOęűń˜ïɂ)‚ &à8Nÿz{!«óȚDć0k|k;”ÓeÜȘ„ìęŚî% șĐx\y„êšönÚ§Ż€žŰùĘi|ËèŹ:’+_’ÿđ‡•eAâ€WŐ /Šă·úă€Șkë‚ÒEŠHO¶žŃIš”łö„úŠ(Œ}űŻ©ŹÜ8>lË”Âw ąŸÚytb$”æI’Ç­ ê**ȘIČąąBÌçń[č‹àF_:QÔü7Č:9W,s±$·#ôtòĐE{îˆ2ă$ÔŃL9ȘŁk)ÒcŽț€™łŒëž=șü —+ÒČő œńő!kæâOovĄĐ„PLÜxÊ·_ŰDüò۝d>ȘîÎ747UÁ]ŒwP^©șŠœ ąÊČŒŹőżVGòæKpÓ^Ä(°hČ ·1ÚUł+€èĘÊ„ÖU R ƒ&„ĂòÙvc·ÙńŐé.^3ÙÛV‡,Ïx~ęŰÏ„ÖßGĄY"’XŒ›^ł~y`_[Qq|èÙżüę¶ćšCșŻHnűœÈȘ#Æö9UŚŸ«t”Hˆ›î:č­wìÿmœUïLoÈŚ§Ÿ”œù† bo™"żtO’^E ŸW?ìăü ™—9)ă†ÚŠv$C%P©œ F€.ć(Š?ț§ËŸ[\Z1ïPBSf —ŐgÏ-Ę7sę„Bșú•’Čêà·vZš·üLvkiŽȚuëK”}7^ŁXÂĄ‹fÊT -EjÌ©­n©!Q~vŸ3W{ç( ïM'ț7Čä·”‚2Ń úę€ ‚äż·/ û{Êê kœ0éÖ±}GŻœĄïžíFœśŠû[äÜ:”Sgà>~î†ÚkŚ[+Ì :™Šă&˗ûUȚȚîe5Q'ÛĐ@ĂcÍÁęóí*ăƒoŸčÂjZzűZŠë+·˜°óèçȚ‚§—țŰ“ÌŚp:cțwÇÜöŹŰr%§~]‘ÙkéŸ/óCŽÿžy/_ËuòǛ?ڄ™»í~m©(,’3eÜfÖÎ]«­Rn\8ôg‰PUßÜÁMŸ!e”Ąi`€ŁÒfƒ0)Ź,ćđ©ƒ-ɍżśŚép pcÿe+ü«nï?SE€ #‹”T˜źœŁ©–Űá a‚$ńȘèĆá•ËŻڍ\łyXŸ%ߌ”Ż»ùËWoDl Açg’ĘwŹ?;#äüœÌâ*uÛASfnȚg"\PżO@ÍmćŸ= ­9‘A‡N€ÖxOÛô‰!ƒzGÒŐ­źš đ$MŸ4Ÿ"žXŸâ’ŸžźĄŚìOf˜¶ÍYȘ&I`ŰÎú~ßÇźœGű=Shä5áÓ_Ʊ4±W­ nâĘߎLŒőîû?ÔÚ k)RĄŐ$Ì^Ë~ü8öâ‘ÏË#LúN_·æ‡ęZ—JćÈ‘HÌaáśÄŃAGvUèőČ`Â'{TËæ~Ú8.”î«FȘbžĆ ‡{őw`DIxÆA}U ]/…w~üÙÿäW뷌}±őVéŹß4JíĆO?\ÎSŠÈOćIą îÉłÒR^Ft„j¶ÌV(ăF-];ą‚Rí]2"uÉ,O©ÊÃŁk· q:šĐŰx=üę-E݃ÓŚŻÔ”“rł ÀÛҌÙŠÊ6d«+Jč5ĂÜʂQö2çʧ2­Ą‹fÊS€L-EИŁÙÇ»“û,© UÆul,ŽtuÍ€&Hï Ż{Š8Ż.î\öàʄ•›VŸ0éțï{\‰-íűsyDp›éç;œ[·æ`l5ÀœàŃéƒs čüù=nȚ‹;y ł™Ë|KcȚŸŐž4žĆ€”łȘÿwé¶»ĆőMóìïŐ}ŻòU‰Úłü“+ùÜ»–łçÌ֕+?ű:„€éh„űêàíRR>Ò;ৃ=Őî šKEm‘<)š8övfeÿ”wśÉ·íS!n:ńûż6ž·yćTœqrÙüى”‰‘Œ€G·“ïa:c™_yÜĂ[·ÊZ–K–RÙWwÿWàPüOŒ€eBÉWIAqZ|qžo5kS §·Æ±„›O6?•ąö3 ąäߗO'‰Æ‚Ț çúh„Żțő+Đ ˜7­‡űćŸ Ÿ^ÌÀęÈČĘçżđ§òB#"ê:ąÖz)śæ©Ú8đê«&ăű‰ Ùäg'6–ĐÖ(ê«钑$ŠïïÙçò›ő[ÆŸű<ÜięŠŃȘOwíșš+Z”ËàIqڕ æĆï_Ÿxç*ÆĐ4433k’$)ź.+æŐ/5HŻ}Hșv$JođŽ»dDê’XźRqÃ_Ô|áàx,ĄŸŚĂmęęmD/ƒ—ÔőK•rXvžHÛÜ\ƒò žZnŸ{fĆÜC , k3È»šK=3 ‹fÊR]}Œ„n)ő ‹9žźÇ‚oŸ dFî>Őzm‹(șóÓvČ'ÿɋźČ#!7­N±#ž ŚvݚżőĄÊÈ͇ö.°GGÜ)ÜÌ/À KŒw7“ĄĘ3#ú5WĘĘÓIÎł°0¶ŚWfIHPpqÛđÄtŰ_żæùûùŚˆÂŚ#Ștúû5Í"Doß5EaA^1ÁÒŐŐą«~Y,êXÊ ÌJÍ",G-šîaŰŸăuˆÒLJ·}֖­?Ę͓{YGŠR‘‰ś/Ț|%eTH}Țg—țNoceđssß '=zúz8ÓčOoMá«;òFH$çńØZŒÆ"‹ź(èpę¶ąŻdAš&™ÎȚ^șÂWśÿiÚĆ$ˆœÿ(Żől7°0U# ò ÚÔ…EJlû2PśŹù]gaòó˜rŐ^}ÏϕȘY%ȚŸ‘Ű0J Ëâs U}}ÍŠ‡·Ò}՜ca^›˜™H̑úȘșl$$8śî}(ô[ÿćW_}2Z5ü—oæ·#ÉàI©·ZLĘ}éïfźœXćŃ€Očj_jŽ”ȚèČ©™źÛ[*’Uc0ŰĄțT6ÜÚßß^ü€”6oʔkórŠÁÔŒ{zYó8<ł>}LqÜŰÊR…Ÿ“SȚYNc)cÓrì7ÇYlùĘș/o䜻FVІ\șUˆæGï­€ĂÔï5fÁŠ%“œ4Òn>r7=&T sK3ËpíŸśŚ¶ŸP§«Ë§Qá†&F q^V›  bląGçä”|œ\—›SH36ŃÁ€PË)á5GM’ 0œ¶›€±HÔń”@œrúóíìí[Öč4çőĘ gÎ^Ì‘íÈ"!//=Óv‹šąFî^žă„’"?5­ČešôÊQ”4gÉŹá^ŽúZȘ Ă#3p Xú:ÀÍËk‘  °@ïùÓèŠC“…b<ÙÆWČ M“,c}(Ï/šnŸHŒóΊ„­…“9^ô °H‰mŸȊWŃâi%Á-ă‘jú†ÚԒʑ…șŒÜQg00€†ș€úȘE••5˜†¶& !zQ_mKڌ„BČôŸ}?Ę?ęż±yĄÿęńNû^î–Ć“R 8Ą‡șÓܗ“”ù)rŻö„Aí.‘šéšžĘ„"+"CąjŸÜ㜀d1néïߣ.úâžĆRŠL$e擆Š*ZęœűáçCûÎíÛGçR©”9ä=hÇùˆ Fa1VzÌÁM'~öi@UĐŠu‡^Òn‘@Œ4Lș.#ç-_:ÍG7?ôü7óƒgU!(’$Ađüèg'c[oœ"y 9 ‹$„T €a­{= Zę_,îĐ\˜Ú"†)óBöźŠ 0qîüÙ«ö΋țăËmŒą Lžé„ï:șĆNy„jd­àőEj?czC·ÙPùÏéc;b29•uĂuŃŸÏz4ĘÚzu@,RL/FŻ+JáɶŸ’©šÄÚžhóÛz“%f*Ę"e·}*0&łŐ2ÎÀĄȚJćȂˆFIŸjęiĄ‹æȘșZ$l€©oaŠ…ŠnbiÀ‚’vUŒ,ž”RŽêœ˜Ç$ŒO!wíKϒÊ]8"5%Ó%#p{K@ò#>ì°?žœfêàTő]žLŸNŁJ™ŹÊË)cș™[ș[öÆâÜ|©>ë?}ƌăM599%·šź°+5æ0]<ʘŻöUhwèÒ00¶ïŠĂÿfVqqŚÒł’+Ѓ#e .È+ł4DŻb€?škXymç"QÎ)#f8ŽĘYRWXÀÁú[[i` MíZŐÒÆ«N*Ș­ĄK)EČ|â‘Î^RûôÂî§WÎ ÛzđÛ%ë'?\ńîÙ9m ʞęȘH·ÍȘ/Q•)ÿ»—JšęŒé Ź—rręŚ'ß U1Č<*,ćpmbąPÙpÓÀH·=ú’RG Đ”';Öä@XRÂs3 ìeŁ˜ž-—€ÉȘÊ*ÓÔÖÄ@â/‰ÉÔö•†Š©»yejfˆŐ$rű$ŠM„œä©:_ši빒üŠJÉnĄŸÚ–ź €ć8wÛò^Ɨś†ő\»`Û∕ÇjèSnŒ*ƒ'ۉL”ß!šœÁìÚI";T*’ÿ<űYőŽ€ÛSUȚCœkŸïŒàÉâê”ńŒììT ÜÌÒŒ]o&eŻŁÓ Óa“IŰ>.J ZŹÚâXËÆ n:b‚fĆó™?/"čTČYԑ”Ąq»aዘL1C‡­#ĂîÎæE±qĆbΛŰă^ęíÙučٝűU EĆXŠ˜ĂdÛyöw·PDAt˜çŸßvv9ȚTt-,ŒőtuuőĘl47é=xPEQYYYQ^N©€ÈșŽśdÀțe?œŽŒs+,Ą°FĘĐÒĄż{ȚȚy»Ÿ5pąđĆÓtńòiÛ¶Ś\ŠÈjꕇęL{f$‘qő·ÛŸŸ°ă„Ńœ»‘)„"u#;7·Ș+y*„šèS‡ÿŽęŁ{Í/'WšÛ ™>ĂGőÓïĄČ.«I+•,u,e`8-=òeŻÌ'/óÊkșNĂg`^{–Öy+T [©pû©ÿù|e|ƒ”9‡Úîl‘|UUÏÚÖÒÄĐŰź—Žł\ü†ú—dgäń„@íçòžW™°dńŽÍjwÊUÌ<†zjrŚżH~۟ę–m9°ÓòJxŽŰ€ß€©.U„„–ìFK«#čt%ƒ'„ćKí+PŐ·¶63ĐÓÓ3êgĆ5›#†š–”••de–Đ€\țçčxÿŐïßm~94­šĘsô̑æïná«MMÌ$\œőńžV)(-ąi)”qCÆăÛì§țçó•EÆéłÄ”n%•<«Ć?}kűwDaÜw✑ÚçN?,%(•CS 2JšŻšÀŽ]-ȜGÉ_$Łș*ĆȚź Őz-Ù¶Đ!ïŻużżüç§ü]șmeÄČę/«hR–Փ톀©}ÊvDÊŃÓu͈Ô5#°<„ȘOĄêyHdŐw7éž~ęŹĆüˆČ~©Sçe糆őq„ę•&qúë7ŐS»«ćÊę6„ÒT'k(b«ÿÒoÿšöŠˆ[wQÒL·[|âÌj‡ÔŁó—žDÇ|ż'ü[«łŹŸkïŰŒ»Ko֎=ł îńö1ŸȚ«Aü‰—gÌ_2sĔ•ăŰ*"~aêË'€¶E‹SNoęBeĂÒ1ł6 Q#*‹Μ8+CÎ$śÉźUÒW,žà7ső8Vm§ -êŻÂú„‰ąû;ÖTÏ]>?páŠij’ŽmÿęÔĂ,ÙśAK-• u,eą0&,„ÏèQs†êȘ•Ćé/Ï}}äDT'=]ŠR‘œÔÄąJvRj±Ä-X’źČzŻ8|`ȘaŁp†üĘpqÚńĆ KPûYœræËo”7/œâÓIÂÒŽš›{7†ŰęśÄ˜†ÄêÿŰČYđńÚéÓ>ŹZ•ęüÊ΍i§żnÇȚÔ:’CWČxRrŸ4Ÿbyźț”eì·p{ż…ĐŰiúIaʟÿÙXśŃÚŚúšŐ'țsêQŁŸ[ÚșäyQÏsVÏòńf_nuÈ0ET5H7dĄAW‰Ém?$ZöÓW™C6,ÜâŹ܌g'>ęùW‚zS*§žF$J—  IDAT_5ĄććӛUtëY†DÍP]•foŒ„êî˶ͳË9żöDlœ„ S€ÏWG,ÛŐ0h„ö3­'ÛuíÓŽ#yzșź‘șf–«T T?Á5ÎŽâȚç•-’ŠŹ_ê$ŠsrkŽz©FŸJš€ș„ډ*ĆŃYùòŸJŠDŐÉEÌç&&–èżÍàIžęšXÛY0ˆÂ˜hšŁÎĘÌÒÒȳˀ@ țu0usu©ÛȚČNu‡BœòRț·Áíÿqj~úçcw<¶üă‰S‹űûælžÒ‰[Jd‚ćłíÆOŸ!Šìî€osPú ÓûCĐV——/<šŰöŃ0őŐŽn€:ą{"OÌÁ–Ÿ:”TíŻUs~‰Cńê}=AB >H˜7Ÿÿßpi—…Oÿ7aÓőœȘŒ”• †a­N@cXúűÚBÆœÖˉDÆŐÓ!3v̜ÖóæĄ7uÿv»TŸbÚOž5ˆÜu9YÒx‚úê‡RĄ\ä‰9˜¶ł‹5™zú¶ÄïĂ#ș)h‚„@|ˆcÏnûìŸÔ·ŸĆeI=ê_y)+fïŐżŹ5O~›œË©&5M{˜>͍ÿÏWśòßĘÆzèÀ“Ÿ~4ęÖGç2QH…T_áfÍ6{őëWw% L}őƒ©P"òƆ­iEÔßw2PŒzŸ@[ì0œ>ӗÎŃÏÍȚB_«ăŠD?8ÿÛéČjèïíštú;@ ș%h‚„@ @  Èț5@ xÏA$@ hM@ ą4AB @ ˆĐ @ @ @$@ hMș çUçŸ6ńűûj’šj;jăȚ?Ż?xüäIèœżÿűtšÖé„Réœúôę{'–ödQ§Ösí…đÇ?ŒTWJY» 2zC PiCb©dV@ Äłł €š‡Èčùż1êÀ°›òćÆAR~Ær[Ÿëë™z)wÎęü’Chèê–frÉÎ.ŠjfkĄ­CŰł A‘€ÄML«śúÂĘ$SU2Jó”ڐ\*UG n4òÛ?¶_X±æLșš©<–#6|±nŒ›Y{ó—;l[» €4ćtìò±#—ßđd˜ƒ©űțțÎĄ*őÿ!J.ݟúctËMežĄśŒu+& t2ŃżŸyô’šEQ)òUśÙpxËpsC5†m»č êmęÙ=<ž–ÿ7wwŃÄ@œufćÚÈ_lămĄ&*úóòÏźRSŠő€ 7€„Ź:xÇ­V§æ-?“ĘșüšŁwĘúRmßčŚ(&ÄtÚ «#èęŒÛí*ŽÙRÔȘôââÂbjfąiìž=M„Yéyïì°Ăt\Æ-X0yˆ§œ©«†“òçáĂÁYőŸUł2ùÜ1ęUk‹Sžß=üì?Y–϶» /:Ł9Ćd_WsmqirxЁ}ç_sIù”#oÊÔm€ä†ß‹ŹÚ9blŸŁqQu-|Q[ĘrÎ%ÊÏÎaæjáœéÄÿF–ü¶vCP& ҁ@(&’ÿȚŸ(ìï)«7Źęő€[ÇöœöF†Ą&ą-žÍŹ»V[„ÜžpèÏĄȘŸčƒ›>CĐ80TïœâÀțĆ9śƒŽćÔžŸ»á€ƒöÚ5ÇßÒìn"čńśț:Žnìżl…ŐíęçcȘHddŃTY]»-`ˆÓф„†‚0zűû[Š^=.&€dśëÏÎ9/łžJĘvД™›ś™Œ» H”O,_qI_OŚĐkö'3LßčȘæ¶rߞ…֜ȠC'Rk Œ§múЁANcÉ€ç+Ì :™Šă&˗ûUȚȚîe5QW'§'AôâđÊ榌 íFźÙ<ŹÏ’oÆÚŚĘüć«· "¶„ L™Î“ÔȚžrRnvx[š1 ›ÀTنlaE)·†`˜[Y0Ê^æđ)§ȘtÚ )52ű7ńîoG&ȚŒzç]8"ûÁ­Ś‹VϚ?Ę7`]ïŹ3ë””ú†ÇšƒûçÛUÆß>s…#ÔŽôđ”6ŚK·˜°óèçȚ‚§—țŰ“ÌŚp:cțwÇÜöŹŰr%§ȚńÌ^Kś}™rüÇÍ{ùZź“?ȚüŃ.ÎÜmśËäVNÇSŠnûTĆ<‹śêïÀˆJúJ–fï^L‚V-ڱuČĐÒŐu4cš !ĄDiq^]ÜčìÁ• +7­:|aÒęßśč[úïœTꞠâŰۙ•ęŚȚĘ'ß¶ńn3}ă|‡‚sëÖŒ­žœ :}pÎą!—?żG}ÒÉKzt; đŠ3–ù•Ç=Œu«LÆ]v$7<űEÍțŽÇĆž­żżèeĐă@”üûòé$Ń˜Üœpî᠏Fűê_żÂĄË‚Ź,HŽ+á·áÁ7Š0oZńË}>œ˜+€û‘e»ÏáßôŠ|Ey/îä0Ìf.ó-}xûV«G(rxHAqZ|qžo5kS §·Æ±„›O6ŻńS§LăI*oPŠ–'Ò67ŚÁ ŒÇ‚ƒ§–ÛçžY1śPËÂÚ òźæR…éŽAY*jdò3ËŃ”^r3‰ón1‰ü›§îÎßżlłküÙÏ>9ÙzêŠ[LZ;ÛĄúń—n»[\çÙß/Șû,^ć«”gù'Wò žw7,gϙ­+W~đuÓŃJ;đŐÁÛ„$€ț|€wÀO#{ȘĘÈŁyRŠnû͐üĄlr€łKŰ„q]ß|ȌÜ}:ȘőlŸ(șóÓvČ'ÿɋóè@ >@ZóMpźí^5ëC•‘›í]`Îo/ÂŹÔ,ÂrÔąé†ïžńŒ›ù8a‰śîf2Ž`fDżæȘ»{:)ő,A’Uc0ہQ_k{aLđ“Š7æ›g)@pÒÓy §Ż'gí3ûôÖŸșó qgÉyü0ж㘰ƒù*̓dÍłK§·mÒ€LïɎ•č6/§L-Ìž±§—5Ă3ëÓÇǍ­,Uű99ćő°@&?ăŠjDA^Á»„č†lț$Đ Š_«ąĄBŠH`9OܰiЧ6Ûk€+ł$$(žž­uL—ęőkžßžŸßx(|p=ąJ§żŸ{c«œ Ö4żä,]]-:éÈbQÇRʶßą0Ż€ÀMÌL$%ÉŽûÍń_E~·îËïnIČ25äÒőšB4?B BčŽP2ő{Y°bÉd/Ž[‡ÜÍAÛ8ڋ8ćôçÛÙÛ·Ź?riÎë»Μœ™ÓpŰĂÜҌÁ2\ûçę”­ï©ÓŐe(qĐCVD†DŐ|0žÇïIÉbÜÒßżG]ôĆ'MŁ@UËAs–ÌîćhĄŻ„ÊÀ1 02—śëJ,}àæćU6O…-WĘ;šŻÂÿdČłS6ëŒ;ł“JœÎËł”Déϟ~ő©9šîVșĆÖ¶őْ>ۗ‡o ©|JNšöe§ùöÌȍg>Œś-ÇČ:}ÂܜPŚŚW(źüS[WŁ2g™Î[YÄÏ'•šź%„ç\wK6$g’—ÂŁí ,șwVŠ»ó"û•jŒâd‹Ÿy:4/2ő+mŒ] ™Ú™.).Ą eUeȘL—lȂ“ű4ÜæÖÙyáŻ=Ćńź·ž••Ÿ“G1ŒŒŰ$Ô\cW‘‘žCX·R"ąùŸf9Mô‰ÒŰÌ"ÙB‡ú]9Œúçü)œ¶ï~”O(šȘÉÓüąâšFvœYMùËÏ!„’ @°äùĄÎ 'M_sÔ ŁŁ†!Uă3"ŸŸ3ÔÔŐH ÒƒâèŽăŹ4ȘźKÒ _†Đè:ê§±œtkźâ‡ù†–šÚŰő±łëXæúqä)§ À KŠ?țz(©?h”•J#HâžgQĆòC~( Ąa=Žò‡œe:Ż D@‘lŽaő7‹šź%eÉčΖl@ÎT>7”XŐ°G{ĂÌš—YâœWQéz-ÍÔ+RSšńwpdjg*7=«‚dsŰŐą ș0ż0èŰQ‡ Kă#R)šæ''e‹èŒO)ƒAăÔòʙ(6űq–Œć˜œy’C쭔‹ÂC^Êș~Č鼜Ús‰ßęȘ6CœÁ«„c™êŠ=-»5Æ·!„B À rüOnîrü70Ú9ęłó» È^~9CŁĘà)}·ĂDTČûț3¶çí<ĂčïQŠšĂ1ïaӍ·Æî0!Èiéijhhhu1QRż«Ę€ąÌŒŒŒL7·¶WjAšMXłvyŠ^âT痟Í<”„?-Ù>f•š¶àńưŁz:ÿćów0wÎ–Ő śŁóćŰʏê©\đéé¶äRÉkł”555u{·b‚Iß!ćłóòrӓße űźÆXÏûĆyçF0WŹß{ì„%蔊Lç*#òqąŰiâșMeî!<Ą’Žf~àżw””–”H^Óž5G_GÏŽł6IČ:Xÿ`­›•ž’Ä+Jï#I- ±5$ç,æ„€±őè Œ’ qâ‹W„ìș)dž„6űĘ4‰„ą%öŻLí\ó޶íĐ^‹|ùi2HôÆÛ;iÒì„û¶èyŒ.7ŽČ··T‰{‘Ôú‡•żyŸÁ'‡ą’nŒgżĂ~‹«ź—gèÛ\‘ąźi—.%7Vz,„Č'g]ülZêŒßđš_\‘ąéÀI“­ÄûN=”q©IźÉ9KțîBš¶ïhDsĆŚš ËÒńŻ5ŁžS/ŸV[\LšÎq=żÈ<ț˜ƒăÜæ!„jBMșÚw‡Êxű¶Ç°§ ÒŃP ŠłŸ]ÚxÔ5âĂÛæ‚ŚźË’æN2~ÁHu9?#țYĐ5Ÿx1°z-9œŒÆÇç͚S·ì ›†ÿæUZëé>GçÄÇd«ÇÄeÖ2|* ś áÿ8Ò ÈË9ŒűӟĆoÏÿù—êêyĂæÿ6V˜›qwÿÊŠ[]‡żO•\*aÏE'ȘŠöž”©śŹOeźˆùç—Ő‚ćK&M\n'_’~cÛʄQç6Čd8ïǝûcœÜ ÇáSW T Šłą/E^”Ú’±șÎwqž óĄÈƒ—o N8=gÖÉ·bsźŁ%Y’[CbÎT7”L„ł|èóè šˆ~#7ȘŸűIrZC·h\*Ą”«N†Ö xáÜES­úš_ŻČń”đë›ä]0rúÛòŹžÇç?~á1k‚łëČŐż|ùûĘ Ș hŚÂ‰óçŰ[OY4’U^”“žq%ă}ÆTŠś–Ć„ӝFÍZ5QA˜yeÓ©łŸÉČ7Fă_9Òr–òĘÿ@ĆÂȘ++Ó#,©æ Ć©11ù¶Zo’êű©n9cS#•ńô‰”ßB!Ô@‡Ăiî2 ÔHEmCmĆ:—(Ńeyé9„ßÔđòši6Çőìlți+n4ă‚ÀoĄ9b§ÛúVŚf‹ùҗËHs§łgź,œvèóéa„B5*œABÿ!Ì~«/ÿ=XźźdáăżíWĘùŠ^‚ÿjD%Ę:ś`ò–);Ę=òȘą9KÒÒ1ÍÆMíG…îșśćĄÚŸƒ1îȚkŒŽBĄ&†úG]\ś»w»‘‰óbż”í뿅я8čț¶t’ÇÒKïpü^’=jéOìç'6xÖgëv†Ikƒąˆ›ś“p’!„jjžÄ!„B!„*Éòń!„B!ô]À !„B!„*a€„B!„B•0@B!„BĄJ !„B!„P% B!„BšH!„B!T $„B!„Ș„B!„BU"€$1LB!„B! HœńZ=Ș*†I!„BĄïCMMU,V·˜¶lćL~üë·9ćts !„B!„šCMMM”óđÎęgemíźš;Pż$ńU\VFI!„BĄï CMM €*͈űśnXQë‘ V9 1*O|›)À( !„B!ôù ]–ìq?ÖÀ~ăŽŸÂGwžçcˆ„B!„ún0«ęC«óđ™ó玳PJđp9êÉ„š«T!„B!Ô *$†F‡Ą3œ'Zi€=ŒŒÙÁ- čçŽB!„Bß&ĄȚ•Ë։쌐k»/úÄáÄB!„Bè»Ä XòüP煗îœÊ5wqB!„Bšù§čˀB!„B-ÙÜ@!„BĄ–$„B!„Ș„B!„BU !„B!„*a€„B!„B•0@B!„BĄJ !„B!„P% B!„BšH!„B!T $„B!„Ș„B!„BU !„B!„*a€„Z2輋Îy{č:vb5R†Œö /?ț(`Ç…FÊčQ4z}B!„Đ—a6< B”ĘHG§É?ô4ÓQ(ωâ}ńŰ?Ÿï2„6€œćÄYÓGèlŹ)Wžę6ìßÓG.„f«”KŃxÀԅ‹fü`üz§ęȘ;tՃ9¶łÎѧ­ž’07ń©Ï„ăź>‰șÆIêš±bëÓgMÔ»=G[™Q‘ęïÚI» „ŚkÄêÿçĘœŁŐkÆÉ›†ÿæU*”ĐMÛû„<»”‘ȘŐZŃ oa žwÿ^ùTŠăÿ\9à‹V¶Ûs‹­M‰*JòRcŸű]sœôˆ[Ö%hŠúʎi`5sÉŒŃ–†Ï·û+è+Ÿ!„BšĆ`I’EŐïxBĘrù‘Ł©GmüŻLĆ€ïŰ9ëwÖ]Čòr‚PJj†ăvŸùÍȚ…úßôOju2jțî¶jËç|&B­ÓŰE+œì»Șńój^ ́klOo_rŽ+V6·›0uóáVäœužY2ŽĄačÜyçTłòžïKÿ&ŠT sêÙzÍ_#ń;ߓ‡“ä‰Șc™wŠ‘“'œ‡šŒśiŸïÎynâŰçÒC5s,ćœŠà0Ëú—Ś#*?âò? %mă? sÚaÙfóì Țp4E}eĆ0ŸčkÏ|ę˜[çʏć“#„B” LRoü_ëMBŒÇÿÂaĄÚéșŃ%g—ź<û~Zà泐Çq›N­_=îŃ2w~? ©ŚÒ0Š€Òœu șśȘ€ źżÜqeÓèq–'ž=­Ù±«\žËŠ“ŰżčŻ!ȘŹÒwÔ:iî‹9UđoDé™Ó3FYkyĘ̑6ćBšöÿyęÔVÉWŹ:ú€ ž5Pl?lRÇ,;Ïò>eĐL5ąÒ»_z\œ†7Ï$čÿz<—Ä|•Ț§ "ŸÊöŃŻƒæÇű]ż-€sCțŒŒëÇńƒô|Ę2'Bjźú’:=û˜Á룛ś^â5RMB!„ŸM$Uű22Ïbćé«ÇڌéXËb+ ë›6šŰ}ÿ„DíÁ«]źûœ“CšÌrő;0gÌŚûęÿ=êԧ˘-œùßvžÙIXVë<Mîd=śÿ ÀÿžÛ9ßÚ “~Ž.Ž~•(&”t”>Ž4ĄÚnÄÏ;]ozùú{^uY7„« @hȚï|őçNUKÁè°èJpÀ‘I€ÄúJÌYȚn‹o ëLăí©’Ž^áŒnGy:?ŰïI9Çv`;ÆÇƒmll8ą~Y”Ôú֙ł05% 8lòêșzș $0 [1òRžđ „B}ĄOŽE9ÏŻm›çsĂ~ÁȘ….WÇzŸÚôFTźäw˜m:˜•Æ\Ììloošx}Ł[DȊ^)-(.ćdćVæőêNí«­NBqc-æ!TûŽšWöÜőéçïÿDÍGèTöœíë[íÙ¶ÿŹÙ­Û1ì‘ă;€ęmËm}‘&Fʊw<čQëN: 폫@ó^űœwvč[,}$JČ䙥À"dÉ+)*Š@\.ššqêŻUŁÏ°șŒ”o+Ùä›-őĐŠí}ș8=îe:°(ë“ jÖ8ńȚٛț)‰œfP|ÿŰyï€Ę‡u3e“ț) Âàÿm>Z o߯æët<1iæóÏn7ü]!‚Ą€„§§ŠÚŠ–—L4Ìö9ò ‡ÒdÒJóôK?/>U àć-:wxÚìŚŚzûE–­·±m{<úę+>dkŃ3·€lJZ}%ć˜Â©ȘßfæáłNf©ççO?Í22fïVȘÌՕ“c4EQP!„Bè{WmáU}{śÂÀ _ïX}€­òìčg% °äŽuUóąóT8­4ʒx*j*DIJ) @(i©æœ«+dˆ‘Ê:lM…ń]Q˜™ĆŐűĄ5`ĆêšI—\e}Wž.Iz’0ffśÓ{Ș)fÜy‘"ÓëW uM ”gęÙ*ÖûÄÆBÍCæüî̆čżH GX–kníóqvÎâ€ÏL€Š‡†ęáS= úz5Ș#iÚ IDATNÙjÜ0vžßžà"éĘÓäœ/‘›œFUTPHU$żM]\\ŠJź–ò—aŸö9ƅ?͟1€W'Öí€úìËP i4qï͉Ž0#ìÂÚß] h Ùֶ툘“žïȘȘȘï?›ôäEÁ€ț=Û1œÂ……!~elíÌOÆÄŠHc3áÓkAčRÛBbΟv#4Ütćś>߯œ>2}țùÏŚ~)¶s۶a€ÚëăkOŐ¶8©€ášżŽÿŃőëòÉ磠ë„ek:ŸêžmÉFŻtieb2™ W±oɞ𶋗"ĂŁJő.Żž2Úüî‰8ÉnąŚçV/ò`@šÙ,ßțCÒîmwžUüÙ ę«Öš Bç‡qvj©Śÿ}"ĂY›Œś%ą%„b Ä4]Z\BMQ@äû‰.),ȘISy…Ž‚–Ž*ć ÍšlÿC{<ž Ęg­ź•É«|W‹aÈa3X:K.x/©~@…†@H…>ˆ(ÛhkŚæTlœ˜äŰŰŽ©xr-H†UsŠb“Óh#9ŁȚíűÁ—öšȚ«‡š{ź±!đ|ReێŽÙm±ëáIêi/Û~MÊW!„Bè;P 14: áä8ŃJ#íáćÍnÉ%Rnt蠌VRV, Me ł¶Ôz.ŰKŸDclÜł'!ʧŽW:SŸŒ‘>§ùa§7Ź»ùń•Ș0>ûłRəŽßșQ§ìë֞•qr@±ÿŒ„6„śëÎ<áÓÏźn^”Z~nśȘE¶Á›K.Qii)UűäŃłOŻvPÙQ/xà`Âa‚”‰æ§FG„ĄmVB•eÆEœšćˆŻ\Ł*ÈVĂÇYÊƞđˆ©9IWKmšșś%‹>R(ŐžV fő­,H 0o@ R_E‹#‹; <2nážkK.ż+hšAű±ßÏDUo?ș0©€æ‡ú† ¶ŰښŽK0°¶mW±=ž@–2Iʙ.áqó˜] 9Ę8]‰ŚÎwŸ)N]Ó«‹Țke—+}Ą$€ű퍿·fp˜łhęÜ· =•țĆG!„úOcêęWčlÈÎ č¶ËńąO\‘ŹO‘…é©čz­Mäß^?á5dëŃEQ'Śÿ„ŸfçÛô[kwFśŽ_Pgê6YȚ©H{ț0­îd–‰ęÖÿębYüûCre-5©ßÆL•Šńòă[CtQdXŽhTÛFŒ‡±ƒqj—RaȘđiûl9y!ŹšùQ=|ęU9wG{ûŽą'»„M~Đäœß Êì*Ä2`ëe19čeAYÔĆ3ĄŁÖϘg{oËĂBÄéŒ 1KI”țüi-HóĂęÂJ·ŰÚ¶>[Òg`ûòđm!…ČHrÎ$/…GÛXtïŹwçEö+ŐxĆÉ}óth^dȘL‘.?)Ì3é)OłË±1c{úšÁ‹B!„ŸiL‚%Ïu^xéȚ«„}:–‡m •-`“œ3•ÏM-V5ìŃȚ03êe–8çUTúÏ=-ÍÔ+RSŸà·™Äy9ù”ŒŠŠ|#,BD!„úŠ1šÿ“‡ëu° âŽßÙqnpçgE•s=” /S =”AU«UŚ Ò+yu/ŚÜȚŃüc•zÍă5ŸRŐЌ­B‚–ž"L=ł¶íЁâ§'Šó©Âś{Ž{Æm>ÈŒæù"œ\±•ĆèÉĂőSŻïń­öŸ<Ùê§ƒÇæ¶I>»xé„dêcțG/Œ>ìžśžÁMHžX§û° ĂLžWxgÉ>„so.xł…Ôšòôšvă~ĐÌöŸ"û$K“öŸŒ–±1[[SSS·w+(˜ô2P>;//7=ù]ź,Ƕšłï/›!`€„B!„B•0@B!„BĄJ !„B!„P% B!„BšH!„B!T €FÄhżđRđăv Qhî"}ëäș.:çíćêۉŐÜ%i,ÿœ5Ä·Űßb™B!ô˜Í]€ÿŠ{śï•O€a:țϕê‘©ßwÒÍW=c]șy^)yvk#U5Ș” ążŸ}•Ò’ßT”†íöÜb+@SąŠ’ŒÔŰ'~Ś\/=â–5Ö šź5ÈV'//íđîԜ٧ȚŠżìĐoŻ óæNbaźŻÂ(/àœ}t댫wŒ %ÿȚo œç „Bï$’$)Šjî’üĐ„ŒW<fYÿòzeÁì0rĄŁúÁÛ^±_wlÓ\畂æûî\ç&Ž}^ÚÜE‘•”–üæjDćG\ț' ƒĄ€mÜă‡aN;,ÛlžœÁ;§qîMÖ€~ÿíHŠh=Àș•ëÛw_TÚo­ «•‡wL1-OöwśÌ„TőŒ;öêm&wą%}“kŃBï9!„€ÔÿŚz“C'ïÇń1Lj^€ŽĄńőš6Śy„Ł "Ÿ6w!Ÿ€ô–üÆjDócüź_‹Àč‹!^ȚőăűAzŸnt«hšÖ ”û è(Š|ŃŃÆÚÚđÜ»Ô/(í7փ„ȘőČő“M2oțŸt_P·č2‚$è~3očś„Bˆ @ŸŒÌ›°òôqwŽí?qśMa ÿő[Fš¶>ËqòžŠ:rćioźuqY@(Z­pùe°ĄŽ¶šƒ ÖĘ]6 ûĘKò ‚4™uÊ”gÀÁ4ÛĆŁLEo.n=’5zíÏ Ë^žźęę|Ž@uä^őœËN3ŽŸ©>1».»r|rüŠaű@ęÏ ÀČÙìč{ž2âäó –„ö]ÿÇŽ>F ąüÇÿsúęvUg} ­ŃûźŻ5rŸ?ăHŽèCvŒ‹.žžž{`Ê2ś č!;Œ·ę ś>ÊŸŸlž'Ֆ3ՑłŒĘm­ÎÎp:ŸRę2V¶ËăO…cVȚΗűžš„o1nÚä­»”1Pc S_^?~ôú«ÂjFΜ9n`O35VYNÂÓ\\ü’EÒzPAZŒ:8MnÙVOŸ<ëmžçćÓę“,«uÿîÒq™}^Ùațžț UĆčqÁnÎ.ż(űȘȚéâèW‰âáúșZdŒoŒ–Ùż„F?›źdÌы”ő/úë]źÏ”Ű$ÔüqzsÿűóŚyÔ @kO%uOŹëčóȧèhêcŸu•Jò}#FOò]ERïK©ŻÌś:„>«\ÿš}rÉ ·/›D!„ˆ ‚ž››fȚżhƒWÇz?pìö«ü©ń)vï|pŽŚÛíž·B»Ûèé+œÍU—,>ęŠ\È v;O’ú¶NNÖĆś^zV @eŒŹ%gùŸó|ț·ûp·„«æîqÎ|rnßÎŒ_gMłșŸÁ_⁠:Ż(ÒeÓm]ÓĄ‹Wê1w󳊻‡6ŒhQQٔÄúæû=)_g;°Ę±èèÊqŁ GôÂ- ‹(ìì4ß]KSCÇâ§_'Èܒ±©)éЇĂf@ EÈ«ëšË ‹r Ê(†a+#FȚ3._ZDA«śaŁžôàČŚ»ŹĆÖÆOY}@_8ó—ÛïÇ€JĘ>è`ZüÚïȚù9BeNśțÆ:bJ†–”\#ÒÈ~Û±”}ĘÿÙÇW2ÿaČĂöă]öÎÿćś}ó0;;ű3íÁé=«śóU:Ž[Ÿzé.čœéëŒó€TˆĄŹ­«&GÔšŠ°87‡ÿ„oĐ0ÙF€8+=ûęI[jÿê}tg&ž  'c`‘MmśÙnh-ž ł¶*Ú`ŠKB-R­© Ęút‘+|𠹀Ö“P*$Ę76%JŸ«”Jê}Éő•őžCȘ”ng€ąĄŃ–Í B}U6ić<ż¶mžÏ û«ș\ë}jÿŃQč_ör3’ˆ4™ŽÒÁ<ęÒϋG•xùE‹Îž6{àő”^ŒÈû<†9{ÊŒțčQŸś<$Ot|ŽJŒwöŠJbŻ™C'ß?vȚ;©G7ÇaĘLÙ€–€ăD 9/-ÈJx•@Š”šșjTÏ>JÇWŸIű8è–\߂`żÈČő6¶mGLjÈÖ66&ągnÙĐĆéq/Ó€EYŻű|0*)çÀžHŐĐP€ü63Ÿu2K=?ú‘h–‘1x·€/”Ɲršôéù»Wp‹ÛÒ!ę”îÜÈĄ4»ä'óҀ­Žë<łȚguń”Œ-)±FŠVsö—‹Űëôë4 Œ<č{Ïÿ±`ÏÆ|BM%ÁyĂá{č4ÄÿïhWÛ}Cìz*xûI™^4łăʊn5ö['™çp,F†/8ÁPÒÒÓÓEmSˉK&fûyCA î_B„ś€žòŒ[á) 2,éçY6V7ÿ}‡Žè€RníȚ*0Ïò-‚šjM%uŰòï·¶#$—ê!€€ûFąÄTÿ€V’z_r}eŒçP™śśmą;ńƒ"[ÈV!„ŸŐv±Ł ąoï^ôË᫏ŽUž=śL">žk,$ÛÚ¶sÒóCUUőęߒžŒ(˜Ôżg;ŠWxÇBnrTQA!U‘ü6E tqq (*)Ԙ;h"tY˜ûÍÄ*”VßÂżˆČ ¶væ'cbĆ€±™đé” \©šÄœ}yÜ,hÄfŹžƅ9…ì= ÈF+Žÿ-7_†ëčÊê$*'1±șii’#&Ô-úvdfßqóËjÜïłC?K­Čđÿy§}ȗÊđčČÌÊÊșëA0 zöqČA˜ÎËąX*$$…Ê pY—Š^c7Ș$™'[Hى{oN …aÖțîX@CKî_Ć^6œ•r|ż•ž>o‚M_ő»ś h€ȚƒtQŒś”˜șÎQ[*Ą €@Đč‚ČZ[Ub©Š‚ŽûFĘ©Rzd«Żtqüśx?ŒB5ąjS«óđ™ó玳PJđp9êÉĆèš1 9lKgÉï%Ő*44˜ hAI©(1M——P@Sù”$*->Ąžê(MZ}éąĐemíڜŠ“›6OźI[2&-g*69Ö12S1êʎ|ùaŻéœzščçÏ'U†y΀is§¶hk€„"Ï :é}3’:úș 1/™ŚŰ3«rzúšt—Wu6š"•›AÒÓW#  <'ûӋPïŁ8‚”ț3fÂB^bBNÍ%vąąÚÇÔ5PÙț‡öxpșÏZ;]+%<’Wy„¶ŰțUèic©Zö:©PŸĂ(MŽă+ô”é­âé˧żÉ”ˆ.”Ó„‚ąPłe%—*UÚ}CBȘ”Ț5U}BĄŻą2@bht:ĂÉqą•FÚòÜ’KpçŐFFÓ4ę~&Șúrș0©~[‚W%}ÌT(Ië;&«ŃÿŠ.”W?­ŽúÒüPß0Á[[łÓq Ö¶í*"¶ˎ뀀œé7ÙƐӍӕxí|ś™âÔ5œșèœ6PpčÙÒB~Bó‡uG·ÙûŸ;Ÿć黜⠊ŃqößÛ|~öFGDő0†€jÿ‹ëóŒ‚4°ßȚ°%vŽ őEpPŽ8ČžÓÀ#㎻¶äòû''-Žćș è«N*XsáÓïQ6JŸKȘäßèšȘ%ŁČÓ2„dwRk{kPZ©$ß7$€Jî}@ÓÔ!„ú*˜„zÿU.['ČóBźírŒèW„ÿ­5q:/CÌR„?ZśÔÜû1HăÎûP ƒQćŃ­ąžŸző34Áy„Ś—æ‡û…•n±”m}¶€ÏÀöćáÛB ečJΙä„đh;‹î•âîŒÈ~„Ż8Ùąož͋L­ęEOŐ~Łì4ߞY¶ń̇·ÂćŰBևVĄòsò(†‘›„:WhŐ«%+2ÒsKăVJDôÇ]$ä9&úDilfQƒóT^б ™”,±{'ă»Êą.ž ”~Æ<Û{[Ò-”Ymúi _^Țyùećcf»ńżÍČŽé©ű0Hđ ö ‚WÏcĆv–v=‡Śx­éJ%„ś2dŃś:„BšqKžêŒpÒô5Gœ0:j2Tzp@ĘqŒƒ•FŐ!ÁbU}Œ/(P$›cۈ3<ù„ cȚæĂi íƒzÊ6,iüóÊR_~˜oh©©];»ŽćaŸĄRś˜“!g*Ÿ›ZŹjŰŁœafÔË,qΫštœÎ–fê©)Ò»GNAA—üPRĐ(+•gĄó^}ű Š‡a‰Č5ö'T¶ś)ś$őÁN?”gAKí_f›~șÏî^ôüXUŸ‹w"JŐûè&ßâ{Đè:ê§±œtk/[­©T†ßíbœËô©żŸ6jșëJ¶»™dMpŻC!„€Êń?yžčËńß §ad€§©ĄĄĄŐĆD HęźvŠ2óòò2yÜ\•ìŸÿŒíÁy;Ïpî{Fg”)êpÌ{Űtăퟱ;ŹržBeD>N;M\·©Ì=„'TÒŃÌŒàڰ=nEŻ‚óFXüśŻȘŻ ä8}njn—CVęLęÎ+ŻiÜšŁŻŁgÚY›$YʰÖÍÊNOIâ @–ú–„?-Ù>f•š¶àńư*ăgy-cc¶¶ŠŠŠnïV,P0é;d |v^^nzò»l)-)æ„€±őè Œ’ qâ‹W„ìș)dž„JÒù/Ÿżƒčs¶ŹVž/Çî>xTOć‚âÍ@%Ę:yÏ~‡ęW]/ÏĐ·č"E]Ó.]JnŹ<ôűCȚu¶€Ä•=9ëâ?`ÓRçꆦüâŠMNšl%ŽŰwêa“N?|!aìŐÓÇn›Ž`ÄÍ_ïd”ÄțeŽП-ŠșRćU'ș8üсŐ€Îʰ§Â–܃€Ù„5kŽIÓ~;íHtŐu€Ò9^ÿÛ?àèŸ?žÒçqĐÓw”ČźI§.ùg~Úê/”X*Í/íÿȘdé})9H»çŠs\Ï/2?æàx·ùF!ôUáÓ»FÄê”äôț1ŸäjNĘČw*Tlț›W)^».wJr˜;eÈű#ŐćDüŒűgAŚ|⫌…ÄoÏę±^n…ăđ©+*PĆYї"/6°T4?űàڃäòŸ~\ô›}YV\đőÍ+xă.l‘ŻúĄúœ—ŐuŸ‹óŐŒ|û`qÂé9łNŸ€,ő- ś áÿ8Ò ÈË9ŒžJÖ=šÚ’œgmê= dkI*‹›ZŠÒY>ôytTDżˆ‘ŐOü$9Mú7â·çÿüKuőŒaó+ÌMˆž»ćÓ­źĂ?¶eAĐź…+çϱ·žČh$«Œ('=!âJ†žZ”¶€”Q™Ț[—Nwr5kŐDavBä•M§Îú&·Źöé‚GźWȚŰ-š3ÛÂwODi‹ë_†©”5GüòZHnŐń4]ô8àYù€ț6>”à€sâc2‹Őcăłj‹©êL„Ò=79eE͛5șżĘű~ "~.7&üÁûҕPȘ†n— CïK&íž#gljÄ 2ž>‘Ÿ9?B!Ôž‡ÓÜe@è« ” ”ë|ç.ËKÏ)ĆÁB-iîtöŹŁÂ•…Óœ”öò B!Ôžp }7˜ęV_ț{°\]ÉÂÇÛŻș#Ó>kĄ&Eš¶ï`Lǟ»WëŻæ"„BM $ôĘG]\ś»w;l‰óbqs{„Z†Ikƒąˆ›ś“pJ!„ĐڇKìB!„Bšț°9B!„BU !„B!„*a€„B!„B•0@B!„BĄJ !„B!„P% B!„BšH!„B!T €FÄhżđRđăv Qhî"}ëäș.:çíćêۉŐÜ%A_ö>B!„šHˆâȚę{ćČe˖-[čÿANœ~žÔï;eÎđöŠ]Ž–z^)yvk#U”V­őpˆ,Ełô Ądö㒝ź7Œűț{ùèöășšTȘï±śIĘĄÛïúœiÆŹțgû}ž^‡&›0š©\!„Đś„’Ä0©QĐ„ŒW‘o2Ë땳ĂȅŽĂÛ+Ò?ÚššëŒRĐ|ߝ –ę<O@is„„k†$ÙŁ·șlvè%śÖçÊ?gźÜüÌ­»hŠèF*ŐśŚû„šőąć¶%·č%ŠȘ%Pś\ź€u_°rŽȚŹBĄŠÆ őÆÿ”Ț$äĐÉûqüzÍz FCêÈ‚ïæŒÒQ ‘O›»߀fèAČŐĐńVȘÜ«KœŸ(ûđG‚ ȘÄG -ŐwÖûd+ûYCU_8»œȘùxEœxëJȌS:ßs~)l†Â!„B߀*|™g±òôŐăkÆtTÇç“M‰Pm7â睼7œüę=ŻșŹ›ÒUă}ƒ+Z­űçÚ/żkË»±XVëî‡VŸÆŽk˜ÔŐI€É,WżsÆŹqœÿĐÿߣN}șŒÙrŃë‘ÿm癝@uäȚ€à+‹;~ZœĂìșÌ=$`çPƝ€ełÙŻò€à«?wÖîćžßÍ'08ĐÿïtŚU_Bkô~ÿà«?wȘșˆŃaѕà€#“ H…!;>ŸÌòï‹ÏYՑłŒĘß@Ś™Æ5.cća»«)ĂTĄÖaÔÏÛO^»çàsëŸ]Ë›|,§‚ń@§­'Ü=ęü=ĘOluúÁDQ†^ÖG’Ú €e”ÎóŃț1­{NûÓćê=ÿÀ@ß[§·LïźA4°„ÔÔÖ$ĆÜž„Č*€iZ†RIčr$öŸÄÖ Ô»L^ìșśŁ@‹{ÛŽŽĆçŃÎĄU›ƒP°ÖʶߝŁj©=Uêy|M’ŠC†u?őzYۃ*ș Ű+ŽÄpȈr”v‡RŸUW|îšÒoá!„P1@wsÓìÀ›ă­XrâêXăŽĘ~U€sIO±ë|çƒsŒžȚnÇĘžÚĘFO_álźșdńé7ćBn°Û™x’Ô·urČ.ŸwđÒłR*ăe…,9ËśçàóżĘ‡»-]5wsæ“sûpæę:kšŐő țlĐyE‘. œnëê˜]ŒzPč›G˜UÜ=Žá@ۈŠÊŠ$Ö7?ŰïIù:ہíŽEG‹ßçÆhccĂœp ÈąÊ;;ÍwŚÒÔбűéŚÉ2·dljJ:ôᰐBòê:êr°ăe IDAT±܂2ŠaŰʈ‘śŒË§?ÏêsJĘ>è`ZüÚïȚù9BeNśțÆ:âś_ÒÈ~Û±”}ĘÿÙÇW2ÿaČĂöă]öÎÿć—–Ű ›%śQ©€¶fgÇŠ=8œgő~ŸJÇqËW/Ę%—3}w^ƒzĄŹ­«&W#h€…Ćč9|iÓï·‚ÙŃÖÖÀç^FőaÒź+)W%čś%Ž ŒÖSwXȚ1çŃçSï„șöżÉR&žW;žĐ0kk ą fș$dÔžŐ՝*ጠż&Ię>–ŠtÌʈ‚:.Ғ§aQÂÁ–挈_šOH”ÖíŒT44ÚČđïȚ!„PC|x2.Êy~mÛ<Ÿö V-tč:ÖûÔțŁ7ąrkü/Œê4™ŽÒÁ<ęÒϋG•xùE‹Îž6{àő”^ŒÈû<†9{ÊŒțčQŸś<ò„櫹韒ŰkæĐ ĆśśNêŃÍqX7S6éŸ%é8QCÎK Č^g%i­ŠźŐłÒqÇŐg>«%Ś· Ű/ČlœmÛăŃ1bČ”‰è™[@6tqzÜËt`QÖ+>"KÊ90…'R54T# żÍÌĂgÌRÏϟ~$šedÌȚ­Ti#GÒh쒟ÌK¶:źóÌzÿዧ>$*ZÍYŰ_.bŻÓŻ7Ò(đò äî=ÿǂv>Hê…D‰©țI­$”ĄŠ’àŒáđœ\âÿwŽ«íŸ!v=Œę èAÒ`̎++șŐŰAœtfžĂ±)_*ûț‘ÓCÿyÛčóîb >†IRź+ÉW€€Ț—ÜŠęfÎêA„ïZ”țv^>/W=œ”+ux/1g_7 ±$«§…qaN!»G2†ŃŠ#ÇË͗r=ê};2łïžùeŐü$łC?K­Čđÿy§}HŁ2|î„,łČČîÆz˜ ÒzĄîT)mą7ÁaGĆÂt^ĆÒĐP!AЀŻ(•àČ.­æČZȘ$™'K¶e±çW̎™äŽhæœ-ƒf, żyÂùŽwBÉ…ö5ŻYÔŐÂö},4„Ïœę?źRDy?âMšúùI‹bŒŻĆÔY€:Së:oyĂŻIRÛÈ@J焌ĘòT/"[łőIÈ«œÒĆńÜăë<!„B2« 1”:Ÿ9î8 „—Łž\ŒŽÐĂf°t–\đ^R=ĄBCƒ а‰””Š€Ótiq 4EA_+@ąÒâŠ«ŽŒ„՗. }Q¶Ń֟ͩŰ81ɱ±iSńäZP'ă5I̙ŠMNŁuŒ äTŒz·ă_~ŰkzŻjî识ÀóI•6%Jêèë2ÄŒd^m”ÓÓŚ€łžŒȘ{T€r3èAzújDȘŽ^*„­Dć9مŸÚ†ŠhąÁÛO y‰ 95—ۉŠÊdŒr„—·EȚú§œƒÓŹÉ›NőnłjńŃç_#ŐžrdQWk°ôô” ?-œôS"•™^ë;=őRŚyáš$TTUHš[$i§œŠââ2BIU™ÀÙ}„BšÉTH Cg89NŽÒH{xyłƒ[@ò>FRŃ4 ‚đcżŸ‰ȘŸp‡.LȘߖàU‰E3ŠDÒúŽÉbJùÄŁËćŐO+­Ÿ4?Ô7L°ĆÖÖìt\‚”m»ŠˆíÁuœ~!sÎt ›ÇìbÈéÆéJŒvŸûLqêš^]ô^( žÜlÙʕ Ԓ@ŐĂ Șü[r/HH•ÜV ±žńŸWöÛëżÄîZÀ wÛùàĆöó§Ìúáò‹»_ČPłÆ•#ƒ:[ƒšùD€jĖ«óŒpMŸżŽ$7Au]ž!„jLBœÿ*—­Ùy!Śv9^ô‰+Â‰ŁŠ NçeˆYJąôçO랚{?òiÜyŠą`0ȘL6(êé«W?CœWz}i~ž_Xé[ÛÖgKú l_Ÿ-€P–ĄŸäœI^ ¶3°èȚY)î΋ìWȘńŠ“-úæéĐŒÈÔÚ^8©†ÊÏÉŁFFlj걫ÈHÏ!,[)Ńśzç˜è„±™E łJi+Y~Ž^=Hćې©QË»w2-±û<·—Q\±¶Ž&•RS\Ï łł Àʐ­D<ûĐ%„ж&MŒz#\“tIq M(«* šëjRPU“§ùEĆx‹F!„š @°äùĄÎ 'M_sÔ ŁŁ&C„ÄŃÇ;XiT.,VŐű‚EČ9†8ĂSQ_ :æm>œ–Đ0š§ügCÖÆ?Ż,őć‡ù†–šÚŰő±łëXæ*}9é9SùÜÔbUĂí 3Ł^f‰s^E„ëu¶4SŻHM©č_ÙçèŒO)ƒAăhÖ\œ&Š ~œ%o9fçCÄB ±·R. iàÓÈvmHVŻpŸ>|PÓðDș‚ÉbUk$R«GŻÖ aFzö§c›àz–HùʈŐsűö‡ą±Úü`gZ#Ä$4șŽúil/ĘÚŚ(JN­M#\“TnzVÉæ°ëއ6CœÁ“~!#„Bš˜TŽÿÉĂÍ]Žÿ9 ##=M ­.&J@êw”P”™———Éăæ šdśęglÎÛy†sß#0:ŁLQ‡cȚĂŠoÿŒĘa•l*#òqąŰiâșMeî!<Ą’Žf~àż†íÚ+zœ7zÄâżUőxU Çé;ftëŒʰêgêw^yMăÖ}=ÓÎÚ$Éê`ꃔnVvzJŻPČÔ·$üAhÉö1«ÔŽ7†U”Ëkł”555u{·b‚Iß!ćłóòrӓßeKiI1/%5šGAà•1ˆ_Œ*`ŚM!Ă-U†(†Jșuòžęû-źș^žĄosEŠșŠ]ș”ÜXyè±ʞœuń°i©ó~Ăk~qEŠŠ'M¶Gì;ő°ˆÍ/í—j§•Ą­€äĐWŽdŒvN§¶śÉy˜šž]D«›ő>ÒB1ćêŐÀOęXW©$_9’{_r©Šƒ/\zmłhùÁʆŚ&”Șw6eša%|€Ù„5kŽIÓ~;íH-;fKL­]#\“ćń1ïhÛí”ȗ”l„jûŽF4śQ\mŻl‘Šs\Ï/2?æàx·ùF!„äk=Ùę.°z-9œ̧KšS·ì ›†ÿæU ‚ŚźË’æN2~ÁHu9?#țYĐ5Ÿű*c0ńÛsŹ—[á8|ꊁ TqVô„ȋ ,Í>žö čü§ęf_–|}ó Țž [ä«~š>çeuïâ@œpzÎŹ“oĆ K}KĂ}Cű?Ž4(òr/ź’uÏE'Ș¶dïY›zÏÙZ’Ê⩖©t–}]Ń/bäFő?IN“eŹKíZž"qț{ë)‹FČʋrÒ"źdŒ?”ÊôȚČžtș“ĂšY«&*ł"Żl:uÖ7Y ĐĐídh+ɚàʑŒJ œÿžÍànęF ĐŃP„Òœäè{·ŸvZ*”TRźÉœ/%^Ÿœ°feĆÒ%“Ç,±R(ϊń?ûwďÛ«ˆÎ‰É,VÏȘmąLrj]|MRŒˆpîą©V}ÔŻŚŸU»Š…UWVŠGXR­[ˆ›1šŒ§O€neB!)‡ÓÜe@è« ” ”ë|†.ËKÏ)Ćáć i6石‰kGl jéżDšÍq=;›`ڊ”ü|­æˆnë[]wšu,ŠæËt€čÓÙłŽ WN;ôRê«v!„’gĐwƒÙoőćżËՕ,|ü·ęȘ;2íŁ‡Z,‚ ȘíBÈàXőo I^”N»Ž0TÒ­s&o™2±ÓĘ#Ż*Ș§1ÍÆMíG…îșW[üCš¶ï`Lǟ»Wë/ß"„Bè‹`€„Ÿ⹋ë~śźóxq^,nnÿ­cv]th‰a\XT\jN)­lĐyÈ€‰]űțŒÒŸ…©Așàáç Śß–NòXzé]•X‡dZúûù‰ ž”oUÏ0imPqó~Ò·PK„Bš„Ă%vĄÿ BłÇ$Ç©Czw13ÒR&* 3Ț>ńč|òœrYs— !„Bß B!„BšRC7ßB!„BĄÿ B!„BšH!„B!T $„B!„Ș„B!„BU !„B!„*a€Ôˆí^ ~üQÀŽ! Í]€ŻCźëąsȚ^źŽX2"c[Ő#g„B!„ê€FDqïțœrÙČe˖­Üÿ §^żiOêś2gx{ĆÆ.Z“ž—g·6RUkŐZOö0F¶¶ȘOÎß©æșrjCêN8ô(ŰíçNŒênăx.(èÌÓÿű]‡ÔșęźßəfÌê6°ßçéuhČ ŁŽăB!Ô2@’ÿńËŚB—ò^EDDDDDDŸÉ,ŻWÌ#:oŻ@4rњôŒ4ßwç‚e?ÏßP*û12”U}rțN5Ś•S*74(š2ìÛŚ€ê…ÔłècJ€„†ŠÔëÙÁ·‚Pł^ŽÜ¶äö!·DQ”*ăžË•Žî VŽ6À.B!Ԓ‘€Țűż­ŐNÿŚnv€ŽĄ\3 qz^Ș !òé;~ |›.çÿ–æșrjGe††Äi_KęO7BÍÂČ™’ nƒ59ȕꬡȘ/źčœȘö‹o] K‡)qB!„jÁ˜TáËÈŒ +OwçŰțwßâ`ŽÉȘí†Ïrœ<€§©Ž\yڛ€ëG]Ü_PŠV+\~lšŁ­ŠÀ ˆuśCŚ@ĆŁMĂ~śH̓4™uÊ”gÀÁ4ÛĆŁLEo.n=’5zíÏ Ë^žźęę|Ž@uä^őœËN3ŽŸ©™2».»r|rüŠaű@ęÏ CvxoûAîę?šìëË&ìy"üÈČZśï.—Ùç•æëßŃPUœìæ|àò‹ZjC50ç:ÛY„Z‡‘3gŽŰÓÌ@U–“đôÁżäśÓ ÆœŠ·l«'_žő6Üóòé‹țÉiœŁ'č$—Yb}ežrz}g,ž3Șo{C5FYa67:Ôę˜óœaíŐoTjHPâÂ9V}4źȚÉ{ß) =,»Ée{ÇTΫHé#‰œ@šűăôæțńæŻóÈšŃ””§Öûʑ·Ûâ±­ŐÙNç?›țR¶ËăO…cVȚΧHÓ!Ă:ŠŸîzYÛŐF{…–l2ąÇ±—5ӕúŹrę{höÉ%+ÜȚám!„j.LÄĘÜ4;đæűE+–œž:Öăűc·_É:˜D_@±ë|çƒsŒžȚnÇĘžÚĘFO_álźșdńé7ćBn°Û™x’Ô·urČ.ŸwđÒłR*ăe-ĂššäûÎsđùßîĂĘ–źš»Ç9óÉč}8ó~5Íêú‰6ìŒćæ»kijèXüôëdƒš`vv<đgڃÓ{Vïç«t·|őÒ]r9ÓŚyçI ‘”ł„v–^'„î‹t0-~íwïüĄ2§{cńûŻidżíŰÚ>‚Çîÿìă+™ÿ0Ùaûń.{çÿrƒKƒ€^۔(čJ„–čÎúJíAÒdê¶]‹Zœęśê‘ ÙBy-Có.Z ,ł8 em]”šÓRް87‡/%ŒąȚ…„€Ì›leĄrLJÀêbÙKč 4űőû„ÔWR/T"4ÌÚšhƒ™. ”HuŠÖëʉMMI‡>6R(B^]G]NX”[PF1 [1òžqù•4©ßÇҔŽčQŚC€’§aQÂÁ–挈è}@Ș”ng€ąĄŃ–Í BĄfóá5bQÎókÛæùܰ_°jĄËŐ±Ț§öœ•ûŸ^ ó”‘&“V:˜§_úyńášR/żhŃčĂÓfŒŸÖ«€yŸÀ0gO™Ś?7ÊśžGŸôi–*šÄ{goú§$öš9tBńęc眓ztsÖ͔MúgI:NÔ óÒĆéq/Ó€EYŻš-Œ!ÔTœ7Ÿ—K@üÿŽv”Ę7Äź§‚·ŸŽÉ©ä,č„ÔŽ4»ä'óҀ­Žë<łȚQ/žúšh5gačˆœNżȚHŁÀË3»śü Űùl| ©%Šú'”’TfÉő•Öƒrm»¶g„\Ùżư̂/û>“cv\YŃ­Æj0qҙyÇb€d&N IwmŐ]Á'š €ŃÖÒB“ôą@Úw–Ű P)·vo˜gùż}ž$1”~WN` O€jhšF@~›™‡Ï:™„žŸ?ęH4ËȘ Œ[©ąVێmÈì»±un;BócąSèŸíÛ©Ń5P™śśmą;ńƒ"›rv!„BRTÛg‰*ˆŸœ{a`Đ/‡wŹ>ÒVyöÜ3‰űł±lkÛvDÌIÏw UUŐśKzòą`Rÿží˜^á  čÉiPE…TEòÛ1ĐĆĆ% šÔÜïì‹Ț‡} ÓyYKCC…Aƒ/Źșr.oH;ê};2łïžùeŐ, łC?K­Čđÿy§}HŁ2|î„,łČČîÆz˜ ÒzĄîT)چÄúJmIar|2eóăìI!{oŒÈù‚ëŒÊ pY—Š^ăŐDȘ$™'Cś‰bƒCłČíۉôTHrúô6,{zò™@êwA$©>Ą‹bŒŻĆ|yjœź_7 ±$«§…qaN!»G2†ŃŠ#ÇËÍŻ,'©md @„óÒë.7•ÁK§ÈÖl}òjĘtqüśx uF!„ĐWP-@bju>sțÜqJ .G=č5"†!‡Í`é,čàœ€zB…† a-()%ŠéÒâ hŠ‚ ›9@*ÏÉ.üôœœŠhąq6MŹ+ç”3©ŁŻËó’y”MÈéékÒY\^ŐÙŻŠTn=HO_H•Ö R„”Y$©ŸR‰ßž[»I}Ó/ˎșO{áyőüĆ[Ą\LӄÂB^bBNÍ%vąą2YŽŸ ÍoiՖń4F»wŸ6ąçî‘Ć ”(IœĐpőșršŰä4ZÇÈ@NĆšw;~đć‡œŠśêĄæžkl<ŸÔ%TTUHš[$iS‘Šââ2BIU™Àz„BšEȘ †Îprœh„‘öđòf·€ä’/Zá…€ŁiáÇ~?U}Ń]˜Tż-Á«‹>f*‰€ő“Ć”ò‰Æ"7U”]gÎ ogšźŁi‚š0Pćߒ{ABȘä23ԒBȚƒę CĘúŽ™îđÓœŁf<ùçÏuÿ<çK»JHûíő_bŻ‚Ă‹í--[ç¶·ìDż<ö!0‘\_âăgšDœźș„ÇÍcv1ätăt%^;ß}Š8uMŻ.zŻ ”\nö§­%$œ €ŠȘB!„Ž @šś_ćČu";/äÚ.Nj>qE8qÔÄéŒ 1KI”țüiĘSsïGM;ïCQ4 F•ÉE=}őêghŠó6™Úč.T~NĆ02b“PsuWEFzaiÜJ‰ˆț\ÈsLô‰ÒŰÌąw„”Y–•ÖƒŽ őńŐʏoœôÇáżæ.ç;ÿóęŰjű{śE”üÌlK/›Ț+IH Ò Ązƒ€ˆ€(Šˆ`A„bć©(XPˆ €„CHHïœn6ÉfÓvłmæ}È6$[BzțżśĆœ;·Nxśìœs‡Ä|·”ÆŹ›-v%șl±ńè[âIÁAùȚțÌìƒ ÛŽŽ—Đ4 ęGs­ÈÊČJzœm`€ŸAȚß©”Æú‘ĄKșòvĆĘxŠnmi„ CcCÔ.Òé›pèæŠüg!„zT‘‹Óżgő“KȚÜ{ŁŁ~CUÇFćуç-iŠ:‰%X,՟èĆ­bŠŽsŽïĂ©°A–žĆŁ'çÜ7‘î‡rˆnęŹ-HM*ąl'ÎmȚuśš<76Ï ™=ͱ#b!m#f4lș—Ț»’œȘł’Ú$Uccïvr‰‚abjąĂîžőȚ«‹âóëćúVnC†Žț”ț«Ž%úöÚèmkśìČÿóJ^“ŸÛű'#G*?ÿńz æZrîż:·ç n^+śnń+‰čSÙ a˜y=±0”Á;uł°»ŁßúʒJŒ6{§ìp|ĆœÛIK{5ŽBÒ}ț›ïŒàQe‘żű›nNÌ֘Ú=Í”RT–U±&óG)T€ą(5C4œżïh…ÊI rJè±>Ț\2œûĆ/ÂŰ{°]~#Ż„›“t[~à—= Ÿ[șò óB ˜ÇĆà±fÿźÙśö$™?őȚgO€4jÛԍE Î<°nUńÒ #æœ0ʔ-oæ܉ùórÊüM‘ÿóÛ›ÙŻźœúÔ«ăőš~Öï·ëe­èæŰĘïì&Ś-šüâÆYmüŒŰăÛ_­œûë{Ő/=PčŹá/îSmoĐČmAËî¶WóŒ^s_Éz‘3èÒÏjŃ˜«_-z~ùŹđ…/NgIšêȘ đÚ/„j.œś’hÉȘ„3–mX '«-Œ}dۏ‡ț)Uôöà‰ȚÔԏ ĆKŽÎ6eò≖fzT żèÎïïî=šő%À}ƒnŒ“Î ȘŠ+î4ăŚÜ^ŁĐ‘u]ANM‹inż»ć,Í©êhȘĆ/Żh3òăħdI@š•šĂž1J‘TZ„R-Ș2ńVù‹O 6=ȚęùF#‡ČjÎȚ,îög7ĆKNȘÀè!„@„ŁŁă@ŚĄ‡‚Đ·°·ĐWûœĘ&šźáÔőéŸüÀĄg›żXüê_ĘŒŸÖ|Ú'G7;_”컜źKx€çȘC‡VêYœű«ô‡ČÀ‡BĄná úÏ`ŽzíđGO°Ő%Ë>š”áomŻ’EHȘűäÏW#ß[žÀśÌ7ÒÎiLśčOąâwÏë.ț!Œœ}œé‚ŸÏuûæ[„B=4 Ąÿ EÚo›Țș€öùy… ·GœE Żł'æÀÆ”Ož]û{‰JŹCÚÍX»È.eßÖ ”Ę.S2\\m›Oœ/ÆEL„Bh`á;„B!„Rêíłć!„B!ô݁B!„B)a€„B!„BJ !„B!„H!„B!€„B!„B)a€„B!„BJűąŰ>DZ-ûɧí:‚NYá‡o_ž.Đ*=,ÛA+çŽq73gÓąFAԉł{RDÊ·źČlWŒ6cŠ"uÓ·sü‡û !„B=Â0@êCŽđÒï§Ó8á2zâK~ać3t’qő_‰”m}^œț+—aóÌóóŒê._‰Ik€ ŒőŒ6únÖ,cgK=cŠkƄ{RôŐżÏ@~·u1œùòÒ”æië?ŒÏĄî}LÚ}ûV0uț””ú«{„á„ć‘ëÍÓ^ʝ\ąPùŰ|đûĂXçoŠ*Ô_BĄÇ‚ iZëW‘6ŽŹȘ€ą €”űÊšGIŻĐЧ cÏĘźm{š#Ò«rIź}€]žòyw“fZTđć.ńIș6Mąúiïûêßg Fż;Ž(1ƒOÍu ŽIÈ©ŸíZy9čÂ?ȄÿæèÀxÈÈdçö€•tƒè†ÜŻùfæè)égÏ5 ű !„Bš?„ŃŹćsքZœÉˆ5(hÄ Oƒ^ćC[sÆôa/Ëe1Y@ ›ŐÍêéÆêŠTž§“Z ÔèwźÍ*-n Ê? 'ÀNJš/œUőŻŽHł©“Š,–wIŁJcSÁiáxÖÔ !„B€nËÊÍ\°`|xöOÇn^,k{čÁò<§žìBwžh`äèœhȘÿxOs.KÎ+->}:ád±˜Đóęù“¶ŠÆ,’ &üčg(bíß~[Š1KÂiғ_{Wï¶2Ô\^–ò驖)KF…sć/lż\ÓŠïęț‡íŻá4_94 Û6ϟSuyÁùđàći3dór/#}CŽ>I‹V\Z@ ÒȚ۝ź`ŽnŐæaŒö/ÓŒÛomVœ+ IDAT€ôäæPŚWș Ź&EŒ˜>ÌȚÍ\)m-)(ĂVNń t21&ćMBanVú“č%]'đ}‡Ș+Iš]ìădv=KčX¶tgÔß.ÍïGÍc€qCŚőŻO ©Š~użËĐvŸȘ±'5Պćțö‡“.yőò}Ë_ì‰ÏŻxƒœäÛ,! @Úx>áL„)ìZ% [JźdI7đr†w§›?ֈ‘[[~Țsú@!„GLÄ^^“ž9cVűs–LżyóÛ3YÙ-űí}Oß-tçˁvüŒgÒ*ć~#‡­^kižûÄŻer9żäÄĆ:’0 ›ږóę•*Í/Ö)€`Z˜łç”Ęó wŹmI蔌2d퀀àšKŃ/ìMčtKÍŐkÉ7 Íܞ™î*ș{,_J€€Ą‚yâ‰ăëŁôM ‡;Ç\—vÜŁĄŻŽ_̱[ùÊì§l%Ywrÿˆi•é™ń5ă*w‘v#§ìZì(ÎNÿíÏș=‹1c‡oYoóŐźłgjiĐԓ—K4śłDkIŸ©łȚŹ/űćè™oĆŻđđ5sŠłżŸ$Ò: €”ÿæçG:TfŸ8u§NÁ4çZ 6&Ûtč5H6ڌÓÍZ‡BZß(Ńҕ”đVŠpé8çazYŚÄ,W'œ¶ÄÌ™.c€i”#ź—Íź% ü.ÍQŸȘ¶'i ”ȘhŹÀKc„Á41ŐcËÛê[ä4iâhA ;țÍ#Ź|œ\ öbžșh\ššÍ“w Ž'ï”vù5‰Đsv414Òwç’ÀĂ‹BĄÇQÇ! òŠȘSż»3űÙĄŸmń»v.ú@L”Oa,6“I‹EÁ`êsX š’·É0ÄêŒ4Ÿ=ž» ćĘq™€«wjoÍyrČûéęyuÿԐ6ăƒCšxŚoć{Ô”àò„ÌhŸ bĐLqîËùevOÙčp‰hĄŠëäœ(—n­œU €œńÜi.Ââ‚K7EȘW· j3À üÂ{ iî+-5$ìĂFÍwÆțrìęĖö[űÏs‰ç%ł\ŰyQëöeđ(€+iïż=~ù ·ë‡Š4őd‰ÆÔè3Mu Œőëż?wč  èx‚ïĐăìő’ ÄÚFćhëÉțuìÆïe=[ß%žŸïn ścÜÿ肗ôÊÇ ùZ2ي3Jk"|‚<˜Ś2䀇·Ł™š<ĄP uŒ4ŽÂĘűY»‘č sș %Ô§ȘïIM”*źŹŁŒ,LLÚÿtcˆK]òúăs˜&ŽPŚŰQĂĂقæä«żÏZÊj*h'OG=ąTtÿ—èæËÇ.S.’›č!„B©N§Űэ„Y{Ÿ(Iˆœóî“sÜőj?šŠáôÊ{3§Ę}HaЂ“€©—ü˜?đ'q=JźK˜äÍ-#9FúíŸ5€¶Íöłś$ó’z9›’ Ëëi %ÂVZZSWIĘ&SŸóÈ<ÒÒœê+B/Àǚ)Ì:™ÜÒőîe:čɓâóxiTCțùʰ Áź~Ìą*Đ֓êS”Ôäe%·›;ȘąhȘÒl#=CŽn”ŚÔWPn'œu4#Ł©ś ĘTŒ“I—»€jkšÖ!–——Üj lĂÌš”“ŠĂœ%·ÚÛĐÒ^JÓ(šÔŻ-?)=żç©êzČMS­ Șù­0ÌԆ$˜žŽ­­MæöCžDifǔń;0°3g҂ÆőőŠšxáÌ5"Ą›Ć­•…Wjh3B!„q$ÒÜŐ{áô ™^Źâ› ?%6jÿ±šȘ9òʉKLĐ5oÊȚÏâ…ĘÒ Ńzí ĂÂԖdpg/úkv癟  w-•‰@S4-n“)€ⱌzŚW„Ą”AŐ5t{ŽÛÌÈZ*ëT7—)ȘűÍô0#kšÒ֓Ru©łŽ±”ù^XBS4è4DŠÊä‡ô6F†íڐž˜öǕÌÄZʖhćâêêúúźeÈ%:šĄšIÈÏòvö +óLFŰQéQ­ uŒhMŁĐ{êzRc­š|~#mjbĂäŰ{Y¶dŠÄzđàüĘlfM7ê:*JpŒ ŠßŠi—±\Ò*#ôőُçŸB!„4SH€©Ó ÈéAłëńRS?ù8-źFȘÓô‹–T•VWaàÚFKj3 ëpgIśh hYҙó‡‹;Ïiqiï”WPw»].Ś:$łËž«GK?öUwA‰êkîI ©šëLŽ_ęÀÇé+ȘRą7d§¶pBè#‡„\žŽăb•ÖG źï–ßbŠŹŒò–QN#ŹoV::yŽ•–~œŸ”VK]OjŹ•šźQHÚŰZÙÚ»9'rRÙëÙZ–H+T6Ôʜ4PÆËœkB!„MLB/dÁŒMcŒ2Óv–rœâN±CÚ(|ša hNÏŚö™Ÿ]űĄ‚Ąz|4ÛÈșÛ3Ę™§ôUWŽšŸ™&-MmHšíàHšàädĆ"Jïź 0ŹHI-_ԟuÖ="U? Ž€1ńúÄ˜ä±‹ælš6#ùűʞłŠzISÉO?5›>è;h+(N– áeRädÇ,KJlR~ź„œ„ŠQè?škEÔ «hw›Avƒ9”ç [ł êőÆ:5ĐuUś^a,mmBcH€Ú·Q±8Æ,șE€ÛŻH!„z̐ÀàˆJżÿâŚçś%\ĆèšßĐ‚ÒžrÚkôđ ŁNŸ3UWsh™HB“\S[Čï –‰…°°łž;Kæőđżï\łț(·tê+”‹3ò”čnj!úĘì,+/Mldó¶ïh)i>hê`vSNiVïÖ=zUgejG$Uš"oŸ“/T]Ț:&ŠŠF„Üÿż˜źUJ+òä^ȚŸ!nŹąÌÒڎ«ŽŽWă(ÜCèû†LdŰę}§9”;škE7 «Ú8¶žV6 Œ,!%(źź1ła§'«Ț{âˆŐ4(Hź©úR\SÍŻkÆ-BĄ#&Ę}.ź·ùĐą3_Š/jô8c˜ZšZé™ ¶a€±ŻżksƒžĄččȘVÔF5ü}<)lMđ¶7MÿčYœ+ë™šș{șúŐE?ÿGčrrN·ÜÉ(Šym™ìTf“\ÏĐŹčű蝆^ÍĂššžLńÔà‘[#9—JÄ,Kçé#Íi[ŐïôGčÀ4·6ł1Ń732nĆ ŰfîlĄžĄ©©ąŠULśșŻÔąKco]9uêł‘–‰č·*ErŽĄ‹«­(æôŸlH+Ÿ*č,lçK&'“k›9ÜŃcꃚŠoÎ5Ó`֛æöȘÎíW7 €ÇÔčož4ÜÌ«­j‘3Œ,ǎsb4dĘ~8ok„%ÉéŐđ€o[x,KćčD-íŐ8 H[żu‹C]ë Š>ŒÏéÒÍ©ĘÓ\+ș©ąžëaՖžZBąș:[2$ܝYsœQe€äEćÚßÊӘÈRs€Ł‘“”=-Œ­èn‰ä.yă©öő>ùó0Ÿ !„z,1”éŠáđÜë*gúțŒggÌYń'"qIâÛ» §ű:ِ!5”œLȘWقD]>ÿsôÒà€˜”ž%śjßœŹ-čùŚùœDű‚ Đu#ću•%ÿ|ș*|Ń;‘úĄ\†ęŠ ȘœážèÇEĐŃòȚś•ú·”ìțòtÉôÀi~ț+BRQkMUĆqežGŚ&ęóșdűČïE †è)Z‹óR?9—tOu<{òàzSgP? ?ż€ÈÓkÂDOź“·€||:ńŽŽ—őŐUSNI6ÓuX]æ­ÎÛò4·Wă((ŃMőy R“òúÚîB Í©êhȘŐRY+7ta&ò„ çg”1&ûÒŐ5Ș'ÒŐ蕳üƒœőNßìö|ANÀ`[fCNRuwAÓÌْ€•©=Ș4B!„!„ŁŁă@Ś!l[S–ÚP†– ëE]ȚMƒPOÜ%o,\,ŠyźyÆȚÛ¶Ntˆ:öÒ™Úź ƒ€CđȚÁœk­:Éëÿł*B!Ôp =V˜Ÿc~|Γ­.Y^¶këéó-łFè_‡œœT8gčÿl—ìKî[ÿ#]Ă‚©ÒĘ1uĘÆ?FŽÖtę‘[5!„B- ĐcE^|çęò՞{@‰òĆł:èß©15~_zäșčC/}•RŠ"\ŸUŒÓÏ^șÒęăI€“qsnÆ?:ˆBĄGn±C!„B!„GăXg„B!„z`€„B!„BJLgg灟B!„B=p !„B!„”0@B!„B!% B!„BH $„B!„Rêó‰á±äËĂżœÎéëŒ6–śąöŽÀc Ț„ûpz’°úÇĂ_?ë­öŐ«íŒ7B!„zz:ß%ŒGżțŐKæ'ȚŰzȘšê—="ćlK[C#Êђ…òț(`€zòèԏ̜Á04vƌ !Ÿ.VÆLYcu~âùĂGź”Ò =!„Bÿ}3g LG­ûl}žAÚŸ5ęӹ댂г œŸhńŹPÛü}/}|” g"=ÆțÒśoO0&ș$ÈżZőiŽX¶ÁsŸš=Öߕ«'o,ϊ=}äx\y LÛđk—Žq3hÊčŽÿëßï4Ёkvœlxű”Ïnô0@"LƒÇű3óÇńîœțá—K·ÆïÛÒx*ÎśKțՓF—ȚxTî ÂjâÚÍÏșÔ€'EŸŃJ˜ž›ôÂfźìÍÏąŽ–T„Bęwôќ3xȚą@=Yæ„‘Ç‹žœàm$JșNšÊžŁżV°;}Ær»`ŽqƒP„iÈêm ëÊé_JZőC&Oć][òí]1ԘÏ5țŸęâ!Ïœłæ™‚ő_ĘYŸ*čńqœîá a:ڏÈț)ĄNÓ=ĐśóLĘÊícTsyFfe>P=©Šíi퍣îÊ„kŻ|ùj‚€±čc„ëlÖ+{Ț ̉ŠmӒŠBĄÿŽ>™30œŠ=ę31>wdxJ6őđf„țàhŒŐȘ=Ïaˆô€(~êĆÓ©ȘŸ†ĄŻÌ!yŚndËÀÀ|šÿÂöO~Ε\KïüpÖűf őƒ‘9ûnUKëâ >éëÂH!ŠOs-<óuź zžĆް5Ú[‘Ÿ/Qš2&͇ÎzzáĂ]-őäő規\”+:ŚÓmÌÜùÓÂ|Íےڂۏü~!·‰ÂtÂÛ_œ`sqëëżÜœ€áŸűłg Ÿșăąê4»k菠W~|sŒ>ŠȘSïnOń酙CŹ9ŠŠ”C[>œRK?xčì°ŚŹe”'Ђ‹;ÖîÏ쎩LMÎìàWöm°;ńú–ûś—é~sßKìƒk>șroÍ”ç=ÉŽđ‹˜9uô'K#–Œ™Wpûâ‘Ă—ò›i`ŹțîMîïo4˜œđ‰ÖTcIÒù_žÉiVfϱ ™œp֘Ą.li}izô™cߏ”Ü͜ąÏzőéé#\L ±<ćʑŸO€Ô+8ÚzC}‹˜«żÛh}lÛY“y‹#üšÆòŽ«ü|<čVĄuŁ\Öj_M=I”66«TZÜÒąĐ%U“‡Ó"„B=,œž3Ü1‹g9äęy0?°ƚŒo㚊 óIL&!H'„ùȈ ƒ’Ś ć@ItsCcÇÜUŃP/€‚$hŠą€ąh  nű̱ŒžĘQíSȞH€CXž‡$ć«ÛÍśfsœAOmzkź]Ýóż/m3:eùJs’„jeȞŚÂ-›çÙđbÏ9W-7ó?kÙĂíێJ›’ă2„/…ž)(TȚ § @[EÎčÛőŽ–rćżoĘrĆÜÌaô’•#}æż2ÖIví—=…3[*W@śȘ\iÊÏ[¶^0511ś›ŸrȘŐꝠ6çâšêZđ·”&Ąš"ŰÆæÆ,YKCł„fXÛY3šČy-ŽÆiëIÚÄolIe™èJ˜c8yúŠMòŸtL­ž 6­á'ÛÿńÁVśˆe+ž~“-xmWl# €Í„ő;VmKœűŚț’VçĐ©ł7Œ7hÿ֝—«Û;€0 ~ƒ€èÊÉęçäC"fEŸčIÿƒ-żd‹”ö†ÆĂ3răȜó‡??ÊŁ,ęŠ>œűőMm:˜)Ö2‚òfÍă«­\–±ڐÉ6Žö9ë©PùCg2dșŠjÒï-B!„ĐCՋ9a žđîUg(=yhnßżC’$R_!íÇEűY?EUQŽ(=!MüÂŰI>WÍn„ }śˆqƒ€Yż€ eT~11kűPă€bÿanò’Û숟ŐßNS>KÂ`»L~yí<6/ńäÁßź—ŠiÂ0|Ę'qo|›xo•.ááέIÇRî=šF͞ìŹÈ:űá§çy ˆMŸčkMPG-Š<;Û„îÌ{ÛÍÄÄ*vn9/ôâçŃÍMÉńҗ‚B\ț(,RŽ=(ÈAž}țvç c7ćĘV_–__FÔŰM_1ÎwšȚ‘MŸœ(»{»öȘ\ZT[œ[ ,jÄČûCM9ßźæ) Ź­hržóî'‘Ž5§¶Ÿț[ÓÆȚšæęŁú`NÏ{@QüçæuGïNnȚțćÓaĂÌź^nhÿû22,ûeśŻ7„4”:ìüÖš_Nl|›^ÀüEĂYé6ïŒÄ§ąyo}úüą…Áq{ZęȘŸ¶}vĄ†€˜[UŹÏ7Lžv&çJ­±74Á‘%úúÄ1”––4™»ï˜:7ìT֕Í# ©ZˆûümïͰ&– ź~·ăPL•BŚTú»E!„zšz1g`čÎ\2†ŒÙușHŠïő€ûäp{]ßa zb‚k[òžűŽP‚DíęÂ~ă†M;/_)Ž;ɝò_ÿçižvèwÿŻíû•!ŻOúuŻtìz“ÛûŻVuLŚIÂ,|ńł[ßî<lŸàĘí+GÚè™ ,(-“Ș–Éôfߔ“źò˜>ĂÍŚË@–SŁŒWè†ÛqYRe„«ÁnDQtt%išÄšÈÌiæxvcĐ-wâÓ%vAÁÎíGL“vANČŹž$!­­ÜNhIêĆÊUæš}Snw4æ,­áՃ„Ip}ęìZZʶ$Hź SÄă©iÒóžlÿDőI!șĄŒŒ…013č{N»Œ09őn!r~M=Í211 €á>ÜßT’v-†ß1æT]ìŐ;bCÿȚë‡Čœèێdș9%.MÄäëÉÒÖ[ÔNš—š}śCYqZVËłKÎ]FPŚTőćRUŚübŚ_}ÿëÙlæš—?ÜńôP•#N4§jÖż-B!„ĐĂőÀsÂzÂÒéV™ÇțŒÓJF:O? bŒ•0țjr‹êšJMNfY›…śž™3CŹ[‹3rȘE4€ŽôÂ§ŻŹZœæ…UŻ|‘é5uDӕÓ*û‘˜LśÁneQ{3ŠÓ?ßZùÊË»š**/|ŸŻ:=gyi-žù}–DőCS3#șčŠFtï›muüŽi:ĂÚ֊Á4_òé%ë/31fÈ閔űtÉÚà§cĆ% Ò&(ÈYšù}rçÓ»-·Š_V&RœŠOÊí–Æœ©âȘàÚX± m‡ž”&Ÿčć;ÓŚÇèBŁœ đâx*ż6ôŒ'۶3æOós”63`“A]AȚęc€e Őہą€ Ű&Ž șF”4ŻșŽ”°4" šf>_„`y}mĆ633$@ȘœOÔ”(qs‹Êr3ĘÔŰLwÍčËvÎCmȘ†{ƒn.MčY W.ÆEîűpțòéqÿ(VèȘQÿ¶!„BÙÎăà§xńÎnčQGctô ÌGF„ń.^Ëž7/$­Çœșc”Wćń^=™ ^“—źzjˇ{·ï‰ź„€jkjhęá3'ÛdŚŸőúÿ&ûšKËâŽ|ǐgț¶)_ÜHՐöǎ5›Đ­Ímf‹ßŃĄ\~TLn§ßœišn¶I…BqśBšąiIڑOOäužyRM2ș5%.”m]P°ă±’2ËÀ WYÆwɝOïŸÜ΀mśÍăû \54ćL‹xŒFr”·­ü|=‹3ę9?/‹K= ŻúȚźÁêIÂ4tőöőÁą›§țű:łR ’R€çüMÏ;wú6Ő} hm·DŻț°5ŒÁdvzʍ$»}3q—Ô)U—{@Z–”Ê›?ÓĂ͐(î:ʚS»èŚ!„Bh é>gxÍ]<ŠHȚ—Đbja@˜0  Íč\56Šń©ą‡Ž1”YtôzŃœŸŚč4ˆę|Ś_™­4@ö请ńd;ß\Ÿ88iÏMQûwëńłGÉążl™Čv…eì,çź{q5€–4Ö«țŻ75Ă}ôęÇW^Š-ê<Ț2aCXZp”„ÓÌÜD9ÙVÔòë(ŠŸą6;S͋CéÖŽűTńșà`‡âĄ!îČŽoïŽtșՔ«Y”û@9üȘ±òó€Wr%GgTȘ7Ő/ Ńj2î- =PO†ĂƇ˜–țőțž•ÊrYÖrŠNAŽŽß@ ”·Ó# ï>šĂ¶”·$ۊ딍&­­ ˆÌŽ˜–Ö\RZÜ ă«S5ĄgieL@ĂƜ­ÌIi‘ź9?xčśałÙDç-Šș§Ț§?[„BĄŠăœŽìkË4sXłk”júÓÿÛ»šê䖦/ÄéábzLœèźÈú1Ze†NZ8;Q„ÙywśíĐ-©…Šq.n6Œ›íK„lŸéÓ܋Îïkö|ÓžűÊĆäÂZæ”ô…șęùû~„Ńˆ1# JccËîmȘ$+WÄò ćvÌäMF„û(ÿƒźMN,ŠÜ'Í0QÊLÖœßà[SăSĎAÁCCB<€©q¶W[źfœ.śsŠy<‘”Ż›U]nź@!ÌË­ćòw2–ńȘê(--ÒܓÀâpŽXÔÖQKÒbäűCzCQœœ"`}bŹ-Łăb˰‰Ăô[ÒîäuìcúŒe­ŒăaنêKr3 tzHFË1…[v4©=ç<s~ĐrfV\ŐG‚ÓáC,éŠÜ‚VZ[꜏MŒÆÍxÛőïŁßZ„BĄ‡ëÁç t}üĄÿíT±śŸr…ąűÂW;?ęᆚßçQÿŃ1ÖF”t%ĄAe:G75ć {7Μïy veÜ=ìó°ÙcY _çS4%W­PP:óM˜Ž`«șŒéÖÛŸ+Œ\±eƒÍ„äj…ĆЈÉîąÊ =™ȘŒxđDđæÈ7>¶șq» VąÇ”uö ôá|ę‡Tćä\œŸ"~mâr#ł¶”=©śMRՕ lS;[Ksźă s‚`ș†Žà ”U5ÍòȚ–Ë6”łł63515bË$8aĄl°QX[U)hӜ3USĆgŽôq—Ü>[źEyN^ÛäovíyžŒw=I7ćfWÂüùëVrą š˜VȚaă}ő›u\”dœűífàÚ„[Ț¶Ÿ_Òąç2ej•țӟ·:VÍ(a“uä;oX^ŒU!çúMœnXțś‰8!­­7hc@‹Zl眔Țür2ČòČpĂÊÓ'ㅮ¶ԜȘ±' ƒá«ŸXjY‘WVUÛD: 5ÒÇŽæŸ/WPÚRï"'­zń)ç:nĆú_r;E`ęÖ"„B=\œ˜3Đm59wjTČČŽžMSÒČŽäûj'ífl~oŸsćÉíïŸźT™k†ÖNVajĄGL 'WŚVšn­-«ĆM)=G˜G„š4Ä\œÓ©śè–Ä‹Q 6FŒČ™y!*§VȘg;düÔ15—ö·Ïré6y搚KŹìܖ‰CüÌ.ßČôÄ)Ń!@"ž!c†9ż$đ»1YŃńO>’<łdʔg‚ÙmŐi—ö~T6nçËÙ¶ćÿ`sĆìÓÂ&-gÄVŽÖ–f')U™sŠÓă’[Fłj‰ț9M€š”†r™^‘Û·N6ïX_ő̆QŠČcożuŽ=ë/—9xŃû›žž·@4dîÚ!s@–űŐȘOŁĆsŠêy<©';%§PČœ"ÖűaTM%_Ń˞T”žúòĂćOŽ^žją\Xž~í§âŚ}IENDźB`‚prr-0.20.0/book/src/images/tutorial_comment.png000064400000000000000000002200311046102023000175650ustar 00000000000000‰PNG  IHDRÛçqóžę IDATxœìĘwxçčśńïlߕVœ­„$„ą‰Žé`Šmlc;ÄžÇqœŰŽ'qêI=ɛ^N’“Ä59vœžś.›Ț{ êBiWeûÎŒH5$QŒÀč?ŚĆ•X»3óLÙٝß>łÙÔo°>XšŠáóù©ŻŻïäGDۉŒŒÄ`űT> „B!„B!„b.ë°œ±© —ÓŐùßŃŃQDDD|ąœȘUU„ččč[śÈšHbąŁ?±e !„B!„B!„žŽ]–a»ÛăĄńdcg=ö˜˜""ì€û`išFss @{]ś˜ŰlVëEkĂPÒ4@0D0€ ……4TMEU5t:ąCŻW0èőô:ŒęEĘ?B!„B!„Bq1]va{ŚȚìV«…„„„!­źȘ*uuux<^àÓßËĘâóńƒőížFQ@QLf““QÊî!„B!„B!>].›°=R©ošÇăöàp8°XÌCÜȘÓŒ^ŐŐŐXmVâăâŃë?=ƒ„zęŒŸÁÊù2Šą`Đ반XLÆ ŰB!„B!„B!„:—EŰîśû©««ï,“žž6€œÙÏDUUÊÊʁöČ2 ń˜LŠ!nŐùń‚x|ÁĐy…ì=)ЂѠÇj6JOw!„B!„B!Äeï’Û}>”uu„‚!Ź6+I‰‰CĘ€ŐÔÖâq{Đô$&$`6_:=đφÛëÇăóŁȘŸÜ!ąÓ)XÍ&l–ËûŠ„B!„B!„â?Û%¶ûę~jjk CDFF3ÔMŽÆÆF\źfô=I‰‰—UwUŐhóűđ‚Ž7û™(Š‚Ùh ÌjF§“AT…B!„B!„—ŸKŻK‡PH„źźțČ ÚbbbˆŒŒ  ”ŻGHê& JHUiq{/ZĐ iŸ@·—zyl'!„B!„B!„èê’ ÛëÚkŽ[mÖË.h?%&&«ÍJ  ŸĄ~š›3 UŐhuû/^Đ~ŠŠi‚AZĘŸOŽlB!„B!„B|.ɰœ±© ÛpYÔhïÏ©ö{Ü›š†ž5ękóű:Bšćk‚!Ú<ŸĄi€B!„B!„BœŁK.lw{<žœ.ÒÓӆž5Æ©őp9]ž=ž!nMßÜ^ÿE-s&§JÊžœț!m‡B!„B!„BœK.lo<Ù€Ăá@§»äšwNt:‡8œ~— ˆÇçò ęMÓđűüűÁĄnŠB!„B!„B Ê%•f765”Śi·Z°XÌCƜ Êb1c”Z—\9/pÉŐIWU /0ÔÍB!„B!„BˆAčdÂö`0ŰY>&!!aˆ[óÉ8”^.§‹`đÒè”íőCCƌ>‚!Œ~ ܅B!„B!„—>ĂP7à—«=h‰‰ùԔéI§ÓCcc#.—‹ŰŰŰĄn^_àŒËÇÍ+ €ŹŒêêÚÎżEGG’‘>œ1cFa”XÎiŸšŠáő°˜ŒçŐ>!„B!„B!„ű€)Ú%Pš; QQ^Àđáé(Š2Ä-úähšFii©i©ôú!k‹?€čÍ{ÎaûŸęY»aΎ'úb±˜™=słg]qNĄ»ą(D„Y0/™ûBB!„B!„BŃË%¶798›œDEEb2™đûę„Bg.mb41™L˜L&ôę„Ő~żżóŸN§ëœÆ`8sp ;§QU”sšSí:őOŻŚc2™0ęÎ/tNtÎÇétEtTÔ ¶Đ'Ł„Í{NeZœNÏżô*Ő5§{ČGFFàp$‘œ”D“ÓIuu-5”§_·XÌÜuû-ŒÈ~ÖËł˜ŒŰĂέwŒB!„B!„B\ —DŰ^QQI0$**’cǎQ^^Nssóߟ’’Bjj*©©©Űíö3ŸŻČȒŠŠ ÊË˱X,€ŠŠ’––F\\ܧihh ŒŒœŠŠ Œ^/iii€ŠŠ’œœLEEEçü""":ç}ÆùŐÖÖvÎOUUÒÒÒÈÊÊÂéta0HM6žtišFcsÛYŒZ]]ĂSÿzŻŚ@Æđ4]9żÏĘétńńúì?pšóoŚ/œšÙłź8«eêt 1aŸê'„B!„B!„—·!ŻÍáńx ƒ Nœ8Á‘#GŰłgŐŐŐgœfâĉƒAâââú ÛëêêÈÍÍeśîĘDDD0mÚ4"""ú ۝N'ìÙł‡ææfŠOŸŽÙlÆápPSSÁŰœ{7‡ƒéÓ§ŐoŰ~òäIòòòŰłgĄPˆiÓŠałÙˆŒŒ" âńx±Z/~Żí@0tÖćcöí?ÈoŻÀb6sę”W3eòÄ3Ÿ?**’ËodÎÌ+xî„WqčšyoőȘkkžù37z蚩†€”ŒB!„B!.*ߏäŽmpś}ĂűęèOçűƒgvùŻżo5ÉO”ąMrpâțpŹç3ł ›‡ÿûÿŚfăożLáŸÈ ŐJqčòôÒăqOQŃqŽ=Êșuë8~üx?ÓxˆeÜžqęÎûTŰțŃGODDYYYęNăt:),,dÓŠMÔŚŚc±XHKKCÓ4jjj8xđ kÖŹaäȑDEE‘ĘïüÉËËcęúőƒAl6Œ™Euu5{HÂö`HćlČöêêšnAû}śȚĂ‘4šiŽ$ŸțŐxêŸÏQS[ËŸę‡HJLbÎ {žkZ{{?ŃqRŐ žșăz~”7èőĐ«Œÿ­±CÿŽÿx7?YB0Nÿ_ž›äżë4NnűűÉ+n‹eú}żćÉŻN%\"ű*ZÉOيkô țđćéƒ8‚4ÛËúm8TTCc‹,$Šg3sáBźÌŽąÏQ€âśŸä‘MAf}á+Ü2ڂÖB!„BˆŸil|””eBŒZšÊÎÍ}^ÇÔm«bÜ mhŁÈ}(Œ‚ ?.ìŻVQGëžüâæó ©ÿÙë/Ä y–èv{0›Mhš†ȘȘ„B!, ÄÇÇÓmšÔÔTZ[[Ùčs'•••$$$@TúçqqqŒ=—Ë…ą(hšÆ‘#Ghnnîœ&!!șșșÎhšÆŰ±cŃ4ŃŁGwö„WUUU ƒ„B!TU°wxŚuê:Ùlê\ÿ«wQû©‰ß“Óéâ©=ôŽÍ+ șŠ–dG"cFwż a”Xžï‹wwîïŻ^CtT$cÇôłâ\Ú+ÎF€ęïŸÎŸ7n¶ż¶†Ł_žÊC~f§i4ÛÉg*‹§§`êætĄy*YÿÒKŒu°żb!vX*ŁÓLœ'(ÊÛÉkù‡9șâAšÏE ZóQ]^‹Û­RRí†ŃC4îƒæŁtśVÊcg0/3L!„B!.I 3'‡“ČÉɱƒ­^ffRÏäX ±ú€7:O #Igàź;’±ĂÌ)†ÿŒ Yù_!Î`H#”P(D Đ>@gÏzÜááádff’““Cfff·ŚÚÚÚhnnfûöíÄÇǓ““ƒŃhì¶'$$““ƒĘn§ĄĄ––rssÉÏÏ'''‡œœš­­%77—ÜÜ\v»‰'ÇđáĂIHHžàë~j}ĄPšß^? ĄĐà»”?śâ«xœŸ~ƒöç^z•üüÂÎÿv$%ò”ŻÜßí==ś7Ț^IČăąą~¶ælÚ+Ά±sçâx5U3ióg2òą§ąą_Z3û?|—wu70wZ æK(­ULf_ˆ˜IŚqۍłkì“C4z‹??ł‡#«Vł{âç˜iżÈ WÂčbĆçá˜Jæ”èĄ čœ…|ôæÇÔ.Ç\ ۅB!„žd™3Âč!ÚÉc”­Ź<Ă€ÔîżȚ”Ö6Ț9Š‚1Œ›s (@X‚Ï]űÈèČqùŻż‚Hâ$.€! Ûœ^/ŃŃQœ^ gäȑ̙3‡+źè^ndŚź]lÙȅíÛ·Á` %%…ŒŒŒnïKHHè,“——Ç–-[8tè šȘÚÆŚÖÖrđàA>úè#âââ˜;w.“&Mb̘1X­V,–OŠGdttMMNŒ^/aaaŸÈ2ÎDŐÔAœoíúMÔÔÖpę”WśŽïÛ°[ĐP]SËÖí»z•бZ,ŹX~O=Ó>Èêëo­äŸ{ïŸ`í=w șOS Š(ƒ őt$æÏlZò#üaÄÇX/~dŃ/”é({K‚9đ{/:}< ű.óô†_&zbrźbɈ}ŒxŒ˜‚ •™c/ț‘eŒÜ3ŃqhŽćâšb‡ČB!„Bˆ,,ŸhäÉuVôóŁÔî„dNiełÂÆ…s­@ăÿ+âîpó}™<7čËUx ÀȘ5'ùß]n6©ĂM̘ÉO–E2= ‚•'™ę»FòăŁYśßqLëèźč\ÜđÓ:Öźù\oÎÒw\Ûkl{œŒkÖ™Č<uWûžvooÏçóÂyùś‰ää5ò•.6ŐiÌș%·çĐi*‡w7òËu-lȘ á3ê3ÊÎŚoˆá¶dšÓƍ?«cœ.Œżÿ2™Ï…wŸÿ–ŚÊžv}W cÏr3+‡xęN7­jä߇}”x *ÎÌÒÙ1üt‘­{Y]M%ow#?țš…­”!Ž0‹æÆòëàÌńĄ©äpò—M-Ź«PïWˆ73gj žÖÆéŽLÁàóòϗOòŰ/ĆnˆI°đ™ĆqülŠ™ˆ.›ÉÛäáćÍÍŒyÄĂŸÚ -šBb’•Ï,Œć'3Nż7Xy’Yżk‚„©|8ÉÇïW9y뾟úŽŽô0ž1ŽŻdê»?]°jużĘá&żb­ÜŸ4ŽïZœL|Ź™1·çœ]žH`ŸuòûycőIÛçápي_Ż#%É’I|ua8ÙŠÁlÌO·! Û}~?6›­ŚkFŁ»ĘN||<Æ ëöZee%IIIÄÇÇŁ( ­­­”””`2™ˆŒŒ$22’ˆˆ, ‹…šš(š››q8$$$đûęTVVČÿ~*++ńûęDFF’€Ăá %%‡ĂŃčÌ`0xÁŚßfłŃÔäÄçś_ü°]Ü}»’ÒR2†§q0Ô&§«Ïż—–öY—ĘáHböŹŹÛ°‰’ÒČ ÚȚy)_ś țû;l:ZE‹IÆÔkűâ·î&,ìÌńtÈUĆUïđÁ†]È/„Ș±żÎFLr&“æ\Ç=śßƜä.g”.5àőĂżÄë|•đÿÉ/Źfë‘Ję&âFLfÉmđÍ;ŠÛë[RŁőűZž}æ5Vo?Bq­ ŸÎNRf󯿃û>w%ęŒÜĄ˜ÌpbÿûûÇxmk!u+Žì™ÜtÿĂ|ui§?qçZë4o û6lfóÁă”Ö”àŚ[‰ŒŽeŰÈiÜpÓ€unŽÎă»űpĂ>rKêhrчƐ6*‡ùKæ1=ÙÚęÆ@šœ7~ókíŚńó‡ršÛűî, ô€ŐEjö–Țp%cužŠvđțÚ=*źĂćŚŸÆ„čKX>7Ó»SĂœëß|ś…rf>ű#VŰòțêmì=^‹Ó§Çž˜Æ€yWsÓìTlțZö­[Ïú}Ç)?éF5G2lÔd–.[Ä€ű>N—j+EÛÖłzÇŽW7ăU,ÄŠd2mÁb–NNÂÒeĆÔúMüá7à^ô?] ;?ÚÀæCÜhò‚9Ljq,Xș˜Ù©ÛCsqpŐ댶ćő -ÿMŸûđ›í3Ó'sÓ}ë§vTÆümŒżn‡ÊêiöëÆžéóY¶p ńœÆ;ŃTžś>ȚĂĄČZ"’2˜¶p)ŚĆÎî†KŻ œƒF„]BŻO…~çúIìŁ č/üšGw˜zïÿăIŻu=ŸŸ6‘ŠmëùhgÇk›ń)VbS2™ș`1ŚNNìVČ'xìm~ôèvZÇô]Ë^­^Ëoț°†ȘôeüüáyÄyŠYęâ;Ź9\K›ŠŃöîŸyđĘöśêąçđíŸȚÈšS›ä,Ž#ÒX°ƒŐśs€ŽŽ&wĆl#&!…‘ŁÇ1oțtF ôAÀɱ}{ŰyšÂČZN¶Àl'!-‹Y‹Żbqvdč)ʱ–w·æxm+AƒGæxźŒf3ŒÛùĘÖążț[|I|·xš§†}7±ń@ -ű0•”NÎôč\3g$1RČJ!„B\2ŠM'}C…ZÉ»ÎLΩ·ZˆxhCÇ”SÈïï'wĐÏ?ț^É·†°ÄXžr‚­‡ ›êŰVàoĆ1;ÉÆÜÈFŸôČŁ ŠuôÎqșÙ4ùZg…cPl+ Ò™ŸŐÿ5› °{K?xł™RUÁ€W°ÛtèPÙęÁ nxÏK«ÙÈì±aD{ęlÊmâŸc^꟝Â7aŹÈÒ±>ÏĂÛGBÜ5Cúz=èćCB:˧š9ă°zięŐŠîÿS-Ż5AÂ0+ŚT(/qóÜ[Ul­u°țÎ0âÚ/ź9¶„šk^vӀB|ą™ cˆ-VłÌa\ùMeû{'Xț—fbbŒd†…ššó°ù€ÖíúP!Àsÿ:ÁîcRÌLhós°ÚÍϟ ÚÆóÓOܭǜüàĂVüá&Š #ÒçgKQ>ç„ڐγÓșl4ŠsžeŁ›ę:ăfÂê}kæż  ü`_=ő”â+č{Wą#=ÙD€ÏË#ÿ<Áź‘:šzFlƒÙg@ òÒż*čÿ@kŒ…9ăőš-AòNŽńÌvw,G qŰ ŽŰĂÙ5#>>žńăÇc4q:(ŠÂŃŁG)--%;;›ŹŹ,ìv{·Ò4§zž«ȘJUUŠąPVVFyy9šŠÉüùóINN&++‹ˆˆˆ șź}9”Ț§¶ĂĆ€Ó)ƒ °ÛKó”SRZNuuMŸ=ÛÏÔó?9©ïT=^/û 2rpÛYwAș)~ù›ÜöłMÔw–„i pó üpï^Š0ŁĂOï>ô!Š_ú!_ùS.țn›Ź…șâŹ)>ÀÇïmäg/>É=#{ËĄÊÍ<ółl|}/źÎ™ûšÎÛÄs?ßÁÖą'xë§ł‰ì\Ć%oÿ˜/țä]JŒ]ŰDĆáMŒpx3oœč‚?=ę3źMîë+VAsźă‡·ofcmšăq(??äŃoìâÀÿÍ3śdù‹qÔŠ\ž{ì¶ŐQŹŃ€5ŰJCí Ž”æł›ÁOÙșgydćqZt6’32™ĄÇ{ȒcûÖńôÁƒčë>î™Ęë .TwœžÛŽ<…ŽÌ &€š/>NńŸyąÌĆĘWyïՃxâÒÉ=Žáî cÓëeT⻋»ÏSóRŸûmțzx? ŃéŒ=ŽôÖ* ŽcĂ«ćTč—3æÈ[ŹȘސ>2ƒ œ,9NńțulêtÍvƒF쩃óŹŽ#ÆĘ/ńÛŽĐlŒ&3{<Łl*mMTWcÛF9w:#hZ°b ÿ~i a ŒÌO¶]·Ÿ„ÜÂ=ŒqŹçWżÁ­Y]njmyăï<Ÿč– 1’ô‘cI0hŹÜĂóͧ`Z$ő*ô<ă«M‡yáÉWŰRÀÊÈqñ†Zš*9Ɔ7óÙ}àjŸöàBF\J”‘„B!Ä4Sz87Ä6ńښ6VVƐ3ŹŁ_u››· U0‡qó8}żŚ 'v6đÓŒáYqŹy(š &@ òÆ3|aŻ“mŽ`íUfdêűû^ÛJTŸ«4¶çyp›­,IöČț˜›œÁpź4€ÖæeK•†.Üʂ”~?‡|üćM?Ù3Ù|“)áĐBŐM|çC/­ö0ꎃ/Ä·P)ÚTĆŒWÜüæn}0‚ë§Yù~^›ś»iŒÂNlÇâü„­ŒŚG8+†čűÊEYMćę• ŒȚ9‹SXœÜJ”šÛÍwÿXƓÛűßÙ6~Ą yÚűő*7 èčæÖaŒ°À„ đÔžžç/uŒ«Á@ő,•M<ŒÆK‹ŃÌWïKæ·ă @›Ÿâ ‘źłôł?ÍÊ_Äqe8íAęە\û±¶”Q=-’S»0nb4OÜÍÌ)#«+™»ÊË{;Zi˜ÙíÆŽ§ÒCÍ ï 'Őű}üń‘J~Väćß»}vVÏđUĄgämśrőÓßc}Űd–\=‡I±èj·óÒ3’ߊą6nçϏ|Ìòż,íöHÁBVŸ ș°4f-˜ÎpS»Śm„šYEÓü”Œú$o~i&śk_Ç@ȚS<ÜŽ+˜Æł`vöÖălۜKOĂ}ìuŸûí Č^ž·ëĂŰhÆôëf0ÂXĆΏwRÒŠ‚ÚÄÖ?ÿŽW—üw„œă6՚Űòòl«W‰›¶‚‡n›Jò©°LóÓÒáłö­á©•Çi Ïæ¶ŻÜÉÂsÇ)]„9ÿyz3;^~áiś±0ź{{ŽÖ|¶•OæK?Œ…é1+é+çíżę*vńï—-ŒŒöA~rM¶Ž Čùà«üæ™}oȚMń‚e=¶Mˆòœčd.ę2żZšÖ^Ș4îy‘ß>—KáȘ—9;‰/ęšËòüUŒÿŰŒSz€u—2~Vxgûk6œÆË‡\XF]Ç·î›GZÇ6Pčüë//ČsíŒ?ț›ÜœŃő4«8Ÿ‡}#–đʇ“y*V[8űòă<±Ł‚7gńÙ•(Æ]č„Ń%^ví*Ă7†«—Îèu|ÊÖòÌȘbÚ"ÇsÏŚngö©ȚĘÁ6>ę8/]Ă ›Æđ_‹Û{kM{xù­#8•fȚóŸŸŐŃ+BŁ­èCțöäêÔóÿržŰÇÎJ]BS}Ź]È}Ô?­5Ÿ-Ecžę»wȰó©”ő;^àś/áÈڝ”Ξ–Œsü˜(aÙ·4š ŰTĐJäšY,»șÇ  ł=ŽÔ“ìȚœ‡KIáŠo}…ë“»ì%ŐMmŸ˜ÈŚȚ1ûšF|fa Qłț)~ęv [¶äscքΜȚ‚5<ż„– } w>t wn4Ć=Ë#ïÇŁő8iMl}ùu¶Ôh$Ïû/MÔ©·űjÙôüÓŒxè#ž^™Êߒ5à[!„B!. ƒ™ć<ú±Ÿ•‡üü`˜=ĐxŽ…M>°OŽsM… Ž «v»iÁÀ=ŚD”‡–ЁŻŽ“ŸŻ‰‡ĘT/‰bf¶Ë^7»‹|ű§Y1œŹ- ĄO ă‹Y!6Źń°ĄJăÊ4O©‡œAÏŽ2} žsš†eD/ßAfÇï}Łą‘»·……Q‹bű\g‚«93ŠëWčy±°ÍŸVP8)à IDATŒ·łĐÒÆȘÂ>lłsg8€ÆžmTš ŠÚsŠë€‹”țž6^:D3‡ńđ5íA;€błńć™fžzÛLJGüü<ĂLàx”!)’ŸÎ5u>éoMŠà‡łŹ^íhƒrh_+ùAHšËÏ;‚vc˜‰ìžoWt\}U4 ÂOÿśłíäŹóq ÁO™ )§źÌ–w‹ÎFç„1ê]/yÎ ŐĘÂvEoáĄeA;€ÉÌfYűu‘›Čú !ÌĐ8x°R’§ÇòșŽkd…SăxxK+ßîZ zĐûÌÄ0«4ݟ%AźÛŸ-“ }ś·ę4€ƒCç¶GDD––Æ„ 1b:ŽŠŠ öïßOii)MMMhZśŰÔfł‘œœÌ۱c7n6›úúzvïȚM}}=6›qăÆ1vìX’““û,msĄu†íĄ‹¶ëőƒÛæV‹…»îž§ÓĆÓÏ<‡ÇëíőžŻő&Oš@Æđ4fÏœÎŚżú@ŻPڃöSőĘ]9ŸĂ/h{ÏL„úĂwŰÖÚŽFđùŒÍëÿžÿ}ì9ÖŒú-ŠZÏŒ %új~öÚûìXûęуÜ{Ç-ÜóÍÿáŃÇv„’*­śSp†ûŠ9‡‡_z‡—țö+~ûÇđö#·1ŹăäȘùó8˜èx§—­ÏŸÈáŽíúaŸć‰w_áÿțűkțüäË|đű-€ë4Úöꋧ·ĄČ˜>•;žx“Wțö+~ś§òî3ś2ÚŰqGȚœ›·ŚTőуpÔȘ=l(đ@Ädn»eÚé @1a7u”AńphÓê4YWĘÔ%hĐ1úâ-a햊Ț·~#]ĂŽ˜.!ž9•ù3ÒĐș˜i,_r*hPˆ?ƒ)Ń:TW Umœoè"'rĂâŽ.œÍuÄLšÁ€ŁŻșźûòLæÍŽ^ Q]Uz›…*ŰŒčż.…kVÌí HtQăčńÊ4ôZ;w”—çéȚˆXæfáé @g'çÊ©€è5ÚNœ aĐ;ÇÏŃÍ»šRŒ]z#łș–Q1Ä1ïÚ+HR”îÚO„  Ńp`ù^°Ž»ŠŁș<~š–č˜›ŠGžÿC Š^ß -‚éŚÏ!í,êÒ\°}4EÏđ…ËXĐ”üzâ§Ïej””±ŠÊ>ŽĄ êŹŁ ícŠ+èzžu6“ąśÄŠÉđŹźA;€žÄIăIŚiêê9yjCjo?HŁf$ëȘ›˜ïèČĆʈ%7±ž'lÔê=Ź/đ DMá–șíæDæĘr5ăÍ »¶°·E†#B!„— …ÉSÂĄÓÈ?ĐF h!ÖìśĐŠŽESlDśO„üȘÒĐ8¶§ïœVßùï‡[œx3È â2mŒŐA]±‡"‚ŐnÖ;!5ĂÊąL ŃZ€…AT4rypą0%ÛÚ^Ve€u˜>-œĘőæp„Ÿà-oæ‡]Úőœ·[ÈŽ`ŠfPÂÂX1F>ïíxZŸŁ„Œj0łbŠéÌel.Òúë|őƒą òÁ{őʖóxa Ș“AB@U­Ÿ6 "Ò-tJLatš™ŽÖ(š BaÒH+Š…:#SR»?ę łéˆV@ j=*&œæó«4”…hTi/%ȘÒ+OĐEš™ÔŁo°=LI@ëžÖ8V €(LaéȚ^EÏÄ4CśkțłŰgXl<ŽĐBxĐÇ㏕1ù‘z=ìïRĆAÀślżpuž/oC± z=ŸȚ1`ŸFd çæÏÜÀoŻąșŠ–§ŸyŽ/Ę{w·0œ}àÓț{©żțÖJö8ÀäIXŒpțY”śüÈË- б© “năŸ™'?sÖÍÜ6ă1önđž±w{üđŽ^K͆A9LP­”•Ÿł9ÓôÜ9æôö Ÿ6éa/SŃŹ „Ć˜!TȎ=M'H=ËngAÌé;ÎŃsïà3#ßàŻ!POČ}kÁy{}őŽ…,Ÿiï\ż°I·sëÄgùƞhA `X·šÔƒŁŃZZFȘ`5Ž1ęԍG­æX©M7Œœ±Q}ô66ž“MÌú-œ,*Ą^M'©ë_‰edFdéìá(Š‚1-Žž+ź„ź€ÓŻŚÍiCÚFôŹCȚ>MK™Ă{öŠV°ÚĂ1*>ŸŻóŰPO–pŹIEIÈfl|ÏhZ!:u‘J)źȘšŽŹîwąmŒÖûxV"#‰Tà„Ï;žÁYBUyĐtĂ?ÚȚkë©€šjȘšòAš5@EY !ôdŒŐ«î8ÉÌJĂžŐ9ˆç^Î@u±ś•çYU"iî nŸ0žžæí.Ü>xQ1dgĆôŸ± Ű‰ŽP Ù‡Śƒű%{ÎÎú8ÒĆ3ir2ŸWÉÊGțA㒅,șbÛyÜŃT~?AUCÀIiŻńŰùí ÖPTÖń9ÓóóèâÉΊ@wąčëLi)n?OXłÆŐljF±fR†žÜü2 JCÌÉ‘ç …B!Ä„Á˜ÎM NțXĘÊʚÆDșy§@k87íż„ šŠËšA¶îpČ”·èC~@oen ì«ń°łMĂTàæžŠçÎl3öá6f˜šY›ïŠa‘íĆAB:ół wŽR &ŒG;5•f/hh”æčx,ŻŻ†iűƒŽśÌžFôț6pÓ4ĘNxyï5‚i„ćńCżțAŻJ‹ȘÛÇë|}6%Ò Ż=„ްézm;œUGĐoßvM„ŐšąiSŸŸUôD òŃĘș"'żYĘÌ{E~Ș|]û śu…€Xőœ«)ôŐ^?h(DőêTȘaé±ÎbŸŽ™ËRŰ8ʉÿśź“śòüWŸ“_;ìüèÎxŸ6b€ÏLj!œșŐTčőCł zŠÚ “©)“'R\ZÆț‡:ś›?sCŸ5Ü{òxœŒńÖ*òò HJLäúkŻt[„œœçEsÓŰt*ˆÓa1ąG°k'--Ő}†ŒîòMŒüì›|žă0Ç+Oârû©ZŻ`ŻïÍ©#ndfś»ß:+6‹Íí'Žöy)ĄzȘëNzR‡ë~ÇX?ŒáĂ ŽwĄW©­Ș%DïČ.1čûúéHO” ì  Ąáu6ŃŠÁٗJÖhv” ąŐÿ@šĄ\­Š.’˜ÈŸśŸ.*šh]N\ZšÏ§‚ó:oX­},ÿÔŸÖńtKśé­ö°>NzJûTŠ…°>Ÿnè˜g—«:8ŐöA1őÍ”}ź€ÎçĆŚŁŠ={_›C9œœÁ~.Q›ilÖ TÌË?û/Ÿé}zŸÍ­A4lÄÆXúü4DF`WÀ9È&tŁ”räÍgxfwö‰7óĐgGŃÏžĂ}șPûh@Šš>íÿșÎț8Ò3ìȘ{yŰžŠ—ŚdӛÿbÓ»‘dNœÎ• f1--lPO%š-el[ż•GJ)ŻkÆê~.ë6””ăsALTŸ.vș‡íźæŽóDLƒ­(Vbą- yqșÜhDȏ2!„BqiЛùÌD#ùĐÏû‡ę<ŚÊFDM±łd n͊Bž ĐŹüéÿ ă+1ęœÙ̂L=ìô±«<„źĐGĐÆâ ŠĆʕ© ï•xŰÚŹcw•†>ÊÊü„țæŚaæö 7Ț;‚—Šőć1ÚΔá-ŒXĐÊǞpÒŽRŠ)̝NZ?Ü/ÒúëÌ:l 1lțQ,ûY«čęŻŐŚ;Ă! ŃwTßutŰÌ͞Á]#fŰAOÉI–ę­‘#š+çÆòßY&’- 4·òęç\ë«)ƒYșąĂfjoo‹·g{5üÁÛáŹöYûüGOŽććIŃÏkæo4ńïâ~ű„Jԏ“č;j ~úIWČÿPFƒEQz•Ûéϊć7Ćș ›šź©ć©=Çì™3˜=ëŠ>KÆìې”6uÖhÏžÆ]wÜzÆśśEQŒ†óíÙȚ=ÀÔëzŸ‰ugè=ï9ô$wáö6«í1aOL%>܄ꭖąê–KWŰlęuïJévRîœwzÇû}íA-"Ôă… uOgđł9Z€ïtôwćìËű+èőęĘeÄêS:nŽèbF1JòëM+Ăé™ç*:]ÿ7)ÎÆ©›4șx&^9źû –źt1€›;'ÎXœKŚûnÿàÚÒÆŃ·ŸæÉÍ”XÇȚÈ7îžFÂYŻèÜG.Șÿă돩*gęÒčGJ#ȚΏg_MáŸĘlȚ±—ę{>âé=›Y=ëfșuÂéÁWûZdÓžțË«ìqêI3ë€ăˆ¶a1èÁ“ÇÏląŒû§™Ÿ[‡^ŻëőÚ`6mû|ć 7!„Bq©Q˜0%œŹÉ=ÒÆk1ZĐłbȘGśÓ›ÈIRPŠęl- ń`LÿŚ7Wd[°îts €Ê5,6æYĆÀ‚Ń& Ć^6ïѓ뇹‰6&ëĆ€ą06و>ŚÏță^<Ólô›RXŹŹÈŃóÒvk Œ€ ą­Ü:i€žőięőńfÆĄšȚËLŒ>s“ FÂ/źr/EȘ­[œùòj?-\Ł+ŒL0 Ś,òâžaž”Ì€4öìn&/#%ńÆ kçő`°Òsž™BVą}n€Ăe>üWX9ęđžÆ±Ú`śNŠg”Ïș.FÇȱQümtă)ăۅ֔hÜ=YșQ]–a{}}=”””ÔÖÖRYYI(bì۱Œ1‚‰'âp8zՁwč\ÓTWWărčHKKă†n -- —ËĆŠM›p8$&&’˜˜xQI*Šą`2đúżč‹Ć çăHJ䍷VâőúX·aÛvìdì˜l‰I8‰45čšź­áh^AgÈí5ÚÏŠtÌ)&ƒáŹëúśąŰˆ‰6ŁàGCĂU^FŁ6›ÄÎÙz©©nì$k-|üČŻ#hŚ;źáWOÿŠÛF…Ł|«żÍÄŻ€w€ŒhĐÍŚ'‘’€ƒă! DEi!ąNPC'(©8UàAG‚#ĄÏ±ZUNe†Ÿ:C‡Ș(*őtÄZ ֘˜>Jˆ †‚ʆ gS3!’ÏüE« :BAs:9éT!Ąś;ŐŠF5ĐEŽ—Pč\è""ˆĐA‹9•yËź&ušFżĐۉ WКíŒY°”…ę°bŚŁàÁćòC?Ż4·śY‡Æmäżó4OnšÁ:öFŸw)ƒ*~ùPèÿsŹčÛh;ËyžÏq€˜cȞu Ùł–à,ÚÎ+/|ÀŸíođRFÍè]Rš]ˆąő«ÙÛ€3óN~pǘnOhźșöڀĘFD˜‚Ö҂łEƒŰžoĐp{Œ=Ν ‘Ńè•Zœ'}Ÿ'47'›Œ ˜ˆŠŽJŻv!„BqI1€„sSbż/sńxCÂì܃m~¶Ô)ÌË0vœ:æO 'i»‹Í;$Ôk„¶s}Ä„±țŠÍÆ]őŒ·ËÍ^q2ç QŒ?•Vk•e^\ńVƅ53Œ…ÖȚ:áâ;ì<3ۈđlᷛŒ8lŸ41ŒôőNJv5đË))ürŽŸ=‹ Ù}Bcâp#=«Ą$ÒĐPłéOœ„©ìȚĘFÁyőIR˜4!ŒÔuNÊw5ò9É|-č}Ł:‹›x䈊ÖíńûłŰg?ÛJƏ4v)gsșôqÄàûŐ~Ș iŰźètçTB„ĄĄ#GŽpđàAÜn7‘‘‘Œ7ŽŰŰXÒÓÓIJJêÎ677SXXÈĄC‡8qâQQQ€§§3aÂ\.N§“ÒÒRRRR˜0aV«őą…íJœŹ/łÉ€/<«ȚícÇd“ìx€ŚodÿCxœ>öí?êóęĂÓÎj0ÔźEÁlș‡©‘ŃăGaX藀ŠŰóÏș‰ïMlżŹ|Ÿ7¶śQŻ]­§ČêTH­#váíŹèÚ!DéńR‚ČcŠ~$sg%òÄń*B„(}ś6~q<‹c@ŁiëKŒSÔqRĆ3Gś¶7Źç•böuńèĐhȚę"Żî˜N1’=>û?ü ‘é©Ä銹+<Ê1ßhƞ©đ»>™ìL+kwŚpèHŚ$ÄöԂ”æĐ€êˆ‘AܐŚ|vtńdEêšŹËă`ÍbRû ò‚Q:z «jï›AúdČ3,lŰ_Ɂ#Nźœ=@hi 55 Ęț ŠòKđNÛŁ7uˆĆž”ł=[k#Ő?y|}5–q7ńÍ{g’ü) Úł3ĐìńໜȘR_VIłÚû‘>ÒțÙUCœżë.Ìq€'*s.ś,+ćđżPYQ:ĂȚśEÍGm] ȘbbdNVŻ?Ą†:ê{6S—ÄđTÊá*޶ČxV _kŁŹìds§BۈL†éŽQZx”|ßXrzœ'Žæ|–„À8‚ŹôËòŸżB!„ű4әűÌd|ßÇ1?ÄͰs㠃Äԙ üîp%ß8ÔÌœżlă·©&RLĐÔä'ż^ćŠ[‡ó^bûĆșh+óâ¶—{9Ź3ńƒìÓ=Ǎi6æÙœ<_惕YçWېÍŁËÜ,{ÛĂc—òșĂ˜đ¶ÉŻ àÉqpâ~cg mÎ Ń.țqžjMÇ”ÓÂșG6€ëŻèY¶<»KkxöP=s~ìdBȘ‘U„ŠȚOa‹‘ïÿ •qa JX8?ŸÖÊș7=ŒóBc֚É0©UˆaeX“‡†ÖɒĂçžčs‹ż=RÂK‰&R Őő~œŁ)ùÊÙ†í “ÇۈÛÒÂá”ŐÜí”3=Lăxa ïÔëÈŽÀńłš_wæÌh~>č•/îsóę?”òÂp1țû+5RőèOtżđì>Sü^țç‘Z6ÙLLI3á0CC•‡­5–äHîΔnTpyÊ'ČđÁ1êC}}=čččŹ]»–œ{ś …7nK—.eÒ€I$%%Ąë`»\. ÙŒy37nÄét’žžÎ7ȚHzz:N§“7Čyóf qč\gXú…wźÛá|™Œ†sź…Ɋć7ò”ïcöÌé$%&v{=22‚É“&pŚí·pßœŸ?§ Úk”›Œ"ˆŃ‘rő2fv 3­ùóxâóŸćźoÿ”~śA–}ölìkűd],‰ńÆÎr(ÛȚä”ù/<ÀGOÿŻÿ=ĂÌ–‰éś|‘5#B•oò•e·qÿś~ÂwŸzŚ}ć5ÊB –qwqïÜ3ÜŚVëxś;ŸćÆûżÇ·żțyźżÿyŠ:êÊ(a3X~uÒ9űuĂŠ1ož Íč—WȚÊćd·  ântv kb܂™€èC}ô6Wvœ™ĄÒ\đ!/m9‰fJcᜮËë1ĂpÌOĂ€VóáóïqàdÏŁ@ĆS_F…ëüïÄè""ˆT TUÌ±Öžółłà ’tòß}…UÇZz9l«„žș­ó†QÂä)d™Ąuÿ‡Œ•ŚÚ-ÀśŰÆ[[ë_*HsS°êŸ<Ÿ¶ ëűÏđ­OiĐ ‹O!ĆŹ Vf_mś­Ź”äóÁ–}Œś #<ҎAŃš/*Ą±ç†=ÛăHkŁČèÍœN:~Ș*ë vÔH?ă7Šb""ŒB€“'›»ä6ŹȚß»Š‰3Æa'ÀŃßcOcŚ” ŃxđV{ĘšÔ%LeqN4ïçő·ÒÔu2-›_ûˆ#>…è©s˜Úgí|!„B!†’ÂŰIaŒÖŠžk§X±vRœ‘/ܗʻ·Dr”CĄ¶ÒĂÆă^ʂæÎŽá«Łő§ŻÇu&ælÿo}”EŽ.żŽhï|eˆ·2ݟR)ƒ]§IW„°ù+q|~”„ŃËŠB/čNÈĆOçZșÆF++&Ń©!«[Æ2ìżH믋 ç±ï ăń%áL WÉ;îfs™—ÍÌmWGscìéŚc%óÁ]Q,NÔŃZçă°Kaî”ÉŒû@3“’+z–Ț>Œ5wFq]ȘÀI?č5At±6îžrnODOLàÛ"™c±zĘI~ùq G푌đŸ—užq­bà–ϧđìŐaäŰTò‹œäLÜ{O2żÉîcȚƒÜgŠÙÂí ™dSÉ-hă­ęmôX4?žU_ܶü0€ù–Ao  ĄiZŻžè‡êêjòóó±ôšï]VV†ßï'&&†šš(’““q8$$t)âTu§ÓIqq1­­­„‡‡“ššJJJ ‡ƒ€€$)))€ŠŠNkk+ǎ# ETTaaaĘæĘÚÚʉ'8rä^ŻśŒë˜ŸŸOuu5ٱ{ uȘGčA?t»Áb6 ©gĘ»ę‡#‰ë1HêčP‹ùÂ%wș”›ùïoŻáö_o§Q”­Œ­+Ëۊ‚!iw_[È Tt̔ß±Œa^§"€,]Ə>·Șă51S0­d{z%TçN?üvțü?Çù·_!ß­áŻË棷r»6 kÆ üúïcl?›G 4pxę»î:„>–ùßû>·8ÎăÄ­‹gá7pìŃ·9ží~z8‰©ŃX5ÎújNxÇóĐ/nfŹ ©‹űÒòüć^ÿÓÿ°md©‘zŒ'+((iÄ«aúí·Č(ń2êÖ€ǂ[č«ü)žĘż•'~}ÇđT&žiȘ«ąŒ.Ȕ/ę”û&œßç[‰ËYsšNqŽÌ…;„Ócúč‘f`ÔSHÜł…ąśțĆ?Zg1!Ʉż±’ÜĘû) ÏbLÔaò»MŁ`Ëč–;Š•ńôž<őû 6Î Áąčș„ŒJŁF'ĐxŽG_ĆÎô[n„žîyÖo{–Ÿć„‘‡UmĄȘš˜Š–¶‹ùÒMÙŰ$kB!„— ðXv=ÛÏ;nŸ$7śő’ȚÀü+˜ć@KQXtG­wôő’ž;Ì€Ż—Îș=]Ț“1>š'Æ&čW˜sËpZn9‡ć]€őŚ…Yžçłîùì@‹Ń1iv<«fÇśzéÙ?g ÔÈÎöL›Ïkszσżț6‹żö5©=’•ëQ=CŃ1u~ö5êmő6 ‹eśŽEóÄ$jë#—3šX~S2ËoêúGÇÛÇ3ê{ŒË5˜}f0qÛÍnëÿ û7Ža»Á€Ïçë3lomm„ššœ^Oeee·ŚE!,,ŒYłf‘˜˜HVVŃŃœOuuuPPP@ss3Šą““Cxx8ŁF"±Ł7vbb"&LÀb±ĐÚڊȘȘ8p€ââbČłłÉÎÎ&##ŁÛŒ›ššÈÏÏ' ‘——wÆu,//§ššˆÖÖÖ^mì Û C¶›ŒűüAü Û?ûB0ôXLțʑQś<Æë‰ÿàÿXɖ‚Z<ÆxČg/çá=ÈBŚ“ìXó…ĘÓv"Żü />áàOŒĆæŁUŽšbRG3çŠûű֗fQś§čę™ò 8̟ž€%?ăÍwæóì?_æœÍ‡8^ÓBÈIRÆxf_ł‚/Ęœ„Ź3]Ś'±üwàȘȘ7xvćVr˛đé퀌ĂòŸÁƒKÎżč!á ü^Û7ncûĄb*ŐáQ „Ç$1aÖŰ.uH™śÿÙ»ïđšÊôăś™šȚ+ Đ{GȘ(‚úł,șâ"šèȘkÁș«»öź«.źûZqYE”Ș‚ Š‘Ț[ „„’Édæœß„0 0IÂśs]zMÎŒóÎsNf&zŸwžs„ț^oĄŠ~ó“–nX„ŚIîˆ8„u:S}ôQ·a”ł_ł=^=źŒYőÛÎŐÌùżjő¶”ZŒȚ”ÍȘŰä4őÜVœÒ«!]6âÔwä(•}>Uł–oÓâŸv(,6]ő+ŠvȘAżQúGĂEš1{‘–­ÛŠć;JeÚ܊ˆKVł3ș©[śäJŹ]©œGêońsőĆÌEZŸe„np(*%]=.»Lçu*Ԅˎ!l—ŒEûä”$É«ÜŹíż š+8ăËżíP›9ŐdŰĘ3C_Í_„Ÿżžąùr):)M-û\źQ}Bô͓ŻkÎa2"ÛèŠë/VŰgßéçM«Žp—[Ń©=ŐïÀ€ăyqêtv_íța”Öo^©­«ÊdÚƊŠOU»gë읕ń;«ÄĘM‡èÖk#ôÙŽőëŹIZìw(<źžZużL=3][Ț_ŁŐÛ߉huqƒą}­ŻæŻĐÆć?kœ#\IZêÂÎRë-èÁÒáMtŒÈæștìMjöí,ÍZŒV«—n•ÏȘŰäLő;»—Î镩ű:úMšq,żVïôË2lJ޶ŐÎ,Š0Ź]Ò\ róò”ż7_ő릓ËćÒ·ß~«É“'ë‹/ŸĐÖ­[„èèhEDÚ·U«VêĐĄƒÚ·oŻŽŽŽŠSĄ“Š IDATq‡Ż>Ÿ7ožæÌ™ŁÙłg+$$DíÛ·W‡”™™©èèèŠÇćçç«  @ùùùZ»v­–,Yą„K—Êăńš_ż~êÛ·Żșwïź/ŸűB“'OÖ€I“TRRR1Ghè‘ż0RTTT1ZZšÎ;ï< 6LgžyŠŒ^ݶoߥè˜hĆUqČàTń–ùTXì‘i֜4Ìf3RM-d'‡©ŹéÿÖC“wȘÉ%wéöŸ1üSY©>_lȘS‡P„UŽv±Žci¶/ĐzW„Æ?˜Ș?Fmœš &™nŚțßxqq±\.—Ün·ąŁŁ•’’ą’’IûÛÉž}€išŠ‹‹S‹-”––vÄùœ^݊ŠŠ”››«žž8EEE)##CmÚŽ9d\ttŽąŁŁ•––&żßŻ 6Èăń(77WEEEòzœ’€ĐĐPĆÆÆȘ^œzÊÍĘż†łššHEEEGĘO—Ë„„„„€€(::Zn·»bż+‡`q9 u»Tìńžp;™êd†BĘ.‚všéŹbmڔ#ÓQ|\8A;›Ï«ÿŒżS#Ț·«I=—EÚ€"Żn.Slê=$Nޟ4AM3ôbÏËÛ«˜˜%$$šuëÖ2MS»wï>âăZŽhĄŒŒ ………uț€€$”mÛV’ĄæÍ›+&&暏‰‰‰QóæÍ+‚ú¶mÛ*))I6›M©©©êĐĄƒl6›öíÛwœ{+%&&ȘuëÖJHHŽż%ęŠ'}0„…žäś›*-ó5p7 Cn§Ca!\UjËłSkłBÔžqŒ\‡€é>eÿ8I“Vx„ˆVêۄ€t.·.?+J„+KôK¶Gł·Jv—]šDêÆțqÛŃ%w°kŹĂ‚úÆv»]N§SeeeČ,«"lOLL#F/ŸO))) ~™ÊLÓÒŸ’ÒSÖRæ@ë˜đP·l6VFš}‚Ÿ-44D‡C>ŸOŠi»œSÂ4Mù|>9ŽŽK’Íf(2Š.Żj_œq{ĆíæéőƒX œZ5ne»ŽżLhXš$içź]Aź&0ê ­ÓA;œÎjdŰ.I‰ ‰ûû·—(777Ű㜐ÜÜ\•—Èét*1!1ŰćN’¶Ûí6%%%Êî°+?ż ÖîčččÊÏ/Ęaßżö{šȘŃ °ËćRrRREà^[ZÊìÜ”«"hONJ’Ëć vI€“šF‡í’äv»•’œ\ŃRfăÆM2M3ŰeUÉ4MmÜž©ąuLJrČÜnw°Ëœd5>l—öŻpOMM­žhêæÍ[äń”čȘCy<„ÚŒy‹€ęCMMMeE;œ&Á.àXÙí6„$'+7/Où{󕕕„ĐĐ%%%Éf Ț9Ó4•­’$):&Zq±±A«pê՚°ę€žŰX…„„(wOźJJ<ÚŒy‹âââ)Ă0NY–e©  °â­N§Sqńq =e5j†Z¶KRXhšÂÔŻX枛›«ÜÜ\ĆÆÆ(**ê€źt7MSÊËÛ[±Őìpz«•aûq±±ŠŠŒT~~Ÿ •—·Wyy{ćp8”˜˜(·ÛU-«Ę-ËRi©W»wï–Ïç«Ű©èèh9”ú0TëSb‡ĂĄűűxEÇÄš°°PE…Eòù|ÊÊÊȘٰ°09†qÔȚČ,Y–%ŸÏ§âââCV°xŸˆÈEFFÊa·ŸŽęÔ†eYV°‹šn%%•”«žžDeeeÏçt:ȘĐĐ0…††TC…uÓêÛ+n7OŻÄJàÔȘő+Û«ąĐĐĆĆI~ż_G„^Ż|e>ù|>ùü>™Š%Ë4+cŰlČÙ 9ì99œč].…„„ÈÎ vÀQÔɰœ2»Ęźđđp…‡‡»@e vÔv„툰€¶ ÂvDŰ@€Ûa;"l @„íÈì€`)*ö(żpŸŠKJUì) v9@âVXš[ёáŠ v9'a;N;…ûJŽ'ŻP6»Ąšđ0ĆFGÊ0Œ`—Ô)–eÉë-Sn~Ąrr ©ÈđĐ`—uÒ¶ăŽ’“W Â}%Š’ÓÁË8Y ÐÛíRąÛ„2ŸO9y*ő–)!6*Ű„ôlÇi#'Ż@žRŻRb Ú€SÈép(%!VžRŻrò ‚]ÎIAێÓBáŸ{%Ń28ő Cń1Q**öšp_I°«©v„í8-ää(.:’ &ĂP\td\ĘNێ:ŻšŰ#»Ę&§“Ö1@°9Ùí6{‚]J”"lGWPTŹšđ°`— \Tx˜ ŠŠƒ]F”"lGWTì‘Ëć vÊč\NV¶”M‰§TœÚ€Ă0 •xJƒ]F”"l @„툰€¶ ÂvDŰ@€Ûa;"l @„툰–ÂÉș±S{uœ{–ŒÁź@@ہZŁLYßż„{FÿŸúvëą¶zšŚàșé™Ï”"ß |ú‚©ș„ç`=¶Èű\‡ńÎDę»ß­™œU@ćvŽ…©ĘÓïŚw~„‚ôł5âæQʈ,Ő¶Ÿ&ëƒwïÓÈE»őŸwŻQ ç‰?ƒgé|ęŽÏÒĐê+șœ_«,Ôłe”Ï Ô„í@5óe/Ô/ż„ÿÎùE[ö”È™Ș=ÎŐšFk`zèoÆÛl–v/xCÏęk‚Ÿ[ł[ea Ôqđęí¶ajz`ž­>~yŠvÆŃóo?Ё1ÆțíœŻNî‹tÍ'ôżeŁô·Î'đ–ö~Ł;zŐ—ĆûWÇż7ȓȚ;pŸ=UzëKĘs`Ț’_ôïQW땜łőÜǏj`‚Q1MńÒqș|ô[*:çŸúè±J0$ßą'uÎèś”Ă/I›tSÇ)㍰!7ïIí:ț’€š†°šFæîșśŠ»ő•·ƒ†ț«nj.϶őéűŚuëËôśÿŒš?ŠÛ+=}ótëcĄêù§;őtb©Vőš^țđ>ĘšŠÿĘÖ^.I2â5à–'ŐŰĘBębŒJw«qF=ÙŹ5*Üw‚­díuíž«śŒçô yê{ÛúcfyFˆê5­Toh[ęù‰ÛŽäŠ'őàĂ=Őöčó”b“ŹÂ…úŚßßŃŠÆ#5țȚ3u ƒ·7ź'^îȘï^șSăWuĐőÿ­ŽćŸ:†=I-ù@AÔTŸúŒŸÜŐXWÿç%mRŸęLŐÂÒEŚ~Šț·L—ÜÖQ»œ˜Ú»ÎĐőŸțKjž?ÔîÛ3I»—ŒŃ‡ßÎ֚[Ú«]’-A­úR«ĂŸÒż]Ó§ÿ*d/őn{‚og[Œšőì„đuoÈ0ö©~»^ê}”òŽôázì‹ué]OéŚ+—Fiț3èƒĘí4öĘŐ%âàÉ#:]]{%kŚÇ6ɖ –gôVoVČ "lȘ‹o„f}—-#ă irÈ]Ą]î֔ŸïźâA†\‡éŒŽJ«Ç]éÊld—čböš’ìUźi%‹4uÜcjŒ«« òsȔ;@c/nUțaa)ÿûguśű Êžæ í)CRÆćêŻ?ŒĐ}ę]ÿiő’FfT>àT“ŠdŸ1_Ż>đȘJú7łŽP{ČvÈŐcŒźèYuI@-BŰT#[Ê=ő~ŹȚ}éM}öæ#š[*glC”ës“^č~„zŐ;±/“ű¶.ҏ;üČü+őáęwèĂߌ°+}Ì{štk›~S»șțYOܔ«§>šźçïŸ$GxŽâë5Q»‹ÎȘcfOڃś~Șœv·jÜumZńôőôÜŁùĂïÒswœąvïȚ€akËŒòĘłęIœ5kŒšn($*F©é­tnwbvÔ †eYtYF”Xœq{ĆíæéőƒXÉĄ–źÚšfé ‚]€JÖlÜŠö-҃]F”Ąg;"l @„툰€¶ ÂvDŰ@€Ûa;"l @„툰€¶ Âvœl†ì”«‹ya;N 6[Ę{ó”U]ÌëÛqZpŰy©5E]ÌëêȚU0 ŁNŸ€ÚÆa·É  P{9ö:Ù š-l†!§Ăì2N ÂvœV\Nw l†!—łnía;N3†aÈírĐR8…v›Ü.Gls€#ŰÁàtŰć°Ûäó›2MKŠe»$ N±†l6ŁÎöh?a;N[FîàÔą—"l @„툰€¶ ÂvDŰ@€Ûa;"l @„툰€¶ ÂvDŰ@€Ûa;"l @„ípÌ,ÎS7ÜòȚYé/ßæŐȘ‰Ï趇'hQĄÔê<Ž`ÔEVén-›7Oó–źÓŠ{UXjÊĄűäújÖŠ«žÙJIŒûŽÀÔÎ%ßiS|OőHs»˜câ/ó©Ì[&]ÉÚÍęșb‚ÆÿüŸËÚźŻĄè˜LőjóGĘÖëL5ęÍŻĆRŃîÙzkțgújă*­/(P©ȘäjȚ°rć©Źąš»È«V}›+Ț8‰ûtT– sæéœőć†ćZ“żWĆVˆâc3ŐŁŐ%Ûë,eČÏ%Zśë[zbȚt}ŸœG„Îxe6 k\­‹“ĂŽĘAEÜTłÒ ôÖë_hqźÖ\mÏhŻű0»Ê sŽyĘZęŽ"CÏ v•5˜čCßOžĄÍgvRś4W-.]j}éĘ7ܐQó‹ę}Ö^}őù•ș~Y‘5šKû^ŹzN6műRïÍčWóČțȘ/.;_ +Ÿ挶_ŚˆÏŸÒ¶°ö:żęhJJT„”O{\©żóő)KĆ+çhÂ7±úKïæŠ·Ÿôœ«’Y8UcßzL »ih«?êâ˜čÍ\­Zś„>˜óÍËöjêđ!J5$ÉԖĆÿĐƓæKő‡èꁭ”P¶IÓ}Ș±oŻŃȚ«žŚ5‰üiàtD"T#kßJ}üÚçZ\˜š3țô']Ö%QîCF˜òù$ œŽÈ»mč–çXŠ v!Ç„–턳tçk/Ë5ű?z4ó°uçFŒô«ç:·Őù ăț‘èSîšD„·éąA»«yôÁ„ŸæźYzâ‰9Ș?fŹúćÍÔÿf/چĘ%RxąšvêŻáĂÚ+*kĄ&MY %w«ĐïV\ZK 8šÎL+_!n©pț[șûS›țôś!ČÏžą©‹6hg‘©Đű4uè?TśJTȚąŻőĆŹeZ•U 2gŽÒZtŐùöW«èCSÊČĘ+5sÚÍ_”C9ûL…Æ7P»3ÎÒę›*æÀPÿ&}òÈkZȚń:ĘÖf›&O[šerTdșS݉ș:WCÛÆÉĄ2m˜ț†^™șI{MKúű]ś±$9ÔiÔús§#7#9țcx›Î,˜„/Ÿ[ź”; TæˆTJ“¶tȚ uO=ȚÖ5>-}ïaœŽ$CŁčR=Bn{5ç,Ę72EKŠ|«ïWnSN±__­{ ÔĆšèĐĂéŚȚ”óőćÌ”ló–9Û S=Î>GƒÛÆlĆbhőœ™šúĂjmÌ.Çt*<.QšvĐàóz«YÄ1€Œ–G9ù;ć.«úțșèđF€:„5–}ùZí(4„T»€RÍÿáC-ô·Ö߆^q\A»•»TïŸ:QówzdZóôÌŰy’$[êYșśîAJłI’©üőóő㌟ŽlÓn”9‘Đ@mșö֐~-”xŽț4‡ńzvk{aĄȘȚeCáUț>yęŠ WŽbûśÍ»m¶fÙŐ„śùjSéùí15ČùKš”b†Ÿ-€áá€íœnہêbîÔâ„Ù2CZk@Ż€czsùv-ĐKă>ŚJŁĄzöʁqNyrÖkÁÜ/ôÜČőșò–ê_9‘-ŃÊIă”R‰ê~Æ`őńjÇÒčúfö'zaŚ/ ßČCá{hh§H)oæ|łHżîUä=—«kćÖżUÓ_}Ke1mԜܶŠôćê—čs4wÂ[Ê^€ŹMŠÚőî§á}í*ÜŽHÓżŸźWŠBő{VŹŰőg/ĐKÿú\kBškÀ  Ô(ÂŻœ5 5}қZ›=RœŽ…>„„ĘK&êč,%wíąa#d+ÚźŸfÏŚWofËËÍșš±] mÏŃhçwÿÙ*Ćőż\—Ž “d(2őÈGó„ŽáçŻéoŽ:ŸŃ_Ăc*Ùù«fϞ«·^ń(ìŻ«mhő„țŹ…zőß9Ò»Șï°. · Žî‡čšśĆÛÊ±Ę€;$•·Y±Žwń=ùî2™Ęuö…kjęÂ9úêWŽ}čșźkŒ ù”eÚ[7­@Îè«? Œ•łŽ@»ł¶jŐNìÇłȘüž™ÚŸw—L[ȘǔŸÀđŻÒÌu»ekp….(?ƖiJ6Ûï·ÿ OSßK.Qèÿ>ÔŚù-5|d/5°I†;VIÆțc’ûóÇzúœeò€¶SżÁg(9ÌŻŒ K5ûË·”xŐPĘ~]58ŽÀęwùŠ”ă)•é/QNȚ*}łè-ę{[ąÎ=wŽÎrí?Y»Ö+ÏHT›Ô„ĂZäžŐ¶~ٗźŃÒlż†§óç€Ó iP]Jwi{Ž%{ƒ†jr,«‹ ôĂgSôkiC]tûS(wQŸvńzúč™úäóej3șƒ"+Š3•—Ÿš«ïĄn6vź/ó‰W5cŐZĆ_t«nî_vRë<ęcâ-^WŠź*­Ű6ś)'ü<Ęwm/%–'†Ę›;”çń)ZłY©Ăr#Č„zŽ ?$u6hš4§„eùE2%ïő1OôșšuR—žÊa©M éiŠ2v(?ß#KÎêč0«-Q»4:ŽoHeÔłkÁź|XRŠ$߆_ŽŽÀPúÀ6ŠőyUê;08Q-2Ł4cț&­Ùm*35B êGKëÔ§_ÖÓ„ÚšÁoBß*˜[őÚ;—ëŃmŸC·OVżéÌnłÉ.KŠub”TÉŁ„žĂ łÉnÛßneÿ3Y*ÌÙŁËŻUŸ>©›?­j»Š=–$‡2‡Ò(ÿDMüö=<+Jém;êŒ3ș«GłžßîSĆăStŃy/«KiùŸyĐăŸ'gżçtGăòW“ĄF‘U„âeőŸÿŽŐCÛRtíeht„F閯T^ËRaÈ œ?òêƒ=ÌuQŸxŻÎ~wą^ùy­.Đü8ÿŰXÚ·'W%r))9ú·Ą”#A©ń6™č{”cJńUßÎŽŃúÏè Žÿô‚©u?=š{¶wÓ3çUCC’ č"Ò©Ë‘©ŸM3Ë:Kè6\çN­«>Ąg›}ąÇ3 qșeÈ+ŻżŠȘęe*“!§œšNրZ…°š.î„ÄZ¶s«¶”J !żÿ«â_GșڐqXjg·Û«ò ă8>›lö#Œ>–y,K’M1.Đ5}SôۈÖPH|ô!Û »]¶“@Vë1Źn†]öcŰi˒džÔúŒQšQŐú~§bê•MWČzüázu9g«ÿđŁæ-X ś_œ«©íÎŚ#»«~•p\JIn«”?zČcŰäNhŻn Ò2Ç»FoLžMmIԘKŸÓ=é‡߆;Bá†MéMûšĆaӄ5èąNÎO5%g«Œ:Ț°]2­ò_ê~·Vy«—#­™7BÓÔ©aZùO~čÖžeËNV›ŽöjqŹ íőoÓMqKŸÔâm;äÏh€”èV–ví3uèÙ#SčEčò*RÉî#N ê.Âv șŰê©mË͘łJł~ÌU‡>qG %ɈMPąĂҊ]Ù*¶ȘrgYĆÊÚY(ËŃ@‰ŃÇ߂ăd3băï°ŽÛcWjzăCktîòŽ­ŽÚ{ 2+·6«XQÊÈH<êëæGTšșLSŚłiÍWïè…“őù’¶șŸkőŽ/±<ËőÂÇw蟻Òuëˆ'ukĂšßÌkÊPłKÓölS‰š)Čò>ŠMÉépć͑NìŠJŒWš6kçźœ2Ûv1ÒČlíŰcÊV݊oKTł2o‰JeÈćpɐM )-T_ËŽ<+GfĂÊ'šJ”|û:ùí™j“ÄŸVNG59j‡2ûśWËPŻVOț@W櫊NŒĐLunȘČ5?è»ŹC{i—m[ 9ëę kŃF-Ža…ü©f„5W§f!*[3WÓ6xŽŒ°üD8r–öíûĘykó1ŹÌ™ŃVíŁLmž;KË ¶Ś–ŹĂï¶EšIÛ Ć~•”x«„«x‘žzŹț™ÓZś|Vc«ÚśȚI¶LRŃêôF–§Òжݘź|!êÜšĆQÂv‡œC–§HE‡”“wdŽSÇK[,ĐzOćö+{áęRâPz»–Š­†3 Ÿâ=Ê«êÍêߊ ‹æ«ÈHSŻôęÁșŁȚYgê§Ć“ŽŒRÍfțLœ·ș@!ięufMd8±üšFF|7™­qïÌӌWžŃ⌖j“‘ŹŰP»üžBćdmWvÊ =/C#B]ÿoš~Țô_}ńâkÚƧٚûäÉYŻß-ÖÖ°ÖúÓíȘuŐx”1"ŐęÂĄZ2nąfŒ2NÛ»uVÛúQr™%ÊÛčU+W;5àÎáêrÄ&âGfONW“ˆïŽ`ÖD}èêźÌpżì©íÔ)-䷁om>†•…¶Đÿ]ÒYëȚY€ŚŸÙŁnĘ[+=Ö-«ŽPÙ[ÖkEi[ĘtMOĆ)_łßxGKĂ2•Y/A 1!2 wé—yó•ínŹ3[!?\È`œőśÁUßç]Ș§Ț»C/쎩u›&Ú»ê}ęsŐĄClaíuyŚźJ6BŐ§ÿmúÆ{őì{Śi}—sŐ3Ö©ÜŹoőȚϋä«w•îl{”•úFˆÒ›Ö“c毚űȚ ”OĘĄĘ2ïÎÔù—tÖȘ·æéĆšśL„„™ÊÛŽDłæo”­éčșŹWÜ1źâ·«ĂÙkĂÙUĘg)Ő#êęmžș7íšÖńőÔ "D„EŽàŚ)šČÓ§=Æêș”òö>ö–șvàMțä|g·F¶i„ßfÍXô?Íò5Ő_œ«5ęőN Âv ZŠjužîŸ»…Ÿ›”@?­Üšßț"iÈĄ„Ô†jĘà`/s[|č-Złf|§ïçOÓ‚29"”Țnˆn=§—ZÄÖÜ/ŸŰ»êș;â4{ú}żü;ęw^©LGˆąë«y‡öjxąŸ.Ą-5üȘsćŸ8O?|ń_ÍwÇȘë„­Ő)­êá”ùd(ŠęĆúë-5eÆB-ùnšæûe‰PBę ”ëÙXá†$…)œE-ę~™fț\ bŸä QęŒî9b€z&ŸŻfÉę˜]"˒–ÿòź–W1Ƒx„téȘdC2"úêÉ«^PÛ9ïêę„ăőU‘WîÈ őèvŻnï{źZő„‹M©ę/Őè‚Ï4é§Ùúp…]‘ú+­[Šâe(ȘíEșûŠ4M™čP §­ÔȚRCańőŐ꜑6 •’ŽÒnțŰŠjüĘÜj’ŠŹ›ź7–ç«Ű/čC•žÚKcÿ0BW·ÌštÂÆPBó»őÉe ôűœ/ôæÌ©*4"Őžț9șÿ‚ëuUZhuj!ĂČ~Ӕ8!«7nŻžĘ<œ~+9ÔÒUŐŸEz°ËPI]ËíjÒOj4ÂvDŰ@€Ûa;"l @„툰€¶ ÂvDŰ@€Ûa;"l @„툰€¶ ÂvDŰ@€Á.8–źÚìÔa„í8-űZxƒ]N3ő”ìjŽìUÁ.ĄZŃF€¶ ÂvDŰ@€Ûa;"l @„퀓Łäkę­u žu¶ÊȘžÛ·uźÆßrƒ.=c°ú5ï«Ț-ÏÒÀîĂuÿ€šąśÇ,ŐÖqÏèŠsbd”7w}Ż/}Vó|-5đš1žd*ûûéú|Ücڐ{żžúG;…G}FÊłZËVxćê{»ž~ò\ĆpŒ@-GŰ –łT4óżú|i™2n}BśßаâƒmÀ9IzhđëúțÅ9hPy [ŹĆÏżĄčù­5úśiHcûțÁĂz*łÙÇZâ/SĄ„¶—©(§HŠŒQ„;đ‚Ź}ë4ő…7ôéÔ_ŽqgĄ|!±jŰĄ·.{­.l„CŸĄL;g} W_źWîPŸÇаäFj7đ"]}óP”ˆ:ttéú™zùŃ·5ăÇí*0ąÔžÇčŁŃaű”ćŐë5âéòŰôíc’ùŰÁ!ŽL];iŒF7łŒż§a;€ZÏŃzˆn|¶â{68äC͖Ô@©‘†Vî+V‰„ęa{áb͞¶WŃCoÒYćA»eš2láj3ú*” ʁwźžèś°ŒMÖS„6—č[Óî«GŸqëŒëoйΉČíùU_üëęóê]rNzRçŐ;xÒEŻéÖëÿ'û«tËő­”æWțúúä_Oëæ –ȚžRˇ[…?èù«Ö€â6șôțżš_șSčK§ê;ç*ßWč»’†Țą¶,”čï'œ>öcmêq•ŒȘćÁߛ-\i žœš}ÛÔr†B·QśÆ‡o·TüĂśZČÇPęáí”Tžßúڭц}65jПžy\'.іĘ>9Șʅ—häMœT/äï©àÙŠFSuțÓĆșïæȚŠ4$©«:ž7ê›æhú·č6"Ą|u»_ŸŻí¶NúÛ—k`Tù]:Șuz#Íې,ÓTù%¶-íö©Šíp«ÇŁéŠKâśÏŃ裚;nÖćo>äJÜ! Z«[Éڛ« 6ɑÜBĘûöűMO}€Ú†°@TșfȘÆĘ5C{3ÏÓMW§ë@Sswźöš–ŒŻ?§›öÔSœBm˜ò™&ŒțOĘ·ÙŻ'ÇőU|][\ÖQŁ^ìšQ‡mvŚŻ§8›„üÜ|™J(?N†ąâŁd+ûEŸœű”2źî­æInČ)źÛ0]Ú­ò >­]ČJ„öŠêÚ#¶R+›’ûžĄLûR­?ÙûP¶šcüÚ3ë}={ççڜ2Hc_©V‘#`łÌ'żü*n0TŸ:L©ć)|«3Ú)čôf=5éSÍXŐ[—” FÚîWiQ‰ÊÌòœ•É’ßS€ą‚ò†!gXžÜÇĘÒÜRáŻSőȚ«“5oÉfeç•Èë7eYŠüŠ”aYČ*ÆÚTÿČ;tÇŻjÜÛèȘ7ŠnÒJ{tUÏ!ƒtVśT\üïU^Î>™¶Ć'zÌìńńŠ„ő:8M¶š;ÌœúőßÏêٗV)lĐ5zèŃÁʈ<ôBžöÈp…6ĆślŻäÊA°Ą¶g¶ółŸŽi­Gj`ôQ¶DăŐÄlóĐíś^€ś–ß¶ĆhŰűÿéȚŸÇŚxĆżțĘ5âE-èą·ßŻŸ-î4ä_û‰îŸeòošĄóžy[gߟJ?ÍYšŸüŹESȚÖ7ïż«w/ŸWăPqüŹ)œuè–ß/ÿaÛê*Âvuƒ7Kłÿö^žâS‡»Ń_F5S„ńÛa¶&ŐÀniçÎ\ù•vH?qłÌ/K†\î }4:šëČÇé,oyB]¶XoŒyOŸ1ëș^îęÛ ‡šo}~mž6Mˋ#ÔôçÁśűvòXRŐmê …Š¶TŸK[ȘÏ„WJȚlÍ}ô6ęíŁWôá%}uk‡$—bâÂd3óŽ;ǔ<ąțŹÊög©”T]ëJ àtäß­ïîșO/NwéŹ?Ą;GWŽK’-”«ÎèìĐȚi_i^V„$ŰÌт/•ÏĘTÍÛ)l7"”Ö±ƒ:uïžÿŸn銔ŠnÒźÒ¶¶js„; Oq©dD(1±RŹnćjö„čÊ5%«òbz3G?œőąžÿ`•Œ•'q%©kßæ “WeNÈĄŠí2ćô­Óßçèà4eZ?uź6¶H źbe;€ZÎÔΏ^Đk_æ*zÀ9jé]­…Sb‹SæY-”`—dKÖYwÿAߍüPŻŽx\[GőRzä>mœ2YSf•)môćPżź‡Ž«qŚvŠ}í+}ó֐p†b‹6êûśȚŐÜž>jçúLk—,҆‰j˜­[„ì;æéżÎUvîHÛ„Ÿbœ~ćoYȘ)ŻÌ’'ę" êx ĄűÁêÌiú3ŚÓ„—Șw#»vÿ8Y~ŠTłPi­dÀi€°@-WŠőóW©Űò«űëÿè诫âÜŁ~‘ût”œDś~Ż ÏOÖwÏżŹ/<E7nŠ~śĘȘ?^ȚBĄÇżpŒÆ ëûg=|g±žû%Ę0è…ŐoĄȚ#ŻŚĂj _Ìćzô“WtęćÛôیÛŐĘąŽw=«§ăßÔû_Œź‡^ÙŁ}ev…%5T›țŚéù›.VûЃs±}tÇű;úŰúöé‡5ÙŁôȚè–¶Ô·XȘu~Ÿü’ŽŻË<@íbX–ĆšCT‹Ő·WÜnž^?ˆ•jéȘò”đțț@ ŐSB°KšŃČWš}‹ô`—QmêZŻN9ÂvDŰ@€Ûa;"l @„툰€¶ ÂvDŰ@€Ûa;"l @„툰€¶ ÂvDŰ89JŸÖßZśŃ€[g«ŹŠ»}[çjü-7èÒ3«_óŸêĘò, ì>\śOʓuʋŒ#Ű@u° 6jö‹iÊŽ_”eg‰«Ô6íŐçšË4Źoąœćă|sț­1ŚÌTy„‰™șâË'taû©*ęôäßȘOnż_o. Së .Òy­î4$ËRLŠ;ŰŐ7Âv”_éMŒúïúhyšZ żPWuŒ—‘»I?}4EïYȘ­ăžŃMçÄȐdk}źn~©«Ê_:mjÙËŻkZN#5Lš)_ú)SQN‘Ł·ìbȘ—g”–­đÊŐśv=ęä芩c»N?„íj9KE3ÿ«Ï—–)ăÖ'tÿ +>Űœ“€‡żźï?\š‘ƒ)ƐlńêxvÆoæŰ;őy_„ț/T§è’üzçê‰~ËûŰd=uAXÀÓYûÖiê oèÓ©żhăÎBùBbŐ°Co]4öZ]Ű>J‡îu™vÎú@ŻŸ:]?źÜĄ|MaɍÔnàEșúæĄjuèèÒő3őòŁokƏÛU`D©q!sGŁĂ*đkË«ŚkÄÓ+ä;°éÛÇ4$ó±ƒC™șvÒxnÆ7 @íBŰ ÖsŽąŸíŁűž ùPł%5Pj€Ą•ûŠUb鈫§­ÜôîĂsež{»ź8óđĐčŽ0wkڝcőÈ7nqę úöî30Ș2măűufÒ{‡ 5Ąś^Ta]° °š€ ˆX–Ő”  źćU+V,Š4DȘô&PCš!€’>™™ó~ „„ąà űÿ}19yæ9śœÁ)Ś<ç>w¶ —%}›æŒù©^vTîł_VßšS+ú‹6ŸŻ‡‡'kŻĄ9ŒȘű8”œgŠœùŠFì5őé䟊,næŹŐÞŚìüFđ̃ê뼌„ùúô±ʶ—-ÂȘˆëGê”ű9ó6èƒQ_k_»Ąznhü©ÇÍâ«Ő/—3 Îa;€+œ!ݘFjsúvSùkWisșĄj·4QÄ9óÛmyóc­Èoą»F·ÓćČšęą+<šŁŽZŸQOè$C’Z«™g’ú=Ž\?.ÉPŸAa%_48ŽwÉjȎИgȘ{@É­š«alM-Ü[EN§J.±m*kÁ7ZpŰSíÆŐC7…ž˜ŁesŐwĄÏ'—»·Wő†jS]2ł24Ę"čU‰SÛ.íJ{ê\©ÛTJE;çkÂ㠕U·Ż«s5%qìúA_|“Šš;GëêjœąÚĄąÜŸŒx«­PĆ2ć(ÌUîÉ+ș†Ü}|ćyĄ]V|šëÎIÍuçi›=«E)Äb*;#[N…•'CĄČoŃÌI‹TkX'Տđ”!‹BÚôр6eg°kŚæDYëšu»à2gXT„KŐ”&hÏ– p%"lPÉ8”Ÿô œțŰ,%WíĄQïßźțçZźžŻ„~Đ^kcĘóŻ:żșșxł&ô„©Îò۟ìŻîO–ül RŸÉßéÉ.Z­©œmó5ćœčZč9Y©™Č9œ2M§N©–iêÔ5c-ȘvëŁztÛsšđÉłú‘»k7PËv­ŐŸWuk)ŻÒ±6eŠćÉi Rèi–”††*˜Öëào‚°@ćáÌÒ¶·^Śëo'ʧÇ];ź§j3h—Ìô”úq^Š|źȘöU+zU»$·úșuÒuł•ÄȚĆżèĂ»§È~ś‹ș·Łç‰m†›Âê]űS·cÏ4=>h’¶ú”Ò ŃÏšK|ž|Ę 9vMÓ#çžyïZêûê'șvtą6,_§ k6iăŒOŽű‹ÏôٍOjžkT„$H7OŠôfù)L‡CŽÓ¶TV„í*Û-3VïÌł«Ù/èÁ;ëÉïwûŻ›:Ÿx…~ÍśV«ȚÍÿ`ì%bű©FófȘqòw[–fX Ùj7Q‹¶>.LìPò‚Úšï§ź/Ő}=ęJÿb?jšĐT™•êć ’wdŒ:ˆWçwH¶T­śˆÆL}W_ĘÔE·r“䥠Yœ™:–æ”ąO}iá8rX©Êž‚\K9ÀEŽcúùń§5éGu{ë%=6䏂vI*Òö•‰ČčŐUăVȚ—ąÊ U˜_$~ /«›Z6}…2œ’Y¶s3M>ž€7ŸL”­ì$jĘ„Ÿ|dSńÉŐśrS&ućnß­”«Òtjšb홿BûNëˆPY±ČÀΩ”©őțś Œæ:ĆÛvhĘüӆXBT·[œÂÊöwŃŸ2ȘÖTtĐć°ŹęŻdULë& ~ÿ-țxŽź ë àÜ$­šò™V„tV™Ú”yŁöWtd Œ,~Č^©ożZĄÔŒÛŐ»U5č;”œ?AóȚ]ȘÂŰțêŃüdÏxCĄ=ûéê‰őă«O镱êTÓȘcëçjúŐó–öÒJü ¶žÂkÏêDć›ć/ú\ÿ·è,C<ÛhĚÿš«™mÎle„KF ęN[śŠćq”^ŰvőE™Ê§Ë}zț±|œńÉÛșżÇDùT‹S§Û‡ëùÁŐ”ĆčUăŠœ«ájüÂŃjëî„æżźWB?Òs>ĐŰwӕWl•ODŽ]uŻȚxèF5-s2€ÜYN~LȚăżÔ’WžŚ\Kb;Ę ‘ŻĆkÉÍ Úí°Ë!UühțB†išŹ9ÄE±#éPéÏőc«U`%ć%$&ÉgûăÀE„°Š.àȖšx\Măb+șŒ‹†žížˆ°¶à"Âv\DŰ€‹Ûpa;."lÀE„히°¶à"Âv\DŰ€‹Ûpa;."lÀE„히°đŚ(X€1 ;뚇—©ű,¶XĄÉ#ïŚ€=Ő”~uŠïŠîmoŃ3ł3e^òb\ăVŃÀĆ`OÒČIS5oÁ6íO)|‚Ùš©:ßu«út —{ÙÁGŽțĂiúaȚíIΒÍê§°:őŐąÿ șńÖ ŽVÔœűqĐŽŃÏèŁ5ŒĄżú6 —Ż»!™Š‚êzVtuŒ°À•ŻhŻf {JS·z+î–~Úm˜:O_ܝ ^ŐCŚɐ$çQ-9FïźôRË{jD»Șò)ÎĐȚfiúsÏhóŸ§őò“ć]Ńś©Č+ÜĄ_łÉŁËhœòro]€kÛ\áLćțô­f%«ÖĂ/é™ûŁKŸŰźč.Bc{~ U_­Óí=z(Ȑœ»—iȚòß2JŒl*’± ÚŚ–}çƒú|úJx€±Ú]i{±rÓr%ÿ ùyșžF›y»5â‡úfț%„äÈîŹèfÔÔ=êŚ4@ćśPŹ”„_êœś~Ôú퇕]h‘O•šjÒœż†ž^qćGíùIïŒûD ŚÒq#@1ízéîGkžVCûßźAŻü&ûÉMKÆ«WĘń§†žŐŐ=ł'kH=N/WÂvW<·†œôÀëÚŸzč'5KDuEúڞ—ŻS'VO»čÉ*ÉÍËCćâ\‹§Œœ nnr»\VYÛVè„źÏË6~źțwƒks9iÁcŁôÂbOu~żîl.Kú6ÍyóSœ6ìšÜgżŹŸQ§.ăQŽń}=<ü;Y{ ŐÈá TĆÇĄì=k4íÍW4bŻ©O'śUdÉp3g­ȚöŒfç7ҀgTŚXwe$ÌŚ§­P¶œlVE\?RŻĆçș·AŒúZûÚ ŐsCăO=n_ŐšÎćDÀ•‡°ÀΐWL#”ä•:Đ IDAT9}»©ü”«Ž9ĘP”[š(ą$ż”ÄtŐ?zę 7g|Š/[ÜŁŸ]ȘËŚž©=ßźčĘUkxo5ńșÄwáR(<šŁŽZŸQOè$C’Z«™g’ú=Ž\?.ÉPŸAa%«ÛÚ»d”YZhÌłŐ= dŽVÍŐ0¶Šî­"§S%—Ű6•”à-8ì©văÆêĄ›BOÌŃČč껍ĐÀç“Ë]‰Û«zC”©.™Yšn‘ÜȘÄ©m—vć{ê\ÛTJE;çkÂ㠕U·Ż{j»%Tÿ7NÆ ÿÓ{#ŃL‡)I2<ĂÔôÁÿjÔđș„­e*ŸæșsRsĘyÚfÏjQ ±˜ÊÎȖSa%ÇÉP@h€,Ć[4sÒ"ŐÖIő#ȘG·=§ Ÿ<«Ąč+°v”lŚZí{őP·¶‘:”űߊ̎<9-A +ßțĆȘ`ZŻ€ż Âv•‡3KÛȚz]Żż(ŸwiìžžȘć_>5/XòčȚ›~Tuțû–QÚâ€~»æŠ6Ö?x_ł{œ© + oxńfMè1J3Rć·?Ù_Ɵ,ùÙ€>“żÓ“].ŹńŠcÏ4=>h’¶ú”Ò ŃÏšK|ž|Ę 9vMÓ#çžyïZêûê'șvtą6,_§ k6iăŒOŽű‹ÏôٍOjžkT„$H7OŠôfù)L‡CŽÓ¶TV„í*Û-3VïÌł«Ù/èÁ;ëeușCÇ“•g+ŠAšÊÇéîȘV/RÇÜk“V@ăv·úșuÒuł•$ÔĆżèĂ»§È~ś‹ș·Łç‰m†›Âê]èS·CÉ hkŸŸșŸ4Vśőô+ę‹ęšĄBS:ûœ5äŻÎâŐyÀ’-U+Æ=ą1SßŐW7uŃĂ­Ü$y((ÄGgŠŽ„9„èSGŐqä°RX*ÀаÀ•ÏqL??țŽ&-òQś·^ĐĐkBuöî%U—‡óíȚ|LΖUËî6íęużÖET« Ëu~ȘŃŒ™j”–”„C¶ÚMÔą­KSæI†ŸÂĂËÄêf†–M_Ą §Xv1œ3M>ęZ+<»éțq§zŰ{Dšu—úò™șQĆ'ż›ê4©+śo¶jíȘ4Ę}òlb홿Bûœââ§ào°ÀΩ”©őțś Œæ:ĆÛvhĘüӆXBT·[œÂʆzüS=?LĐŹ7Æê՜țșșu€|ÍăÚż|žfL͐ŚáêŐŽČ5·*ŠużÿƒŐâÔéöáz~pumqnŐžiïjűÀƒżpŽÚș{©ùăŻë•ЏôÜ4öĘtć[ć­FWĘ«7șQMœOÍmwÖŁ““śű/”ä•ç5Ś€ŰN7häkńZrs‚v;ìrˆî r3LÓdÍ!.ŠI‡Jź[­+)/!1Iö8[E—ż™(…Ut —”ÔÄăj[Ńe\4–?~a;."lÀE„히°¶à"Âv\DŰ€‹Ûpa;."lÀE„히°¶à"Âv\DŰ€‹Ûpa;."lœ'‡vüß`uŽąw:\žÍ~`…&Œ_:ôTŚú]Ô)Ÿ›ș·œEÏÌΔyȘž”Ü*șžÌăIZ6iȘæ-ŰŠę)’O°"5Uç»nUŸ.ár/;žà°ÖMžŠ9s”tàžìŠlÖZĘŒM=[ń-ä„à8 iٟŃG >jxCőm._wC2MŐőŹèê.a;€+_Ń^Íö”ŠnőVÜ-ę4ŽyšŒŒ}Ú0užŸž;A&ŒȘ‡ź ’!IŽCZpÿM^ešVż>șăÁHyćĐú/æêă!;”țŃKÜÚ«ąïQ‰bćŠćJțAòó4*ș˜‹«p‡~ęÍ&.ŁőÊËœTÉîűû!lp…3•ûÓ·š•PŹZż€gî.}b»æșíùV}”N·śèĄ C*^3GßźÌUԐqznLŒNÆêź—oż±úțő…êńE_Uč–·ÛVè„źÏË6~źțwƒËәy»5â‡úfț%„äÈîŹèfÔÔ=êŚ4@ćòngŠ~™ ȘȚ«Êzì€çÍĐôEE’ÓŠŒ§€ŠÛ*Ê-P±łäW[ĄŠeÊQ˜«Üă% Cî>ŸòŒĐò|šëÎIÍuçi›=«E)Äb*;#[N…É*Éyô7m;lÊçQvŽŠêŰÖOłfŸ6‰G BüM­ž?Ußvș[Ś·©!?7Iî1șjHÌ pe"lPÉ8”Ÿô œțŰ,%WíĄQïßźț§ZÂțÍtç{śËńűgúaôăšcJ†ŐWջߚ[‡ÙőÆëûäîQA-dŠ7kBQš‘ê,żęÉțêțdÉϖ ő™üžìrĄkÁMćl›Ż)ïÍŐÊÍÉJÍ,Íá”i:ćpJ”LSfÉHgF†2†BÂCÊśq—UÁ:ŁÉ‹gkĘęÊ`úśWzóö%zËŻŠê¶jĄV;«Ç?:šNp%;Kà,ÛTÎ,m{ëuœțvą|zÜ„±ăzȘ–ÿ™ÁčWękőÀŹ«tǁƒJÉ2ć[­šȘ†žiÏ+‹ä4‚ZA=ĂĘêëÖIÔÍV{ÿąïž"ûĘ/êȚŽž'¶n «wáOʎ=Óôű IÚêŚJƒF?Ł.ńáòu7äŰ5MOŒœ[~°ybÿæł˜rÚgÙnQh§»5qé-J^żN«WnÔÆŐôíűyúrR3ĘûÁÿ4ž©śŚ p%!lP9ێh٘±zgž]͞xAȚYO~çX î,ÌQŽÍ[5bT§FÉFÇAmY"3è*Չ© °ĘđSæÍtČ$ÙČ4ĂbÈV»‰ZŽőqab‡’,ĐÖ|?u}iŹîëéWúûQC…ŠÊ],ÖŹ@‹©ęÇÒO ֋tô`†œ:G-nȘÙŸ»j¶ïź[ćTîöézêöIúđ͟tę‡}RÉź9 PV%Jp9ŽéçÇŸÖ€=Ôí­—ôېsífÖÏz­ĂzpÔ„—vk1•œű[Íß&…]”UÂEۅùE’á§đđ2±ș™ĄeÓW(Ă)™e:ŚXȘÆ).ÂPÎÚőÚVXfxÚ*-Z[tÆÊvێŸôțۏôóŃČío,ò«Ś^-Ł-rË~ærx€J…•íźpN„LšśżÏPà5Ś)Ț¶CëæŸ6ÄąșĘâf•Œ ÖêĘ?Rë?ûH/ŒJW﫫ʱw~űxČczè±ÊăŹûč’YÓș‰‚ßÿA‹?žŁkÂ:(87I«Š|Š!ŐÄcŠvmȚšœ‡Ă(/ś†úÇ­ő5ûőïôÂH? č9^yIZúé|eՍ’ÛŠò-fÜ| ”8ûS}·-[ÆtT)?M»OÓW[ęÔî… ă«]PÉŠiČȚƎ€C„?Ś­V•”—˜${œ­ąËÀ_ŠH+ŹŚçÿÎcìÙF#ÖüG]ęK~/>ȘőoȘof$(9Ć&·ĐHŐëvnÙSńaçbžQ »(ó\4f¶&żź7>Y„ĘiùT‹S§Û‡kÄàêÚòÂ#7mŸlá}4~áh”u—äH՚IôîŽuÚsŹXȚŐšÛęŁtKȚș}üqĘ>ócĘòX™ÊĘöƒ>zk–~Ț”€”,›ä Èűêvû î#ŸÓÎ40ł~ĐŁ^ÔÖŸÿÓܗÛëB/ś ź|©‰ÇŐ4.¶ąËžhÛqѶ§\va;ÀeŠČ…íœŰ€‹Ûpa;."lÀE„히°¶à"Âv\DŰ€‹Ûpa;."lÀE„히°¶à"Âv\DŰ€‹Ûp‘[EƒăŰoúqÒ·ZŒd‡-é ˆžFjÿŻ[ÔŻw ye›yÚśĘ4}ęùmߕĄB‹Â4ŚUśÔ?ꊐ{…Ę \©Û\ń̌ úà֗Ž(#JmȚąžő€ŒJűfŸfŒÚŹ=yŻê?·T)9•§Xû>§ÿŸșG]{ëæÁ”dOŐÖoféëû¶éĐŻèÁžAœö€ BŰà çPʌéZr @'ŚCĘętrû5}«©šÛDmž”Q™7őVšE2ÓWjê;‰RÇ{őô»Ś)ÂzblÇ>ńòúç“úț”YêuíȘ{Y<;+7-Wò’Ÿ§ńÇĂPaXŒ à gU•AÿŐ{Ë^Ó]ڜ Ú%Iîr·rśő–{É VŻŐÖąŽŽt9œN^Ž}pĘùő·pVeƒöèè5h/ËÓÓSŃŃ5$I™™ÊÊÎțKöàÏae;đ'ćää”í5kFŸwoö?Ëj”ȘfÍh%'ïWfFŠŹ -e+§Syù…ÊÉËW~ĄMĆĆvÛ]Ö_ÆĘÍ*ww7ùxyÈߌGŸ>^ČțĆùCY·ă}REw\čہ?Áfł•öhŽźń—í'Y,EGŚĐțę”––.OOO.š šôŠlĆJÏÊQfvŽŒ==äçë­È0_yzžËĘœòÆ[ĆĆvي•_X€ŽŒl8rLÁț ò—§‡û_¶ßżëń>©ąŽ;ź|•ÿÿà/–~"hŠŠ”Őjœ€û¶Z­ŠŠŠ<ŃĂ==]Q‘‘—tÿ\J©YÊÈÌU ż·êDGÉĂĂM’!ĂšèÊțzîînrww“Ż·ÂCełÙ•‘}\IŽ*$ŰO!A}Ÿçă}REwT„íÀÊÉÉQQa‘|ę|ÿČíÄÓÓSŸ~ŸÊËÍSNNíd•N‘ÍźC©ir·ș)ŠZ„<=OŹ(6țN©o‰wِ‡‡›Ș†‡(8 XÇ2+éàQEE„ÊÓĂőˆă}ŠKqÜQčđ/ž@'/NVĄu„‡…)/7OYÙٗ4l/^ț”ÚȚő­2œ’<»k↠êë}ÉvïșœÙș»ĘZX$ÉЁ-ÖűNçq XńNM9JŻ-?,·Ű^zêíôÏÜ>šèXą~^Ÿ^¶'+%3_6‹·B"cÔ€]őjWSțÔòÍÌüE“ßœ©]U{é‘{Ú©*­ç\F ‹ŽÿÈ1ûû)$Ű_n—űŹòËŐÉàÛËËC‘ÁÊÈÊŃŸC)ŠŽ —·ŚŸ_Èńț}ŐqGćCŒ\€œœًí Șđov ĂPppìĆvćääTh-ŽƒËőÍâœÊ*,TÚöïőíȘL™żw3W;æšg^üDӖoŚQ…(6.^ kú«đĐ6ęôő{zńó_•ń»“üuœY‡”/«PÙÉ•^A5H’3=Q nQŠłâjpy)Čٕ|ä˜B‚Jđ{NnV«Bƒ ä#ÇTdłÿ©y8ȚæbwTNŹl.@Nnź€}Ó7mÚ€ăǏ—û{•*U#oïòKœ<š}ûö)**J111ć.šêt:”oß>>|X111ȘR„Š’’’”žžźŰŰXU­Z”Ü\čččJJJRqq±êÖ­[Z­dțZÖȘ-Ô%Î_[¶ćÊÒ\W5 Òï~ĘbxÈĂ,”ÙJƒnìĄŽ”JŸp‹źÓä·ŸÓ/çêûÖńé/źbčJśÜźŁAńŠŻ°śQNYż@3E(ìêÆŹź I:œšź?…űÉjćƒÂï±Z- đ“épêpjșb«Wčà98ȚîbwTN„íÀyr8**,’ĆjŐź]»4yòdmߟœÜ˜nĘșièĐĄg„íkŚźŐG}€üă:thč°Ęáphá…š={¶†ȘnĘșiîÜčZłf†Șž={–›+%%E_}ő•ČČČtŚ]w)4,\E…Er8—æb­•ȘW›ĄßOÌËđnĄŃ3–khZŽŹÁá űĂ|ÜC±=ïÓžëŹr;휊{•VêÛa•æŐÎ]G䌏Ÿô§ŸȘÙŒj^êę–eOŃŠ„Łr*ą"«p9–‘-7«U!ÁțżçÉj”($Ű_E©vËÈVxHàyßöJ9ȚöíŐçŸokwœ‡4wæęŠ» ß»rÜQy¶ç)??_’Ș;”iÓ&íȚœ[±±±òóó“$„ŠŠjíÚ”ŠWllìP=pà€–/_źZ”j)66VIIIÚ»wŻ8P:ŠžžX»víÒêŐ«Ő«WŻ3êÈÍÍՖ-[tìŰ1„§§«~\œRŠ*??ÿąźnwfmŃÔ oiʏżhošM^UăÔćŠûőHkùRÆYoU€#hƜĆZ±é7íÜLÙNy„+:Ÿ„zÜ|›Z‡–yőț3œȚ «ÜÎșoCț~Č(EE…Ćrêzz9öëÛńïh‘o=ś@c„.[škwh_zŸœžAȘQż…zöœJMC-ÊȚłF?,Ú _śŠ*Ûf•_xޚtșVę:Քo™ZœÇ–ëăżWrŐîzê±kUÍ"IvmùbœȚÚŁ!/ T퀕š·tł¶%§)Çn•_h5Ć·îą\§ĐČŻö-zï‰Ï”É­…î7@MOeqìŐÔ±hqnœ†Ÿp‡Úy;•Č~ŠŠÌʀʙ™ÚŹwÙ\2ŰMńț­‡;ú—~R”șU?-X©u;éXźCîțáȘŐš•zölŻúćßa„nÓąŸVkăÎC:š](‡ŐS!UTłv=”êÔA­«yÿÁś+NćNԚu JۑŹǎ«Đé&Ÿà*ȘÛŽƒúôhŠê^§ÏàPּ՚»pœ~MNSźÓS!QuÔșk7]Ś4_3ÇŸŻć‘ęőż{[ËÏ8ív»ŚiÁÒMڒ”ȘÌ|Œśn IDAT»ŹŸ!ŠźŚX]źíŹÖQT+Pčي•ž™Ł˜jŰÊ€PÉËŸÖG_ÍŚÏżîŃĄô|™^AŠȘÓXzȚą»]„XŸÊęîÚÍjUxp€öJU€Ÿ<=țű ê?Œ„ŒĆÿQŚûŸSšQKçÏÒM.FÄèÔŃU_iú‘ÆșŁù_ٟ9îšÜہóTTd“$y• ĐëŐ«§ĄC‡ȘN:’€-[¶hʔ)jÛ¶­†ȘđđpIRÛ¶mU„J-[¶L/ŸűąšŰŰX-YČD_~ù„źŸúj3F111\ŚÉzŠŠlșXY»™œFă ŚG; Kû’LМ7ïŚșMćsźÛ_ĄWŁićpÛ3iûȘCÚŸúGę°iąŸ~ș“BÎxŃt*{ít=wÿݚŸü˜„}ÄS”ső œŒn•¶Ÿ6UúT9L;Žê§qĂ5êóíÊ)»ËŹ#ÚŸò;m_őœŸ™ś_}üÚMȘsÖ땘ÚńÁ]șmiąòOîïŰ­űjŒÖŻÛ«wżúŻź>łĐ‹À©ôcrÊą°đ`ï[Gên͛ČBk¶Šź«&ՊulïníĘô“ȚIÎÖàv}?-Aa5U7źĄbòSŽsŚ.-ÿ&Y‡‹ĐŁŚT9żôŽŁJ˜ő™ŸY“$KTŒbă«ÈZ˜Š=»öjőÜ$í8:HOjäÚĆ”iš‚Ć :䏹VŚ6*i#cQxŽgIÈl*oŚ|œńÁ2í·y)ąv=”nàŠü#IÚŸjź¶oKÒí#©Cۉ{ćHYĄ·Ț˜«…ȚȘR»¶ZÖó=7K©GëŚUéònĐQmȘęA]fź~™=UÓ …ÔˆQĂVőćíÌŐțÄDęòÓŚÚqÈŠÿÜŚVᄜĘTÆŠizeJ‚2œ ‹­§æÁV€íŚąÏȚÖÖv e=nJ‘§ïÈŠäßiâìĘʱű(*¶¶šXU˜~P»6-և Ú6è.ĘŃ"˜‹«ào#=+Gț>òôŒ€ÀґącïÓ#_îPž)nȚ ‘‘Ÿ„ęż.ŐŸ„ešùM?œ<ù9ő­Qčc0OOwúû(=+GQ!8țOoI2sŽlöe˜fČŸŸ“ QMZÊăOÖ]ʙȘożą7ŁŐżß•¶K~ÜQčUîgà"ČÙN„íe[”„††ȘU«VjÖŹ™€-aÖŹYŁ””­^œZqqqŠUőêŐUœzu_{TvłP»żzMŸ h݇ÏrΗăà"M=hÈ;Șčșvš#żŹ­ZŒ$QSŠ#Eó'}­ßzP#«$9uàë'őÈɠʰ*€~Gun"[ò-ßpPyŠM<ŻbêhÖŁÍäuÆkćÒŁ ‰ëȘžC•—ž\‹¶€Énš*Ú3MOżŐS Ÿnsæí\UŽW«7gÊtŻ©ƒÏ{őș›šUû›kۘ›Ő:€äűíŚÌ ïiȚuútȘ—êôșOO]­‹6LO˜ŠńoÒȚŸŚkoŚ>Șs>ÉŸ3]›Ö˜j{û#Ü"€ôl‚ąCË4ńÍyÚ”qčÖôlšîaöEU›^„Ÿ ·ëŰòrVU«ëș«ùiŻHfÁN}ûùrí/S§awkPăÀ’àÙŠä“őêÛ4mÆ&5ž»•‚ ‡’ŚŹÒźĆß6fț}țÊ'úyÇj­9ÜZ}Oœ 3'AÓŸIP†ʶwȚŁÛ›—Œ°:u<ńM˜ŒB{æ/¶¶=?jòìĘÊń«ŻĂêêj'ż`pêxâą*aAČZÎęYâÏïÌÌ%šč,[nÍ{èȘ#?iŃüčZ7ș„:čűáÙyl™&Ű€Fż7Êž Ï>ÿăŽÊG8OvÇ_]șqăÆ1b„jÖŹ©?üPsçÎU^^^éß;vìš§žzJV«UÏ=śœŹV«žzê)uìŰń’Ôw^l5cîÙMIČ(°Ó“únöšűêkúdÖ,œĘ?êwVb»)~È[úqÙbÍ{ÿYŸë6 8LÏŸû”ú•„“öœÚôk–ΑŚË­Ö@}8ś œûÒXœúîWšręÒV,öä-ښUrKÇ6}ùÉwžš3€Ûóš3ë=œùҋzç«YúâŸxy’L›v~ńĄægžm†|Û>źoż{WŻ§śŠOÓKĘBJž:ôĂ­»XßaœdjçsŽ2ÓP•Ž=ÔùBkĂMuźčN­BÊ<ž5Ô„mŽŹ’,!­ÔïړA»$ hÔV-‚-rf§èpȚčŽú;’G|7ĘÔ<€\ÛÏjítuOəąäÎóŻûO1•ły„Ög™òoŃ[7•í’䥚WwSk© qŁ6•<¶ĆĆvIŠ ‹ćŽ7_n ˆ WÀyŸâyV‰Uí2A»$>uÔ*ȚW†™ź”c'OŁ0•čy¶äIȚMźÓ-͂˄êÄ]§›ÛùBkèŚć”jș©nśÊí§nw[§0…IZŽâ€țê# \òò ćíć!w·óżTXÎ2œęÁ/ʓż:yOo i"h—$ĂKU[Üšq“ŸQÏPCÛ>Ń[ 2eÊ©#_Ü©zuȘć˜ć**[ĂüŃjR7^1qôNR™wâŽ=z»_cĆÔżNă7Û„â5zȘCCŐꦗ:”¶IŸțw˜zŽo©z Z©MŻ»őôôߔsÆÇ/§26OŐÓCoPÛŠMT·q{uœyŽȚXŽż\ öíŐł~cő}{ìÇ·èóR§ÍTÿȘqZ]üû‡Ă0$w7y{y(/żđwÇț©ă-I2•úÓ\­È”ȘțŐśhĐUa2.ÔÌUùgŒ,^ńŒZŚ‹WĘÁ_)ĆY~ŽŒéśš^jöÄ2ÙäĐŸčÏêÆ^ЊSĆëÇ«CœxĆԉWęás•WöŠnČíț^/ȚÓOíš5Sœ&Ôí_Oéă*Žœ$3_»çOԈ[{©UÓŠȘÛšœșÜüˆ^»Kć?jîƒÍÛì1ęXXŹ‹ȚаȚÔ Ÿ•™r挧čăŽÊ°8ONÇ=œJjÛ¶­”iÓ&íÚ”KĆƧ^ kÔšĄ.]șÈ0 -]șT†ašK—.ȘQŁÆ%©ï|8țŠm%sYBÔkH?ƞL\-ĄșúÖëTăwVGțŐqZÏZșFXy9yçÛĘśÏÛÔ¶ŽÉș§êwnWÒO\’™«œ’WDçĄ Z{ÀQZgœU­Ž.5xŁZ”$ŸfȚzęüËYRsĂ]-ú^ݘ“ ©5R}]ŁĐ’ę9łvhہ‹uڕČzȘ>X–*·èk4äúZ:kw›s1BU'6đŽ ùDÿwĂ0ä]Sѧ/Ą6|àgHŠMEçęƁE5êŐ:Ë){n ô‘a:TXűïò\æPÒîęČÉ]u֒śévŻŠŰ(«LÇQHqJČ*ŠyEXŠőÛ·ïjÂÌuJL·óKó掫°°P…2Ü-û‰ ”đö]ê?âmÍù%UnQőí„ô_çë­Q5đ'ë2ÌąCúeêÓôÀûZŒ+[v™ò <ÏđôüŽûŸ±jí͙ś“<ü»ă<Ź9ó~ÒȘ”w\~A-]ĄEKW(żàâŚûwGà<™Š«±Ę_ëbŐgfŠ«tž”ŠêŐ*Ž”ZMU·JûΖA;2”0û }>w…6lß§ŁYy*(vèôÒÎY©á©ZuȘ—_9ïís*h5ÍÒûé<šąÔ“ï\,QŠ9­śž%,Z5ę,Z“锜J9’-SćßF~ŠŠ (·Í­zŒą,:pšYJÏșX»SéżŃÄé‰Ê k­{îêŠŰ JÚu*8?}sÉ=œœÏrցQÚÿüı;Ÿ7R†ęÎ:Ò(łäá|gûSÌ}:7fÚŽitèЁ°°°’ć?ęôÓ§OgÀ€<üđĂ|ÿęś<öŰc\ęő\vÙeőn_C0ąăˆ1`@p;śú!ńŚ7àÀĄęȘdT»ˇŒ4ûXĐnžèvĂËŒqś@šŰÀV^ž` Ïm:Q]ùšŸƒ„i"M-°'ÓÙœŚOń;}±àŃ=ìÉ?œ!4I(_~0 Ù»ś(AJQßîì=ž·ŃÄŐéȘ|iA2Ś|Âó3W‘ʝ©·_LŸŰłŻ‚W”SÔ ÉŻmÙ:#”š;A⻎àž”˜iÇâ"ĄÓ.î4€I[˜śáÇÌȚòÓżHæ±+:Tù!ÜÌYĂßíĂkObÊ]72ŠIéOUXSźŒá""܆›œT,vCĐíÆ]țeĂIL€™MFvW|>ł2É4ÁE]źËˆˆˆˆˆü·ńûŰk“lÖF©ÏäĆŻ]ôìßçŹĆŹ^± ÿy=9ôóÏl F2ĄśúXšcYčŒE› 錏e+ö°€0 oăȃiŹItíTöź`Kt4‘0}ŸcтÚȅŒ %{9oęu©;’ƒì;s۰“š_wĘű&őšSpm·Yńû«/‰Z§țöodÖìm=?¶ù±Ÿ°ÓcüZΘΒYó80ćŠ2#Òš„q*]š–>€Axt$vĂ€Èë;Vș§m›ś0l€öì\î; ŽœșàzkG¶lćH°OńĘǖu­êű4ŹIżŚ–Ë‚ÛóëêPWĆęȚRù7ߞۘŠÛ†VŸO©›ł/ń9I,• )ÎÈÈ`Ê,X°€ °qăFÜn7M›6eÀ€ŽkŚ»ĘΟ}ûXŽhiiiƒAZ”jưaĂhŐȘÁ`ŽŽ4-ZÄŸ}ûJöíőzÙČeKÉŸÿ[±b5j_]X[t€ăńBpĂ|5sŽżW˜ùŹút.i•Œwś§“~<€¶uáÂkú퀙ż“í¶đŽ„i?„ۊ?xł˜śțWü:gg!ë?ű„UÇČ}#Ž'»UvĆȚϚÏ>eÓńś-ÿ>ùç|ČKJÖw€sb}>ìÉ\û)Ïÿs%Ń=čéw’><žN†ƒ'àwSè«xAʟŸ‡=E•OPk€€âÀw;É)-°SĶuć'Ż©9G\{Îż|)“‚}édVó4 fá°ßÄÒŽ=]•{œÌ)?Ś€–IM±â'móN*^OrdśȚ u±6Ł}Fđ ë~ÉȘdôșŸ]뷐ŽÓ:™xœS‹ˆˆˆÈÿ›ÍZj~€š°‹… 9‡TòyüWțŒĂdÁGŹÀ Šw?Ú[ZœšĘ–,Ú@‘łƒz†ÓĄoOąÍt~țy7țŒ5,ßÀÚ€7ڔûž`„QĄÔgùĄH&ùy˜˜x·Ç»ïÌ`zÉż™ÌÛêÁŠÊˆ6ącë<đŠÈÀv‚ œöę ŸŐł™œ+€é]Î_†„’”R<‰iʔ·Ù0ńźœÍ—{kűĘżŽ„pđˆJæ+'XH~a;ááë·Ú""·€Y_ö»Ša!&¶’z5T“~Ż­K§L, Îccą+­0qÜhbcąâ ęÒ)+]ŻGŚTșuéTòóűsGUÀKĘid»H ÙŹ6ćȚˆ¶nĘÊ믿Nxxqa”.]șpőŐWÓ±cG"##KÖ[șt)Ó§O§Güá uëÖ >œV­ZńęśßóÄOpęőŚ3tèPrssùÏțĂÒ„KË3??Ÿ;w’’’RĄ} ÂћÉăšńь}rt0eĂ;GS˜¶”ïWìŁČńé–FMhlüŰÂWïOś‰IێŹcÖßŸă«œžćŃږ+nÍÌ»żæH0Hæwfü€9 íGŃź,X±Ÿ 6’.šÊyq•œ]šx7üKÏ_Ɛîńn]ÌÂÍčĆW +-ϟ@ßÚȚUW"HÖșÏx~Æ 2bzqęmSè}ŽhÀ҄ÍŹ°m+ÖćĐż©I?™,ùfeq üòŸ9,ÄD˜Gö±e‡‡^íK_y7ˆî9˜>߀±xÍŒ“ĂÔĄÍ +ՅfQûö{‰oË0ÉȚł“Âű$š…–-0T˜~€ ÓÀ]í‡2KDń‡¶ŒœL2Š ©óŚ}ämúŽo·0˜„A|śȚޟł‡«çòyŸ–\ÚáŚQ-E‡–óÙÂę(ÿfë őœț$źšOÚ7ŸómÛ+ŐüxÍś č[æòÁą LG+†Ș|’'‘łÓaÇăőa·Őt”­•–ÚnÙLȚšćŹńŒcp„ƒyęlZŸ–<ÓÀŐŸÇórk‹Țôoneʶ”Ź;چƫœŰ»d@€łûú„~ÊüŸ—q°óV6x "úô§łœÜź °œđ.sWš °Đèò·XüèÊïŠĄyŒ>œŽêRûțö°tÖ<҃\эˆ*—aÜYÍ[ÏŹ/wręmm*™OŹ4“‚‚Âș•ÍŹIęTK(áĄV ŠÈËóeżŰûóòÈśa x'qMúœ¶ztM„ÇS9a©—žŰțö—?Ôš$Ìí7^KFf.WH•#ć„îô^€†^Ż—@ @LL ={öÄUîE©qăÆô릏fÍ*akŃąC‡-©ăžœœLóæÍÙŸ};«WŻÀn·Ó¶m[ Pé>ÂĂĂéÒ„ ;v$&&†À±ąăGSárBè{çŸčâ§»˜™æĆ4ęĘđmŒPș^r1!ł>fYčÚ¶ÔI\Ùó_<¶<3˜ĂÒWï`Ò«Ćˌ$† ŽdŃą4*à\'Îˆ—¶àæŚŚ čy!Ÿo.œŠ„áśńòïûVŐnÌ ù»—ńőîČûv„\ÁŁ·ś€¶s˜<Ș·f,ç Bû™ûöËÌ­ô4ÂéuÉTÎmù_ÄQôփyÛW°áŁŚyaooș&„aeûÚUŹËĄeŒ›Ęùć¶ł4„gŻŸę:Țz‰ƒ]ZÓÈâĆÖn,—öĂڞ‹ŻÁÁ7żcígŻđ‡‰ŽnK˜5€'?“ô=Éi<š‡îËr`ÉûŒ°$Hă–-iŐ$š0{‚Ł{ÙŽőy¶ŠŒ™J%óËțzq]Ôț{vnZÁ»ŻYÙ·QäspûzŻ/€uçf]wšì61œžtâ/<óŃŸęY¶ŽkKrŹ_v:[·!Œ] q›¶‘SîX¶#˜69ç?ÙÂÇÏ<Íâ”dZDYńdìeËÎL<ÖXú\v #šü?/DDDDDj!ÔéÀíńêȘń€źŸŁ8'j6ÿ9üo}~.KŹòšGżáíÏö°D2ô܁”ÌAjkπ>ŃŒùé&V}”ŠőčÚî_\ć1Œ7ƒșۙ»a_ŻÚG†é`Ȁ„ÖéÌ,$ŽO!ÆČ†Ź5«H  ĂIŒáÙ4Áíńz‚zì”îù|Ța‚Ž^Üśù;\ŚŒìwßČÇqőL6Íț’Í7ßEȘ ‡»faačòš>¶oÙMĆqőżÎoUżázĄtHm…ő»mlX±–ÂÉCJ=vEl\±·i„qûv4j Ż\5íśșȘiMőšź§Ńì'Âv‘r:äćÇë„M›6ÜpĂ äææ–Y§I“&ÄÄT|ÁêŚŻMš4ĄYłfX­eßU­V+ŁG&55•€€$ÂÂÂ?~<={öʶ=‘‘‘$''ăńzKÚŚPŒ˜Ą<òțtÚ<ÿï}łŽ]YA"ZveìÔ{xàȖ,ȞĂòčyeŻB[Ûpę«oúÂKŒ;w%Û3ŒŰ"šĐŠûHźșó6.nú ÓF?Ì… ÖL0ąéÏ»ÌűoÎű‚ïWmc_vöˆxZvêØ)Ś0u|ê±Û+lŒ«ÛíŒvw?Ìű˜č+Ó8”À—Lﱗó»».Ą{t=.q{ Èś›`BaÆ~vWŹüsŹQ$ŸhâŰ3žAXçÉüțŠxfÍ_ĆŠóÙìłʘÖ‡sçèȚÎúŻŻ+ż•–cźáVŸd֒m€­^Ćź°8ș¶;^Ę ŽÍhîč?™…ß-fÙŠĘ€ęČŸiĂKbê FőîBń šśƈü5lÜœ›5»·P„Wd<-zŒdÈÈÁônRęí€F ƒŻœëœy|·z5ÿùp)†3’ŠÉ©LŒcęí?óĆCć6ČÒtĐŐ<łˆÙóW±aç–€Ù‰l’Dp^Â:žȚŽŠ·’ÚHr-6[Ɯù+X»c3Ë·ƒ3<–=‡3dÄú6=© ‰ˆˆˆˆœIÂĂ\ÍÊ„QŹIMçó2"‡sëŽ.|óÌZ~xüî3ÿœ“{Đ4ĊÈüćkž{đ1Ÿ:jÚm*wŒ-u.NșśïŽëㅬúr »hÎő’i IDAT“ŠĂzK<ę¶ĆČl_|{ˆ€­ûFŚùóčłÏLhńÿŰ2ƒ‡_Àk·ö$æűśT_W$źo* 3ÖÆ$żĐC|Ld”kŐźżMr~ÁwY&Îțçqn%EÙ=ÎăÜÄx+í+f­żÔî6,‰-in18°őŸß7•äcĆĐę»?ăßdUԍÈ(" Űżk=rMšŚù;č•v. û›O±rÖKŒ4©3śöÁ‚IȚșé<őïœlÉLšŰ­ƒŃšő»œę óD3>ŠÔЖé%ÿoŸœx[RÖÚÍ;éÖ!čȚû ìÙł‹ŐJ«–- e cśžœZ¶lQ!È‘Ó+6‹_ZLn—ËyvZ·:ß)!""""r¶ ƒlNÛGJ«v{G·ŰÏWĘÌœÿȚNi` ‰€I|$FÁQg»ń›Ą)òÔ[0ŸyÙh5žo—~‚eE`i|)3<ÂàcăŰükžfÔ„ÓÙ[››űô«ßŃőűWîą%æÚ!fQôćÌüá!ÚLr–>ËU7œÍúB a íHMŠÂR˜Éîíiœ„[Śżé%Æ_đw¶·»“ÙŸßV«QđŠ Ÿą"¶ï>@‡6ͱZȘNïkŐßf&ŸȚ2–{æûüè\f\Öž’xȚϚ§&pŃ{irőtæ?Ügđ ß2™ûæç`m܍±Ł»ëȚÍÒù?s4<OúAìŸÊČ'Ï).ôRŽ–żżŠŚÓ8·Ł[rîžIŒúü%4ĘRużűŸč—·ÍÆ?öYÖŸ|Ț± QœlțÇ-\ńÄȌ0Ú„ĐÔÈ`û–trƒatœć5Țż»Ś±»Ÿ=ÌŸŁ?wÌ5ÿÒR^>·vƒkÓïRQCćvg =ú"5d”Zq†8 ƒ \ŒŽ‚Á Á@gˆSA»È'HÆî}ä˜1qŃș•LDDDD€V‹…˜šp2łó 6ŐŒ­Íśűż™ęú}\5Č ­"dŰÏo(‰]†qćęŻđ槏VÚ, }è—d "ú ąG©ŒŐÖĄ?ęb,€…ŰŸęêYúĆ ȘßĘüëăgžk|wšúvłjÉrVmÏÄŐa Óîœ@ûùÂ`’™GLTű ßÚôwđđ·|¶ž\}™0ȘQăàmt7–dk€sgłÔ Xš2ćéŚyôòțŽ na·ńÊR.{Šœ=•ÔòçlïÆ]/ț…Ëû¶ 4wk7îĂCHž;épĘ«|úÚï˜Ò§)}›Ù°ł€˜źcčíÙśJí Ąæę.g?l—s¶lÈËËăèŃ bbą‰ŽŽn}ÖGvv6YYÙÄÇÇqș›#òżÇÌgÏöą“‰,óAŃēțŻÿ}6żÄ2êÎ»č€âv‘êx}EìÜ{ˆ€ÄƄ„œœÚŚg3ÇÇźôĂ$·hRى:Őß Ł¶ę.em#ÛőÍ_€"""ÈÎÉ!++›šš(ŒߌÖđLÓ$++›ĘŠ ]ät1łYùïW˜›ABóšÆ†ăȁ7;Í[’ŽÒtĐDÎk­·[‘q:ìÄĆDp$+—„Æ1ŰtwùŽdćQăÀWę]uéw9»éÛżH-EGEqôhGŽ„qŁF§­GŽ-iˆœ&F<}ÎIÁȘí€íßÇ/{Üxę&¶·îƐțCĘ;‘0Ít*""""R#bŁŰčï™YyÄĆDb”Ș,ljA2łòđ4ŠŻŐ¶êïș«OżËÙKa»H-EDD—ŸOA~ȚÈHœÎS?ćĄŚë„ żgˆSŁÚEN'#„æœFqUŻQ§»%"""""gfăۙ~Ăj!62Ls”U#’™›Of^>ɉMëŽőwí5DżËÙI—«Dê >.€ęûN鱁ûś(Ó‘ł…ÓaŁUB#2łsÉ86rX*òdd璙K«„F8uS«țź†êw9;)l©‡ĂA||qĐœgÏ^‚Áà)9n0dϞœÄÇÇáph9ûžBœ$%6%ßăáÀá,<ŠibšæénÚiuŒ<gQàö’”ŰWHęîșWWïdő»œ}¶‹ÔQDD1±1ìȚœç€pìȚœ€˜Ű•‘łšÓaŁuóŠ86v„æà‘L|>ÿ±àót·îÔ2ÍâÀŚçósđH&»ÒătÚHnȚ€ÁFV«ż+:ę.g=+Dêáűä€Y™YìÙł—fÍNJ wŻŚ[R:&&6F“ąŠˆˆˆˆˆÈÿŒÆ±ŃD…‡‘‘Çö=ûq9„‡č qât۱ÛÏȚx«šÈŚWDĄÇK~·ŚGLTÉ-šàtŰOÊ1ÿ—ûûžÓŃïrv8ûÿ:DNČèš(Ź Gf°ÿÂÂĂhaőȚ·iš9z”‚ü žtŒFŽ‹ˆˆˆˆˆÈÿ§ĂNłÆ±4‰Š ĐC^A!ŽRTä§ÈöÖ·ÛŹŰí6BCÄÇF‚Őrò UüŻöśq§«ß濟Âv‘ÓéähFùäMdd$–:ŒƒArssÉÊÊÀâ$>N5ÚEDDDDDä›Őb!2<”ÈđĐÓʔÿ êo‘ÚQŰ.Ò@ÍÈËË#;'‡ŹŹlČČȱX­ÄÇÇâtb”Z«Ü>àńz9z4ƒà±úï6»èš(f9Ă)li`DDD——G^~>^—ÇŚjÎ'áá ÙEDDDDDDDDțK(l9Iއî@€ÂÂBŒ^>ŸÀO0Ä4M ĂÀb”`łÚp88BCC«/"""""""""g…í"'™Őj=ŒŸî–ˆˆˆˆˆˆˆˆˆÈÉąitEDDDDDDDDDDêIa»ˆˆˆˆˆˆˆˆˆˆH=)l©'…í"""""""""""ő€°]DDDDDDDDDD€ž¶‹ˆˆˆˆˆˆˆˆˆˆÔ“Âv‘zRŰ.""""""""""RO ÛEDDDDDDDDDDêIa»ˆˆˆˆˆˆˆˆˆˆH=)l©'…í"""""""""""ő€°]DDDDDDDDDD€ž¶‹H%ŠXűÇAŽNéHÒ±Ém;Ó¶Ëœ{7>üóÒò1Ëlc’óé­ŽKé̀ż,ĂšZ.g)ÿZžՙ€NŚńȚaóÄë<0‹;ÎéCżi°#pÛwF ČÆ5ŽMéH›‘OłJŒ"""""""§„Âv©†•űNC=j$نąo‡FśŻăÛśžáæI—òÀŒCOwćìQ”Æ—ŻÍà‡ô†{VlfęÁ|ŽŹû…œ üd ìû·^›GÚi ńƒ]úŻ|ț …–„†č0#4”PăÔ·NDDDDDDä‘ít7@DÎdVRŻ~‚7.Žćx^gîäë§ïćȚ™żđуO2€Ï3ŒQš'őç[ő?ÿ=c{]Á9‰ s-ŰÖęF^z.™ Ălo]`ÛgÏó·7ÛĐâú1ޱ6äŸk x˜9Ż<Ć –?pé€ÔrșAHXVLW.ęyŠˆˆˆˆˆˆœÙ."”b„&3îOqc+ÁŹűbQțén’œÜ,ÿê{ŐŒBLÍXbè:îb&őˆ§Aópß6æÌÛÎéȘL80ŸŻVy«\nu…â2ŠG¶‡)l9%¶‹HíÙÚĐ«{ ÓÇț}‡k82XùțÜ0y$Ę;w!„Ë@†]|7OÏȚFA%kёő|ńúcÜzùôêAÛĘé2đ|.čûæíòTXżpÇwŒòÀ4Ɲ3€Ž:“Ò„Μ’ÿü*ł6ćRț…;ŸćĆß_ËšœiÛŸ]]À5žÁ’Ă5+pŰ=É:3öčMűÍÖ~đź3˜ÔŽ]évëçd”ĐÇțEÿàS/ n€tìEï±ŚrÏ« Ű]ț4ŽŐ%o{é»ìń`áë⊱CHíԅŽ}Æ2ć7Żđí>àđòśxűŠ‹Ô»m;ő„ÿžűă{kÈȘąTŠ{ÏBȚűó͌6ÔN]hßs8çN}WżÛUR†$xű#źé҉ä^żcvNć©·ûÇ‡èŚźm§ŒÍÎR|}úÓłá~3y ŚœżŸ@`?ÿžŒË±č:Ńé·ßà+ł¶#pˆĆÿű?ŠNN·Î]iŚmĂ/œ›gŸN«PR„űqêHʄżłčô5ÁȘ=É-—ŒŁOśî€ŽïFjż±ŒŸz±„ęU6;ÀŽÿ<Ì%Ł.ç…M~ÌÂ/ččÓńč șqŐGË<ŚjÒ/œq]ŸT’»\Ê˛|ćŽçgû?źŠsÛTzLû7{ŠòíS72êüÇùÙcâ[ô0œÛ;~‡ yikńIĄÇĂvl9UTFFDêÀ$èÎ''Ìòü»ùśoŠòÇy‡°6JeđŰțD`íâyüęw Yžù5Țż§7%; °ç“Gčû™M„%uŁïˆ^4qyÙżz!?|ń ·.ÛĂ+ÿùçÆoàß>ƒë/}’„ùŽîӟq]x3°gëFŸÿp‘ĂźbbÇ_۞œäYźče:ëĘa$őÌÄsœän[Æąę«Ÿ_ÁßȚŽ‹ZÖdŽÉŃĂ»űùé?q˛[ĄQ­;6ÂÒȘ)‘€‡ oĘÊ5O/%Ëь^ƒÏeHž›Ę+óÙł·óęâß3óÍëèRv݁‹yćśïòé:śéĂÈnvŻ\ÂȘ/_á–u‡xâ6//țù+ò[ő€ÏàQtËȚʒ%‹yÿ‘5luÈżnhSêĆĘ$sńs\ÇÛŹÉsĐ€SO†ôˆÁÈÚĆꕟòäOs˜=őyfüq0qFqᐧùń›EÌZÍù“bÊ=¶…,țb>GL'ę'Ł•”aúÓŽ„‘2|çäœĂ7{Bé>ù*†%Z{»ÖeF€äłà‘+™ż8@Ç>=Ő9OúZ-ĂKżY†Œyû’Ő_I6łùț‘+žé_{±6é ă‰3r8°o›W|É;yížôÊțUoҜ“G’ûÖWl ŠpțMcH±XiÙ%ôXŸŐŒ_Ź-ŠđŚ?-dÂ}ßńʟȚfű·’ê,>”û?ùăó+)ŒÁӏ^DKëav5îÁ„óòyś“54Îőt"À҈~qÇÎ<4ŒP . Z=GDDDDDDDȘfŠ4Í;ö•ü;“ŹÙŽăt7ῐÏüáÍä6]ÍkțaË/öź1ÿ:&ŐlŐn„ùđRß±_ÍìOn1Û¶I5û?ČÔ,*YÙoŠœ}„Ù1„“Ùęš·Í żî­èÀó·CSÍ€văÌżźò–9D0s“čdęłÌoęÌOnd&§t5/ûç3PŒsŐcÌÖ)œÌ«fŠ—:źišŠŚ<Č5Í<ì/”ߜÌû‡€šIƙ|{°Ôúæș—/7;„t2»Țű©y P}ùwœm^ĐŸƒÙșÏ`łg·‰æęŸm5sËmăYóŹ9ŠCGłőàߘíô”jÖNsæ Íä”îæo€™%Í+ZcțudȘÙȘMłőĐ{Í/öù~Ę&­ùô€nfR›f«”Țæ”ژ9%]0ÏčÏìßźƒÙzŰæòRÌúÆüí€NfR»Qæo>ßm–j…éĘ;ÇŒwt3©í óöÙGÍ iščsï5{Žíhvšö±y€üŸ;ÏŒ«W'3©ë-æGÇ6TšÁLóĂ뻚­Ú0YVTqyéŸx—ùïîR ęfúçż1ûŽí`¶ęÿÌ5„ïăS›ńݘ›üÇő©y]çŽf›Q™‹óÊ&·ŚÜŒ'ŻâsŸ<ï|ówĘ;šI]î1çx+.źuż›_Ü5ÔlÒƜđ†âÇ©h»ùúeœÌ€vCÍÛg2KwaŃÊż™CÛu0Û^ûaĆÇÉ4MÚæÄöÌŸęlú*.9#œmčÊȈH­ű3áĂÿČABR/áČ^'7ë_Çû3Śà¶„rÓCŚ’Zj&G[ÓŃÜ=”;¶à.>ÿte™r!FLúuŽÇQz_ÖŠŒ=Ż'NìJÛĂńŠ)0±ŰŹćF4;ˆoۚF%CŁMŽÎ}YLâÎż›?ŽlRjx(]źż•  wŃgÌ9PE=–rY^:üț%» -e^È™łÍïbȝdJ’łTł’žôź‹hmń°țłÙe˛NzOû-ăKőmXgźŒ°+6Àšx!śĘÜíŰèy F^Ây V‡¶±5ëx!“ gżÇŚG rôoyhbKJ”Gó±<ôÀ“ÉÜ音+C&0&Ț péWÌ;\șLČÌæûˆ:g"ŁăŒ“ÒŸ'd8è1íŠ$—ŸÀJłqW2ź©ÿŸMlÌ:Aáś"Ț€ X±–po oNûá'Ÿ[ŁZuèK#Îè!.H(bęóêú<¶üăa^XáĄÙ€‡űżqkUś­ž|ŒAhš«žç""""""""5„°]DȘà—ț›nčƒn˜Æ%GÓkĐĆÜÿéÌ€ńüőÙëép‚j+=+XŸ?€5i0C“ÊŻl!Ąs*M,A2·lĄȘ<Ö ű(,È'//ÍEˆaâőúŽŐƶŃuÜXZÙÜ,|ô*Š>ń‹śVšŃ^Ìǚ„kp〜°~D”_҉níl˜țílÜ^ł©/ÈĄ\5čeÚ\țÍ,]‘CĐ–Ê°ÁńO[»ź€ș »7ł„ ÜBKsúôjRîÚBlă8ʆAH—tv”Ûƈ„Qœf!îăgïeÍòőx±Ókű b*I]ĂŒ`@8ű7/cyŽ ź~\8źÏJfÍ=XrA3“ïŸű‰<#–Ń“Ï!ʀ“ŃŸ'diAß>‰ߌ,ń4id€Y@~aőa»?„ńąîšÉ͗?À«s6‘QÔ0Í+V·~1âFđçÇŠĐČh#Żțæ*n}qȚńŚ?Ž ¶–‰čĆJ˜aà UŰ.""""""rŠšf»ˆT#Àэ ùfفa”ኈŁyśQ\0êBŠ^~ÉĄ'Žń‚‡p(țmŻr~ûW«\ÏVÇŻiœM_ó|ÊŒ%Ű~0_°t€j!¶ÔOa}Ï{ŻGđĐăïđĘô‡űń§hŐï<.»úź™Bäńd6˜ÍÁƒnLłˆ9żíCÒo«jA~AjPíÚÚŽ­B*Yà?Ìț#A(ZÎ#CSy€ȘŰ È/ òk#K,ń•€«`YIˊ—bš˜æ±Ÿ æpèˆӈ&!!ŹòĐŐєįÌ]‡9p$±zNGò?ßd՗óŰ{ŐTZYÀ<ò=ł~.Ēp =¶ÿ†ïÏČÄÒ8źČ3©äü«ÜGs.{áXž|”g>™Ć“wÌâčűNŒšr9SŻž@ߊćŻdÔRûĆ zÈïùëćKčvæVvX[qíăś04șqyH(.«AX˜F¶‹ˆˆˆˆˆˆœ* ÛE€Îyâ{Țč8¶î]Đ$XqĆűŽ„W±šߋâ Ő$ó‡Çžäö‘f6„ßä©<Ô·Ícñ[(Zń7=żŽÜÖ6†ȚΛƒźaû_đáGńÉüùÛϟòFÏëxᕻ_\ö$hF©ç_ÆĐÄȘÎÊN»Ö5|yŽ”/]sŒibš`X[3zêÚT”;k :‡•k‡aĆn­șÇ K͍’U«ËŸÍâÇ3j[êx&”ŸÎłkżâ«Wskƒƒß|ÉR…Vă'ÒÇùë† ȚŸ'bX±ÛêáčôŃśčàŽ5ÌùäcțőïŻ™óƃ|=ăMÎđ%țß„m©ìJÍÔŁ_‚™€íÊ*ŸŁÀÌdë–#DÔțÍÚâ"ÌeÁ„°]DDDDDDä”QŰ."'•„Qcâ-֕ËN'(;C`<śiŸhFęí}^»°)„7ńdę«êm­€ »‚? »‚»ś-äÿÌK?MçîÿŚ›;‡0K91ÒrÔ-Ü?ŸȘèżŰăikÁ<Ï ©żăڄÓP”ËMBÓ 3—ôęy˜TrŃÄ·Ÿœ‡ƒÖxš6:ÖFk&^Е—žXÇì9;čéÖPæ~诔-“&ŠțúÆq*ûó$q6é΀Ûș3éæ{Xÿé3Üûè§|ùŃ”ïLnJ>ѓ” uî—"¶Ÿó OęT@Ł—ŃkëG|ę샌ÙÿníPËŃö¶nÜüśŚń¶ŠVŰ.""""""rŠšf»ˆœTÖ€Țômb%°cßlśŸxƒÀÒö0m5Ź eăÎ{ÒvQt‚*!źæCčó‰ée ’”q#é'Ęûv!Kżę‰ÍŁY/¶ôïŽĆżoæ—Ș}~J9éȚżĄűXùídT8_“ÜŸŸăç°¶ïCï’r%ZŒ›@ߐ[æ}˶ôï™łÖ‡œëD&„XËîżÁúӊŐ˜üț“ùÀTuűș\ü^ĐĂ·…ő[OTcȚ‚qŒœÜșő‹wă[ÜśüJÜMÏçÿžx'œˆ–Ț5ŒűÀŹó”?|ńf @„ĘeDÒșw?:6Șă©5…í"rr9zrŐŐĘp6óÆœO2oŸ·Ü òvŻfăĄc‰„5ŽÆq`OzÙpȚżïK^ü`+eäàúelÍ.ŽšälÚÌŸ Łiń MÏż– Y_?Áœïź§üfŠśŚî"ŻȚyoĂŻœ˜667‹Ÿ»Ÿ–„ü„†ąŹ4VoÍ<‰AŒAŁóźć‚D ù ^à‘ÏvQ:łőí›ÇcO~ĆQą~ő$Z—Êe-MF3y`­ßóï™óXísÒś‚óhY&»mÀț4\4nĆÌ`Őò4|ő;ńj™…i,_swù6ùöČq[.Š„ ‰MOR[ăioÁôę’•ùćÖĄ_Üëx遌YëK`ò#0&ÎJÔà{xìČęò&śœžŠÒóèZâÓȁ-ËX^!ÍrpÎCŒ0˜w|ÌΚ›VDDDDDDDȘ§22"r’YI™úmžŸœÉÍcŸŠmśźŽmìÂtgspŚf6ìôrȚ+‹yaŽŹž`J*3žYÏ[wĘïš±tŠösxóÏüçӟ±J›č?UČÿÛ?ú=Ś~ì'©kwșŽnJŽ3@öȚőüŽx3GíčùÆQÄŽmD ćÁgn&햦űöńËôN*=;%m󓟱-¶r8ùNæ|r3őÒăv^|` Śțu/\=šuìN·€8Á2śïà—éD\ę. ț{òź|†àÏȚƖ›^aöę“Y1ŁœSb1rvČrÉx\tžò ż IÙ6±Œž<”èïçòț{ŠÂ†páčM*ŽłáúÓNÏ ăhőÉL6Ÿr-Ö §Gc“Œ˜1<úû‘e&Ä­/3g Ï\țëăÛÓł[{Z4 Ăâ9¶e?±|F#oäŠÎ' ÛÛ3nBŠżđ 3oœˆŁúĐÒVˆ}ÀoxxrKŹ”ê—–=śG^ßä§ùĆń§1Ć„_ŒßóWütÿœț Où‡D`–fÙÔïV,šËï'_ĆÜAmpyŠHœá1ŠŠXÿí6ÉÜ?e9SHźdÂ]iX ÛEääł”äÂg?ŠĂÈŒęŃ·,țe1sVű±„D‘ĐŠ SîĂ%=ŽżÙèpÓ«Ì{‘çßûŽśŸü Ż=‚„v}˜đÈ{Ü>&“§Ś,dÖŻ;§Ó·rmæ—,Z»Šykóńšv"·"uÜ­‘:SŰ."”æÈËw“WàĂ$Ìća1*]ß0 ʆŐbÁi·ꠚžœ>r ÉÍwBDžKĄ»ˆˆˆˆˆˆˆˆüWRŰ."5fš&_Ùù‚A"Â]žœŽ:í˰„șœ„șœÇBw7qŃá„8ìFćÁœˆˆˆˆˆˆˆˆÈ™Ha»ˆÔH0h’[à&'ż—ÓNXh8– Ä]NN‡‚B7‡3s‰ %2̅„Š‘ò"""""""""g…í"rB@ìÜò ÜDE†RÇŃìŐ±aĄŰm>Čsò űDG†a”ZüX""""""""" Ma»ˆT+4ÉÎ- ·ĐMlTÇÉ}Ùq:°DYÈÌÍ &*\#ÜEDDDDDDD䌧!Ł"R%Ó,.“Wà&6òäíÇ96b##È+p“[àÆ4ÍSr\‘șÒÈv©’ÇWDN~!Q‘a5Ú·„í`ę/›IO?@fV™YÙ€ŽN&.6š.;‘Ò: —ËUí~Q‘aääâtŰê<«ˆˆˆˆˆˆˆˆÈ© °]D*ćÈÈÎÇ掌šFûÒ«˜3o~Iž^Țö;ÙŸ–źXMˆ+„aƒ2lȀjCś§ƒ"żŸŒì|šÆGałZë|>"""""""""'“Âv©T^Ÿ›@0HXhx”ëčĘn^zímÒś,ù]LtmÛŽ&66—+·ÛƒÛíf[ÚNö8ˆÇíaÎ7óY°h1wĘ<ÄĄ*śꝕK^Ÿ›˜šêÛ"""""""""rș(l‘ üy"Â]XŒȘ''MO?À[ïŸWȘTLçŽAÛ6­«Ü&3+›Żç~Çȕ«ńž=ŒűúÛ\8qęzśŹt}‹aæ"/ßMDžKŁÛEDDDDDDD䌀 RE€‚üf”uÒĘnw™ }òÄqÜyë Őí±1Ń\yÙîûí턄„àq{xÿĂOIO?Pć6.§ łž]"""""""""g …í"RAnĄ‡°L`úâ«o—íÓźœ’aCÖꉉ Üś„„„ïïő·«Źśær‘[š°]DDDDDDDDÎL ÛE€Œ"żŸąąąjG”/]±ŠęŠkŽOž8Žź;ÖéX±1ŃÜuË4 ‘SLa»ˆ”a±X0MłÚÀÀíö”ùÙćrqá€óOžÿź;Ò”sÇ żŻ*`/Í4M,ʐ#""""""""g„V"R†Ć€ Yu­–”ÖI@íËÆÔFùzđÇMKőŚDDDDDDDDDN …í"R†ŐfĂTč<6ŠžVûö;+]țäł/ó—żțż uŚĘn7/œú6ś?ô™YÙ¶[ża1ŃQUÛ`”é†9ó(”‘2œ6EE~œv{„ËSR’Y¶r5éû’™•]fbS€ęđâëoÓ-”#111ž=ÖoŰXČgdfVŰnʆ@գځâv)l‘3F¶‹Hź^ŸŻÊć]S;R<9êŚsż«°üŠK/$$$ÛĂÒ«™óÍ|~űqqIĐ~Îàő„+V•LŒÚ·O*íőùp…8j}N"""""""""'›†ˆŠHaĄN2rò0ƒ&F%Ò].Æ dÎ7óY¶r5Æ $11ĄdyżȚ=iÛŠ5 țÄ¶Žì?pf MiȚ,óƎŹ0ąĘív3gȚ| ž|U#ÛÍ ‰Śç§IœłÏVDDDDDDDD€a(l‘2ì6v»·ŚGš«ò`{ې,űq1‡_›ûwG™=6&š '_ŁăœűêÛ%ŁȚÏ3ąÊőÜ^v»»ÊȈˆˆˆˆˆˆˆÈHedD€‚ÈĐ Üî*—»\.îșeZIč˜'Ÿ{脚'âv»yêč—KjŒOž8źÚzín7‘Ą!”:†ˆˆˆˆˆˆˆˆÈ©ą°]D* ÓÀí­șv{bbN€Ç]<ÂęëyóqWÒ·tĆ*žzîÒśí}{ő`ېUźïöúÀ4ŠÛ%""""""""rR=©Àf”Bn§ĂŽĆšX»Šëł7OHàĆŚȚÆăö0ç›ù,Xޘn©éÒč.W.gnŻ€u6±~ĂÆ’Č1P<ąœș =hšäž‰ Áf”6쉊ˆˆˆˆˆˆˆˆ4…í"R©ˆp…n"ÂB«\/11ûŻç~Çȕ«ńž=,]±š„+VW»ÿ”ÖIœ;fD”„c ĘX-"Â]u:‘SAa»ˆTÊf”ÎáÌ\ì6!NG•ëÆÆDsćeS8oìH,ü‰mi;Kj±—EÛ6­éÛ§Ç CvŚ‡Û[DăŰHj‘3šÂv©RˆĂNTx(Ù9ùXą,8ŐżdÄÆDsá€óK~NO?@Ą§ž†{MÂőÒ|>?9čDG…â°ŚŸń"""""""""§Âv©’aD†čűdææqÂÀœŽÄĄ:Śç󓙛Gd˜‹È0F5ăEDDDDDDDDΖÓĘ9łY,ёaD†șÈÊÉĂăőÔăyŒ>Čròˆ u†Ćą ]DDDDDDDDÎ|Ù."'d”Zˆ‰ Çjł’“_H‘ßOXš KŽ8š&…nÜȚ"ąŁÂ‰ s)h‘ÿ ÛE€F,ƒšpN‡Œì|ÜYčD„čpU3qjMčœ>ò ÜX-ÇFâ°«tŒˆˆˆˆˆˆˆˆüWQŰ."5f.§ƒŠńQäć»ÉËw“_PH˜«8t7j1Ę šžœ> Ün0 "ĂBˆwałZO∈ˆˆˆˆˆˆˆœ ÛE€ÖlV+1QáD„»È/đ[è!;/§Ă†ÓáÀn·ałZ±†a`š&AÓÄPTäÇëóáőù±ÛíD†…ą]DDDDDDDDț«)l‘:łY­DG†F‘ßOAĄ·ÇGÛKÀï'hB0Äb±`1ÀjłáŽÙwčhçÄnÓKˆˆˆˆˆˆˆˆœ”t‰Hƒ°ÛlDGڈŽ ;ĘM9ć,§»"""""""""""ÿí¶‹ˆˆˆˆˆˆˆˆˆˆÔ“Âv‘zRŰ.""""""""""RO ÛEDDDDDDDDDDêIa»ˆˆˆˆˆˆˆˆˆˆH=)l©'…í"""""""""""ő€°]DDDDDDDDDD€ž¶‹ˆˆˆˆˆˆˆˆˆˆÔ“Âv‘zRŰ.""""""""""RO ÛEDDDDDDDDDDêIa»ˆˆˆˆˆˆˆˆˆˆH=)l©'…í"""""""""""ő€°]DDDDDDDDDD€ž¶‹ˆÈÿoïŸă€ȘŻÿżïŸ3łŸÂÒEȘ€€X°Ą€b‰‰Ä„Ä$&FML~©-šfLŸ&¶DbŚš‰ ± ‚)‹ )+.EX¶N/śțțXvgÙöőüGœ{çȚ3s‡áńxß3ç€ ¶!Âv2DŰ@†ÛÈa;"l CÎlt„e«6d»G0Âvt ƒú–d»MŹÙP‘íÚcdÈa;"l C„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;"l C„ídșíú ĂP<‘T}8ąh4źH,ží’ĐArŒù|ę9òž]Čm;Û%’ÛìS<‘TMmHi+-ŸÇ­Âü\•x]Ù. $K*«ČȘFÓĄüŒ€S>·CțŻÂ±„Șjêôû űéro‚°è`ĄPHĄpX±hìs=ßëó*àś+ŽseÍՇ GcÊ úću;ćv»ć0MŠ!âv€ÎÖd[¶\–%§Ă”ÇćT}8"I űsČ[Ü!„°è ĄúzŐÔÖ)•JízŹžšPčččœN™æȚŚ+¶,KÉTJuu!UîšR,S,SMM­òórÛœÖx"©P$ŠÜ@Žü>Ż‚vì•ÇíRźß§m±žâ‰€Ü.ąæœÏ­±ÚšÚ]A{qQĄŽ4 ă œ)Û­Ł PqQĄ$©Čr‡jkj3>n(•Ïă‘ÏÛ~”àÈăóșćóxŠDł]Ê!°8jkjU]S#Iê]ÒS]Š u0Fž†Ô„žPœKzJ’Șkj2Üјr| ‹Ą­q˜Šr|n…#±l—rH MÚY(ÚŽ—ö)‘żVdöûsTÚ§DRCà …>ś±ą±žr~DÀ>†ĄÜ€_ŃX<Û„ہv”H$vŽé]ÒS>Ż·ĂÎíózwužWVîP"‘űÜÇ2L‚vì9Òn„í@;ȘȘź–Ô0Łœ#:Ú[òûsvÍpoŹćóà+mAŽŽa;ĐNBőőŠEæS5ȚÙĐxîX4ŠP}}Öê:Âv ÔÔÖI’úőí}PCm+ĂhšĄiM.Âv „B!„R)čĘnyÜîl—#Û-·Û­T*•Ńb©Úƙí€#A(–$櫏ŹL555Ͷçç竎ŽTùùùÍŻ©©Qyyč$”i»€6ïß·_?mȚČMĄpX@ ĂW`_ہ „Óé]łÚ7oÚ€Ùłg«ŹŹŹÙ>ŁFÒŹYł4jÔšf———köìÙ’ÔŠí’ÚŒÿ„—^*™ź]”u«BOßòšó™”ë!Ă0ćpû”WÔMꎥ“&§Ł ČńŐc+Čp¶~òàjćžüĘtA?9ČPŽL„í@†ąŃš€†…I?\ńÊÊÊTVVÖŹóŒŠŠfWßZGzÓíRCpȚŰ%ż·ă̘1cZšnÿìłÏ4tŰUîšjçW܆WĘúöV±G’V˜8B…eïjù{+T7ê8ćRtU™–ŐKŸ‘c4:—šûFŰdÈćt)JËČvÏ8iìTÿßÿț'©!(oKG{ÓíłfÍRYYYłśÖŽßš1Œo ì›ÖÔĄÌB?ÿ«šČs.{|ęóșéŻ Töì‹Z>äđ7 Żm[¶$Ăìą‘§ UśÖRqłP}<-Žś?2ßŰPî0Nșœ§>^ŹEUcuzaT+­RX~M7D~Čvìa;!—Ë©XLJŠRÍ:ӛjÙŃȚ–íM;Ü[ŠÇÉÏÏW2•úŒ/«]yúžŠ/û@ÿśî=țÂ( Œ`àîuGPyCv]PC&MŃ©lÛ!ŐÔÛRaËçŰȘȚQ-K†‚Aÿț§0{hâńœőÒÓ”péz|…­ŽÉ(˜ ‰ƒśHű€=¶òx<ȘŻ©ź.€ÒÒR͚5K3fÌh¶O~~~łŽöFû7țč-Ûśvü–ÏWW:đt0> ;{ȘF­xTKß~VύčB_ê·s…TGO îëŐëK+TöaN9± íóŃí*­Y[%«Oqó@ĘÚŠćUÉ2|êÓ»ž +A*3NÇÌùD+Ê>ĐúÜMZ3ÔőÄ1à:ÀŚ €N‰°ÈÏڰbgćŽ* <à€3mk§zSrü•«Ś¶y߃ÍÈĄó§,ÒÊÿŹŐëOŒźă~|ŠJ]’äŐđIăÔ}ÙZőÜcz¶ÛWuöÀ Mž› ŠuőíáoÄÛi•ż>GoÿŠNìș3·ăÚ8ïœČْYtŹ&j[Zn‡êÄásôÁâőÌ;•Š›=4~lŻfuXÛêî»_ÔZŚ0ÍüȚ蝦0“ŸŠì)ĘńćJőŸąËż1N ÓsZ{G"Âv C‡C^ŸW±hLńDB·;Û%I’≄$Éëófč’FŠșLœźłțMÿÛ8_Œ>B?Ü]NIźŸgè;_Üąż<œFÏęíVœÙ«J»äČăȘŻÚŠ›Șć;é»șń<łđÛp—hhśOôàmżŚęûšGĐTdë­üŽV)wOyŃЙîŐЉŁÔeŃ­ZgÈŐŽÆ7 o+Č~…>ŰVÊXŠČ_ĐèáNIi}ČümȘÉ^±BGŽS·€±Çp$ąÏhż_’T±ik–+Ù­±–ÆÚ Žî:ăŒ‰ênŠTțÒÿôú¶Æ\]*™ô ]ûĂóuÖ±%òŐUhĆČeZŒbƒ6Ç4ń,?ŸÛ_X¶ИŻ]ź+Ïê/wć:-YŽ\++*1IߌêR7ĐŚö‘4’œ„cvĂ„ÁăFȘšÙ“ ćôȘĄ…ćtź‘œc‡ú Šn>Š† Հc?àHd۶mg»VoŰŽëσûöÊb%Í-[”Aƒú–ôóTTlR*•RżŸœłȚĘO$Ž~ĂF9N•”Ű”XłĄB#î{*k'ézòæżknu?}őșokRnûÙvtčîûíCzßźoÿzŠŽ# ŰŻÏ›ż9Ô łh'ùyč’€ő6*›·°l»Ą†Š5ŃÚ휶Uœű=-‹Hy#ÇjA;a;ĐNÁàźùè•;ȘČVGăčœ>ŻÁ`Öê8ÜXUËôŸ—Ö)áì„S& 'Ûà°Â©@;*,(ĐæèUîšRŽÏ+ż?§CÏGv…í…zîÑ”e‘žxăS%S5ZÿámŠžT:ő\ŃÓ±ÿ'M¶íÈív«žžH••;ޱbłJû”ÈçővÈ裱˜6Vl–$ɝćčń‡;ŸC«—ŸŻÍqS9Ć}uÂŽłtț‰%âÀbTŽ›ÎŸ@jS”5”Șź©‘$ő.éyĐ;ÜĂáÈź œ ?_yùyŸûXŸnÙźž] äÏńÊ0˜[€œłm[áHL›·Wëš]űù, `żòòóTŸ/IÚX±YÛ+«Êą©¶-mŻŹj· ]’ü9^…ŁqY܇À>X¶­p4.NÇLv8Ô¶I^~žŠ‹‹$5,ZșjÍZƉv;~<‘ĐȘ5kwÍh/..Ê8h—€@ŽOáhLÉd*ăcàȕLŠŽÆÈńe»”C3ہƒ(Èív«ȘșZ±hLë7l”ÛíVIŻîò|ΙêńDB›¶*±3žśúŒ*,(h·í·K†aš.•Ëć”ĂäžšK[–êÂQ†!Û%Š•¶ÛíVśnĘȘŻWMm‰„ÖoŰ(I*.*Tnn@.§Sf+Ą¶eYJŠRȘ« íêb—$§Ó©üŒ\‚Áv­Ś¶mäUSRŽŚŁŻGŠÉìv4°,[ŃXB‘h\yA‚öہ … ‡‹ÆTčŁȘY€Ț^ŸWż_@à UÚĐĘîśyTUS'ćçÊçqËá Ă łK§-Eă UŐÔÉïóÈăve»€Ca;ĐÁ€€Ò鎹њâńž’É”’©€ÒiK»VR5 9Š\N—\.§<|>ŸG‡Ô ű%IÛ«jđû”ëśÉćtÈ0 î…mÛČm[ÉTZuášBáš9^~șڛ lČÄápì ȚE¶m+àϑËćRMmHőĄˆ>ŻrrŒ °Â4@§ŽÆ‰ÄŠÆdŠ ò‚Ìiß Âvûäq»ÔœkĄâ‰€êĂŐn«R$ÏvYè 9^|>Š òÙś°À~Ù¶-·Ë©ąü\)?ÛŐ [Ú[NJ‡dˆ°€ ¶!Âv2DێN!‹±xp°m[‘X,ÛeŽ;Âvt ©€•>–2€IDATíìt$æu„íè<—Ri‹îv ‹lÛV*mÉăqe»”vGێN!7àS,–PÚ:ò‹Že)K(7àËv)펰‚irčŠ'’J§ÓąÁè8¶-„ÓiĆIč\™†‘í’Úa;:‚\żR©Žą±„Ré4#e€Đ0:fg.—J« ڟí’ Âvt*Ɗò”¶,Շ" ]î–%˶ Ț€vdÛ¶,ÛVÚČO$UŠ(mYêV”—íÒg¶ :’aê^œŻêș°Șjêe†|>Ün§|O¶ËޱDB‰DJŃh\–m«0?xÄvŽ7"lG§TëW^0GuĄšêêĂȘ­+Od»,àˆàőžćóžUTnÀwDÎho‰°–iÊæ(?˜“íRæ˜Ù@†ÛÈa;"l C„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;"l C„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;"l C„ídˆ°€ ¶!Âv2äÌvÀ‘̶mՇ ‡ĂŠÄâJÄÙ. @;s{ÜÊńzäśû űeF¶KY@Ű$uő!UŚÖIČću{T\T(ŻŚ›íČŽłX,ŠX4ŠêÚZUŚÖ© /WčÁ@¶ËŒ°hg¶m«rG”ౘr|^ù|>9ș]#”Çă‘Ûí–?V4UMmâń„Š‹ ű{@'BŰŽłÊՊ'ÊÍ͕Ûí’i:$ۖm7ńŽ<† 9.ùęŠ\.·Bá*wT«Kqa¶K„RvTWR,SÀÇă‘a˜Čm[DìÀ‘ÍVĂÍ4Ă0ćńxđ‹ÇTWÊvi ƒ¶íĶmUŚÖÉëőÊćre»YärčäőzU][Ç/Zè$ہvR KČćőúdšüŐ:3Ó4ćőú$Ù;żÀ‘ŽDh'ápX^·‡ €€»ÛŁp˜°€Î€Th'‘X\ŻW†ad»‡Ă0äńz‰Ćł] èÎl)ń„Œ‹ĄÔ¶{=%â‰l—:í@;"hĐß t„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;rf»­KŻœO]ô­J5>bÈ0ò ÔœśŃ}ÒT}ćÂÓ58ïPżoféłÇ.ŚŽß-RșËșëùŸkŒ+Û5áĐÓÒ»ŸŻÿ»B=Ÿ|łîŸrŹF¶kŰ·C=ĄЌ-ÛJ)Z»]–/Гw^Ł™_ù„ț»1”ÿ§‡»nčžșû>=ûQdύÖ-g•vDȘ”êí2m”:Ÿ>€EŰĘ5óî7”tŃ»Zòîkšśô=șő{'Ș§KJn}M·Ęöœ>#ÄaĂVŐëÿÔmÿű§ž]‘ĘrłÙCÓ.żL_>ç|]țƒêëÈF†12ÀáÂáĂᐗŽÒÔïQŻèÚ5»\áEŻé­Ú:Ż€Y8 XÛ5oÎ"EśHÙ™*>îkș枎, 3„íÀaËŁŁÇWàrŐŠ¶hóVK*hÚŚŠ·ŚœÍŃ[Ë7jGÜ©`ś~sêyúÖ7§é˜sȚíú5ç멌–jUĆ…ÓNù zjÀˆń:㌩š1yˆ ÌŠûŻŐ܇ÔSŻ-ÒGŸV)bûTÜ{ˆ&žyĄŸqŃI*ÍÙwđomÿŻŸ?ăfœóê„kŸÒç«ć3ąïÜŹsźxZیŸșôߏèŠc^ŸU»RÏΞ­'_]Ș5[êeû uÔ1töƗhæ =ćió{˜Đ–…OköcsővÙzmȘË‘Sš^†jüŽŻëòó‡)ŰXTșJ˟{X<ó†ŒE51Sțź„qâT]<ë|Mèánväôš»uáÌ{T>ü*ęïíéÙșÿ™ùZș~»ąFP=«É3/Ő·Ïì§CRș\śÌșHûĐRțŽÛôüM“hQ­];W?>çZœrkÌOŚ}3{6ü<)]©%OÎÖżž™ŻČuÛ1üêÚwžNțÂĆúöùŁŐ„é7}ò}Ęxöz"tȘn{őw:Ł~Ąfÿćzâ­5ú,Ț[—Üû€źê8 ÏƒÙ€śæ>§_{OKV•kkuT¶7_=ŒÔi\ąoMŽó}ŽTčp¶~ÿç‡őÒê˜lIïȚ8U#ol8ŽsەzêțŻ«ÔŚÜŸžźŸŸ—çŒ[ŽàśgÈÛìÍ=ÈŚàs lcv:-˖dșćr5I í°–Ęs•.ż«Lu¶)_A‰J»ŠôÙÆzyö -xc©nŸëŃugZ^ąÛżęCĘż&&9ü*îu” UÚČ}ƒ–ŒČA+kÒ™“‡š`çáSsuʕ7èÙòžlÐÓ#ÒgkȚÓSkjÎÜóu۝?Ő€âÖ'U™Ć§èœăïĐ;óBZ<çu}6ăuo¶{D‹^\ JːkèTMÜާ·Œ€k/œ^ÏW$$gP=zś‘»~łÖœś?ĘŸpŸȚșò/úë7†È·ß7ŻN‹ÿq•~xïrŐY’dÈ4 „ê·iĘÒJƏčH?n|KckőŰ/źÒ­ó?SÊ6d:=òčÓȘߌRó[©7çŒŹïüùv}tî7 RëȚŃ=Ś=©ççT(ćđ*àwËźŻÖ'ŒȘ{W,ÒGuÿÒÿ}é(9œ5mÚĘęŃŐŸ5WoڟŹ3ƒMf«účz7dËđŃ9“{4í‰őzì'—ëwoV*-·òzőVłZ«ȚÔ#+ßŃkïęBwß:C„-€”“[ôIÙ]sÓ šł)Ù0ÊƕŁÜ<ă€?áśïŃŐ7>ŻJې;·«zö.RŒr“>){Uÿ\öź–l»Gś}s \ČŽőĂćúÌSšg­*“†‚G рą†Šę»É·ż°»#źĆț>;{A۶"ZúÖRElÉÌŹĄ%»“êÈążëš»—©NE:áȘ?è֋‡)Ś”RÛȚÔïŻű…ęű9ĘđÇ ó»É*0€đÛO艏cRpŒ~6ûúj߆>b+¶Mœœ@Ÿtą‡OąG~}łž-OÈì~Č~tĂÏô„1Ęäł#ȘxïQĘűë»ôÎÇOéšëëńż|Q=[Ëۍ|Mš~ąò_ŸŁše/éŐ-ç髜šìz_/ÌŻ’ež5úì)*uHČ6ëÉëoŃóIyžŻ[țü#ȚË#Ùa­~äWúȚßÔûwȚ û'ü[—œŻŻ7[uoĘĄ«ï[ź:ÛŁŸÓźÒ”—OŐ±=<ŠíšĐȘ%Ë2R ęŃq-żśWșmțgJ»Kő…Ÿ_§=TEîŽêŚÏŚ=żœQÿ^¶\śțòO:æńßèÔŒæŻ]ÿžțûr‰Š\}Ÿ~zÎp{lE+æëÏÿï=¶ŠVïÍț–û#všê9yȘÆțm©ȚȘ{GsÔiòŽŒĘ±œCŻÍ]€ˆm(8qšN/6$%”ú_żŃȚŹ”ĄïüáV]6źXNYȘYzŻ~űĂûŽôő?éÆ'ÇêîŻôjŸHGzűć- iÎûé%úâžȚòÇmćś0žwŸIŸŠ}§żÜ'NŃ€Ą]ä5$%6kÎőßÓŐ/lŃ<Șw/șV'yöÍ?éț‹ßŐőS~š'«œ:ëșëü=Ő°wu-ÚT @3, fìt\”Ëőâ?ŚŻžÚȘŽáŚèo|MçlŰ5šśÈsú4-ćLűžźßŽK’łë‰úÁćgšĐŽT3ÿYœVeKȕŒD•°%Ăô)/wśÓÛUĂN;_góï CS˟Ò#Dd›EšțËëő”±;»‘Í•ÿMĘúó3T`ZȘ{ç!=č*œÏŚ8~šN/6e'WèĆW7iśȚ¶êߙ«u– ßXMŸÜ]Š€ôÊÿêĄE!َ^úÒŐ;ƒvI2üüćéëÇ8e'Śé™çV(”Ï7q‡^~dź¶Š 莞„ß_wÆöôËa8ć/.՘3gè€Ł»țßÓ#OnPÒvšôą_ëÚs‡ȘÈ-IûȘ«nčLăr „·żąÙÏm֞ëԚêröOôë †«Ű#I†|%“ôƒKOQДÒÛViՎ†gĆ§êœ‰vXïŸôŠȘ›Ì4·¶œź—Äd›:eú‰Ê3$ĆȚŚ#ÿYŁž\2ëZ}\ńÎ;šŠòęŠ~|n/9숖<ś’Ê[^ ;źșä]öś»ô›™'kä€R ÚWƎû KC’W,ȚêjšmÖĄŚàńcyàp`r8]rì\d2L)mäéŽkÿ„?M+jxÛĄíú,bIČŽű¶s4ê¶ÖŽQ(ܐFš%çéwźÓużœ_o|șDOüa©žŒł»Ž=ă‹úêŚŸ€ÓwȚ™łTč­R¶$Ł[/uß[Hí.ŠTŸÖö­Ûd©dwő\qöő}ä^­]őȿꛄË™ČkȚԜśÂČÍB:ęćî|ĘÛ·n—%ÉÚńŽŸ7îéÖßźHœÂûÈvíp„*c¶d8ÔŁ€û>gt§+·«Ò’äìźžĘöòJŒ\őì”ĄJmÿLÛ-)·éÍBőèș—7Ê4e’dKMj L˜ŠÓ‹_Ô¶/֜yÛôĆ »ÉLoÒË/źPÒ6ŐûŹiłóW éí[”͒doĐĘ3'èîV_DTĄ˜­æŃê3šß^“mû祥țȆyš}ïăšóÖ mŹK4Ź#ДĂVæQ{Ç_ €AŰÌnúò?žÖ/F;%«R/üüb]ęJ•Üÿš>8őrlșšm5t“Њ§AE­EĘ *lÜfȘpì%șă©úđćÿêń§ŸŐÜƛ”ű™żkÉ ÿŃ ?ș]œ9H>I†±3°”śŸJ¶%·t FĘÜ­ÓyŽșíćÛȚélí6CÛ?É”éòKțȘĆő¶|œŽÓż|‚†ś.VÀ㐶ÎÓí·ż€Mđòś„ĂŻÀ l7f±Šüű2=ÿțÍZ°öaęöȚ“őà•Ă՘·buńR©\§ż_ĐÖĆ'%9‹4tê·tęÔoê'ÏÓœ·țAÿ^Č]oęő/zöôżêÂnŠșvï*S[•Ț¶Y[’Ò –ymb«*¶[’*îÖeÿçvôÖÔéĂő–šüŐŚŽúÒb­|y‰b¶C}ΚŠŃłèeȘžk± }&ùŚ•wüTc?ç7˜,PËimĘŒMi”ÁÒ€ŒźĘŐŐ”Ê­­ȘŰbI][ÜŒ°k”ysH¶ 9Š»í1¶çÀč4|Úő}ű^­ûđ5œ¶ćMœśšV§$śđ©šÖw„Žâ.*2„ Ł›Šüüv}w@;OÛïç!©ś~PKë-9șNŐÍ\ŻÓ v_ńôšu­wÛ-ڎ(8 ™=ÎŃÏŸ7F%ŽöÁ[tś±ĘĘÇhìŸ %őÁ+ŻkËçZïŃTpàúáM—hŽSȓŸȘ|‹%ÉTÏăÆȘ·CČêßÓ+ïŐ·è¶Uśö«Z¶%GĘcŸ#ZÏŐcòÙç3”Țž@Ż-~SóÊâČę4uÚî.nÉTÉècŐĂ!„+ßÖËK#Ÿç…5pÖ°NJkŐ+óŽqëž:ŒŐŰBSJoŃüy)Țb»”mŸ^ù )ÛpjИ ŽùÎÆ>Î9pŠŠqIɏôúü2œțÆÇJnžȚ°àh#çÀѝkJé šśê:%3?u+Zù<Ű!mÙZ/K’sű‰šXĐl ‘Â댔òù3eš û$é6OnÉÆ”h+Âvà°dȘÏ?ŃwFű€ÄZ=pÓ}Z֘·Ú|ń4őrH‘śÿŠ«n~^UïŽaíd­ÊÏŐĂÏ-WxçcĄĆÿŃĘÏŒŻő”MăÚž*Ț[ŹrK2=TČsF¶cđyúú y2­zîwŚéÁ%Û·%Ùq}¶èA]}Û+ȘČ FEÓ¶ÖsŁp’ŠO ʰÊőöì”4&č‡6ïâ–$ç°óuńhżŒô&=ț«ktïÛŠì s-E·­Òü§ŸĐüŠęÜa0{èŹs'(hÚJ|űOęì–ç”rç{d'jUŸdŽ|iÒ’ä=N_9T>#­O»A7üw„v”©xSw^s§ȚŰ2 &éâé­wÈÇQšröy”ĐŠWț­ŚŚ€eűÇéìÉ]›i篯^8@%”ê_żĐŻ]ȘÏb»Łëthł–œò=č°rß Ő¶ĐæÏƒPŚ.92%„ÊŚhm“{>É­oèOw/Űûì|łXĘș˜’RZőÊ Zœs%Ót,Š=Öqm*Ś #źœęôŐ_\ŹčßžW}ü°nžçd=°sœL`üș튍șòoïkՓŚéąÿȚą`Až|Š«źșNŃŽ-śńW돳‡ËoŰJ~ș@w_«țÏô(·[uËu)YœY·‡•–Gę/ŒDÓ»ïŒyÍnšqíoôŃśŻŃăÏŚïżęŠnśćSDĄhR–mÈŚ†źżț|őnkÚiäéäé'©pȚóZțîbÉđjÂ9g5ëâ–$9Jtá żÖêï_§§Śż©;.Kwæä«0àT*Z§ÚP\ił»fȚ}źN.ÙŚœDS]Ïțč~łäSęê™r­~ò:}ć©ćń蔎ǔL*8śv}ùÌțrÈĄțÿVżZ}…źŸ[źgꟄç—#żÇR€>Š”mËÌŠoÜü3M)jŻVjS=&OÓq]ąKȚU™Lćz¶NËoy|—†\r“~čîșéՍšsëw5śÏ~æçÈH†USQÒrhÈćcôĆqĆm<ś|<{î9êûâƒZ·ț}wæJ<ȧ\uëőț;+|’Æ/ĐûŐ-Ná(Ő铏Ö}«V(Œäïš9ù!äX »ÎÒÏț\ă[«žkĐ6t¶‡1śŃ_Ś/gö“K }ÜlœŒ_ĂŸq‡žűç5șdÊhő+r+^]©í” yșÔÄ/\ą_\2Qy†$ Œ9_—žw’†TșêS­ęxƒ¶Æê?vȘ.œń>ÍțÉxć6É.Íâ“tőęÿ֟Ÿ?]ɓ )jçšû  :śò[őÈęWkrë+öŸŠÓ»4|%țq:çô.{ę‚rt;MżyàĘțƒótÒĐ^ ÚőȘŹŹRXA5âTÍŒò*7° çvtÓäßüKßö]͘0PʂN„bq™9Ć0nšf5pwgŽłDçÜ4[Üp‰ŠÛGùŽžÂ1SÁ^C4éÂé·ÿĄ«ÆŽ}6~…“tÎ Á†śÀ,ÔéÓ'*ž·žKuȚ­êᛟŁȘ»/©êÊJUE*ì;ZSgęPWœÙęșŒìóàučîú땚ql/9·,ÖÜç^҂”ÒÈYżŚCżAł&æíć:šêÿő[őçc{罎*bùŐgäÀęÏYÏ”h Ă¶í¶ŽËöiő†M»ț<žoŻ,VÒÜČU4òèŸę<+WŻUiiŸƒ~‡—òòO4dđ€l—À!§Łr»ŽBg;"l C„ídˆ°€ ¶!Âv2DŰ@†ہvâöž‹ĆdÛv¶Kp°m[±XLn;Û„€@ŰŽ“ŻG±8a;€¶m+)ÇëÉv) ¶íÄçó)O(Ng»‡€t:­xčœ†!Ă0Č]pD±m[¶m+™J«.U(UĐï;"»Ú%Âvt2Ćčòž]ÚQ]ŻúPDŸW99Ț#n>máh\‘HLĄhLŠaȘž śˆìhoDێN'èś)èś)‰©¶>Ź-ÛȘ‰Ćł]pDÉńz”ăóškQ~§hv%lG§ Ł@;aT2DŰ@†ÛÈa;"l C„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;"l C„ídˆ°€ ¶!Âv2DŰ@†ÛÈa;"l C„ídˆ°€ ¶!öm;ÛE,[”!Û%:ŰÈŁûf»„vóÿšK”łę…IENDźB`‚prr-0.20.0/book/src/install.md000064400000000000000000000002651046102023000142220ustar 00000000000000# Installation Installation has two steps: 1. Install the `prr` binary 1. Acquire a token from Github 1. Give the token to `prr` The following sub-chapters provide more details. prr-0.20.0/book/src/install_binary.md000064400000000000000000000016471046102023000155730ustar 00000000000000# Install binary There are multiple ways to install `prr` CLI tool. Choose any one of the methods below that best suit your needs. ## Build from source To build `prr` from source, you will first need to install Rust and Cargo. Follow the instructions on the [Rust installation page][0]. Once you have installed Rust, the following command can be used to build and install `prr`: ```sh cargo install prr ``` This will automatically download `prr` from [crates.io][1], build it, and install it in Cargo's global binary directory (`~/.cargo/bin/` by default). To uninstall, run the command: ```sh cargo uninstall prr ``` ## Install using Homebrew To install `prr` using [Homebrew][2], first follow [Homebrew install instructions][3]. Once Homebrew is installed, run: ```sh brew install prr ``` [0]: https://www.rust-lang.org/tools/install [1]: https://crates.io/ [2]: https://brew.sh/ [3]: https://docs.brew.sh/Installation prr-0.20.0/book/src/install_config.md000064400000000000000000000005071046102023000155460ustar 00000000000000# Configure prr First, create the config directory: ```sh mkdir -p ~/.config/prr ``` Next, create a basic global config: ```sh cat << EOF > ~/.config/prr/config.toml [prr] token = "$YOUR_PAT_FROM_LAST_STEP" workdir = "/home/dxu/dev/review" EOF ``` Note `workdir` can be any directory. (You don't have to use my unix name) prr-0.20.0/book/src/install_github.md000064400000000000000000000004631046102023000155640ustar 00000000000000# Acquire Github token `prr` needs a token so it can make Github API calls on your behalf. Create the token by going to: ``` Settings -> Developer settings -> Personal access tokens -> Generate new token ``` and give the token `repo` permissions. Keep the newly generated token handy for the next step. prr-0.20.0/book/src/release.md000064400000000000000000000011441046102023000141710ustar 00000000000000# Releases Releases are currently managed by [`cargo-release`][0]. We are currently pre-1.0, so we are only cutting minor and patch releases. We try to follow [semantic versioning][1]. Cut a minor release by running: ```sh cargo release minor ``` Similarly, a patch release is: ```sh cargo release patch ``` ## Github releases and binary artifacts At some point it'd be good to automatically cut GH releases and upload binary (statically linked) artifacts to it. It's not too hard to do using GHA. Just lazy. Contributions welcome. [0]: https://github.com/crate-ci/cargo-release [1]: https://semver.org/ prr-0.20.0/book/src/review.md000064400000000000000000000037051046102023000140570ustar 00000000000000# Review file `prr` supports various review file markups. This document captures all of them. ## Review directives Description: Meta-directives to give to `prr` in review comment. Currently only supports approving, requesting changes to, and commenting on a PR. Syntax: `@prr approve`, `@prr reject`, or `@prr comment`. [Example](./examples/prr_directive.md) ## Review comment Description: PR-level review comment. You only get one of these per review. Syntax: Non-whitespace, non-quoted text at the beginning of the review file. [Example](./examples/review_comment.md) ## Description comment Description: Specialized form of review comment. When [`activate_pr_metadata_experiment`](./config.md#the-activate_pr_metadata_experiment-field) is active, review files come with the PR description quoted at the top of the review file. Comments, when uploaded, will quote the preceding description. PR description will continue to be quoted until a review directive is found. Syntax: Same as review comment. [Example](./examples/review_description.md) ## Inline comment Description: Inline comment attached to a specific line of the diff. Syntax: None-whitespace, non-quoted text on a newline immediately following a quoted non-header part of the diff. [Example](./examples/inline_comment.md) ## Spanned inline comment Description: Like an inline comment, except it covers a span of lines. Syntax: To start a span, insert one or more newlines immediately before a quoted, non-header part of the diff. To terminate a span, insert a inline comment. [Example](./examples/spanned_inline_comment.md) ## File comment Description: File-level comment. Syntax: Non-whitespace, non-quoted text immediately following the `diff --git` header [Example](./examples/file_comment.md) ## Snips Description: Use `[...]` to replace (ie. snip) contiguous quoted lines. Syntax: `[...]` or `[..]` on its own line. Multiple snips may be used in a review file. [Example](./examples/snip.md) prr-0.20.0/book/src/tutorial.md000064400000000000000000000124261046102023000144210ustar 00000000000000# Tutorial This tutorial shows you how to create a review against [prr-test-repo#6][0]. Feel free to review it! We assume you've followed all the instructions in [Installation](./install.md). ### Download the PR First, let's download a PR: ```sh $ prr get danobi/prr-test-repo/6 /home/dxu/dev/review/danobi/prr-test-repo/6.prr ``` `prr-get` downloads a pull request onto your filesystem into what we call a "review file". On success, the path to the review file is printed to your terminal. But to be sure, let's check our status: ```sh $ prr status Handle Status Review file danobi/prr-test-repo/6 NEW /home/dxu/dev/review/danobi/prr-test-repo/6.prr ``` Great! We've confirmed the review was downloaded. ### Mark up the review file Now that the review file is downloaded, let's mark it up. You can open the review file in your favorite editor or use `prr-edit` to automatically open it in `$EDITOR`. ``` $ prr edit danobi/prr-test-repo/6 ``` Your editor should show the contents as something like this: ``` > diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` There's a lot of diff we don't particularly care about. So let's snip away the top portion. We can do this by replacing as many contiguous lines as we want with `[...]`. After snipping your review file will look exactly like this: ``` [...] > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. ``` Looks like someone is trying to ruin a classic text with gibberish! Let's tell them to remove it: ``` [...] > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + Please remove this text! [...] ``` Here we've done two things: 1. Create a "spanned inline" comment that attaches our comment to a block of lines. If we omitted the leading newline, we would have a regular "inline" comment that attaches to the most immediately quoted line. Using spanned inline comments can be useful when we want to be precise during review. 1. Snip the trailing text. We didn't have to do this, but it makes the example a little clearer. ### Submit the review Now that we're done with our review, it's time to submit it to Github. Do this by running: ```sh $ prr submit danobi/prr-test-repo/6 ``` On success there will not be any output. But just to be safe, let's confirm submission status: ```sh $ prr status Handle Status Review file danobi/prr-test-repo/6 SUBMITTED /home/dxu/dev/review/danobi/prr-test-repo/6.prr ``` Looks like it made it to the web interface as well: ![](./images/tutorial_comment.png) ### Homework Try figuring out how to "request changes" on the PR! [0]: https://github.com/danobi/prr-test-repo/pull/6 prr-0.20.0/book/src/vim.md000064400000000000000000000036101046102023000133440ustar 00000000000000# Vim integration The `vim/` directory in `prr` source contains Vim plugin providing syntax coloring, filetype detection and folding configuration for `*.prr` files. To install, modify `&runtimepath` to add this directory or use a plugin manager of your choice to add this plugin. ## Vundle installation Add the following to your `.vimrc`: ``` Plugin 'danobi/prr', {'rtp': 'vim/'} ``` ## Manual installation Copy the provided `*.vim` files into their appropriate subdirectories in `~/.vim`. ## Syntax colors The `prr` "plugin" exports some preconfigured syntax hooks. Example [from my dotfiles][0]: ```vim "Automatically set up highlighting for `.prr` review files "Use `:hi` to see the various definitions we kinda abuse here augroup Prr autocmd! autocmd BufRead,BufNewFile *.prr set syntax=on "Make prr added/deleted highlighting more apparent autocmd BufRead,BufNewFile *.prr hi! link prrAdded Function autocmd BufRead,BufNewFile *.prr hi! link prrRemoved Keyword autocmd BufRead,BufNewFile *.prr hi! link prrFile Special "Make file delimiters more apparent autocmd BufRead,BufNewFile *.prr hi! link prrHeader Directory "Reduce all the noise from color autocmd BufRead,BufNewFile *.prr hi! link prrIndex Special autocmd BufRead,BufNewFile *.prr hi! link prrChunk Special autocmd BufRead,BufNewFile *.prr hi! link prrChunkH Special autocmd BufRead,BufNewFile *.prr hi! link prrTagName Special autocmd BufRead,BufNewFile *.prr hi! link prrResult Special augroup END ``` ## Folding With default Vim configuration all folds will be closed by default, so if you want them to be opened then you need to do one of these: - Add `set foldlevel=9999` in your Vim config to open all folds by default - Add `set nofoldenable` to disable folding Consult `:h folding` for more details. [0]: https://github.com/danobi/dotfiles/blob/ab00f235fffd4c8d5e2496657e8047e1473d9257/vim/.vimrc#L81-L94 prr-0.20.0/build.rs000064400000000000000000000031651046102023000121600ustar 00000000000000mod cli { include!("src/cli.rs"); } const LONG_ABOUT: &str = "prr is a tool that brings mailing list style code reviews to Github PRs. This \ means offline reviews and inline comments, more or less. To that end, prr introduces a new workflow for reviewing PRs: 1. Download the PR into a \"review file\" on your filesystem 2. Mark up the review file using your favorite text editor 3. Submit the review at your convenience For full documentation, please visit https://doc.dxuuu.xyz/prr/."; fn main() -> std::io::Result<()> { if let Some(out_path) = std::env::var_os("GEN_DIR").or(std::env::var_os("OUT_DIR")) { use clap::CommandFactory; #[allow(unused_variables)] let out_dir = std::path::PathBuf::from(out_path); #[allow(unused_mut, unused_variables)] let mut cmd = cli::Cli::command() .author("Daniel Xu ") .about("Mailing list style code reviews for GitHub") .long_about(LONG_ABOUT); let man_dir = std::path::Path::join(&out_dir, "man"); std::fs::create_dir_all(&man_dir)?; clap_mangen::generate_to(cmd.clone(), &man_dir)?; use clap::ValueEnum; let completions_dir = std::path::Path::join(&out_dir, "completions"); std::fs::create_dir_all(&completions_dir)?; for shell in clap_complete::Shell::value_variants() { clap_complete::generate_to(*shell, &mut cmd, "prr", &completions_dir)?; } } println!( "cargo:rustc-env=TARGET={}", std::env::var("TARGET").unwrap() ); println!("cargo:rerun-if-env-changed=GEN_DIR"); Ok(()) } prr-0.20.0/src/cli.rs000064400000000000000000000031461046102023000124160ustar 00000000000000use clap::{Parser, Subcommand}; use std::path::PathBuf; #[derive(Subcommand, Debug)] pub(crate) enum Command { /// Get a pull request and begin a review Get { /// Ignore unsubmitted review checks #[clap(short, long)] force: bool, /// Pull request to review (eg. `danobi/prr/24`) pr: String, /// Open review file in $EDITOR after download #[clap(long)] open: bool, }, /// Open an existing review in $EDITOR Edit { /// Pull request to edit (eg. `danobi/prr/24`) pr: String, }, /// Submit a review Submit { /// Pull request to review (eg. `danobi/prr/24`) pr: String, #[clap(short, long)] debug: bool, }, /// Apply a pull request to the working directory /// /// This can be useful for building/testing PRs Apply { pr: String }, /// Print a status summary of all known reviews Status { /// Hide column titles from output #[clap(short, long)] no_titles: bool, }, /// Remove a review Remove { /// Pull requests to remove (eg. `danobi/prr/24`) prs: Vec, /// Ignore unsubmitted review checks #[clap(short, long)] force: bool, /// Remove submitted reviews in addition to provided reviews #[clap(short, long)] submitted: bool, }, } #[derive(Parser, Debug)] #[clap(version)] #[command(name = "prr")] pub struct Cli { /// Path to config file #[clap(long)] pub(crate) config: Option, #[clap(subcommand)] pub(crate) command: Command, } prr-0.20.0/src/main.rs000064400000000000000000000056341046102023000125770ustar 00000000000000use std::env; use std::path::{Path, PathBuf}; use std::process; use anyhow::{bail, Context, Result}; use clap::Parser; mod cli; mod parser; mod prr; mod review; use cli::*; use prr::Prr; /// The name of the local configuration file pub const LOCAL_CONFIG_FILE_NAME: &str = ".prr.toml"; /// Returns if exists the config file for the current project fn find_project_config_file() -> Option { env::current_dir().ok().and_then(|mut path| loop { path.push(LOCAL_CONFIG_FILE_NAME); if path.exists() { return Some(path); } path.pop(); if !path.pop() { return None; } }) } /// Opens a file in $EDITOR fn open_review(file: &Path) -> Result<()> { // This check should only ever trip for prr-edit if !file.try_exists()? { bail!("Review file does not exist yet"); } let editor = env::var("EDITOR").context("Failed to read $EDITOR")?; let status = process::Command::new(editor) .arg(file) .status() .context("Failed to execute editor process")?; match status.code() { Some(0) => Ok(()), Some(rc) => bail!("EDITOR exited unclean: {}", rc), None => bail!("Failed to get EDITOR exit status"), } } #[tokio::main] async fn main() -> Result<()> { let args = Cli::parse(); // Figure out where config file is let config_path = match args.config { Some(c) => c, None => { let xdg_dirs = xdg::BaseDirectories::with_prefix("prr")?; xdg_dirs.get_config_file("config.toml") } }; let prr = Prr::new(&config_path, find_project_config_file())?; match args.command { Command::Get { pr, force, open } => { let (owner, repo, pr_num) = prr.parse_pr_str(&pr)?; let review = prr.get_pr(&owner, &repo, pr_num, force).await?; let path = review.path(); println!("{}", path.display()); if open { open_review(&path).context("Failed to open review file")?; } } Command::Edit { pr } => { let (owner, repo, pr_num) = prr.parse_pr_str(&pr)?; let review = prr.get_review(&owner, &repo, pr_num)?; open_review(&review.path()).context("Failed to open review file")?; } Command::Submit { pr, debug } => { let (owner, repo, pr_num) = prr.parse_pr_str(&pr)?; prr.submit_pr(&owner, &repo, pr_num, debug).await?; } Command::Apply { pr } => { let (owner, repo, pr_num) = prr.parse_pr_str(&pr)?; prr.apply_pr(&owner, &repo, pr_num, Path::new("./"))?; } Command::Status { no_titles } => { prr.print_status(no_titles)?; } Command::Remove { prs, force, submitted, } => { prr.remove(&prs, force, submitted).await?; } } Ok(()) } prr-0.20.0/src/parser.rs000064400000000000000000000736671046102023000131620ustar 00000000000000use anyhow::{anyhow, bail, Context, Result}; use lazy_static::lazy_static; use regex::Regex; // Use lazy static to ensure regex is only compiled once lazy_static! { // Regex for the start of a hunk. The start of a hunk should look like: // // `@@ -731,7 +731,7 @@[...]` // static ref HUNK_START: Regex = Regex::new(r"^@@ -(?P\d+)(?:,(?P\d+))? \+(?P\d+)(?:,(?P\d+))? @@").unwrap(); // Regex for start of a file diff. The start of a file diff should look like: // // `diff --git a/ch1.txt b/ch1.txt` // static ref DIFF_START: Regex = Regex::new(r"^diff --git a/.+ b/(?P.+)$").unwrap(); } /// The location of a line /// /// The distinction between Left and Right is important when commenting on /// deleted or added lines. A useful way to think about the line location is /// the line number a comment should be attached to in the file pre-change (left) /// or the file post-change (right) #[derive(Debug, PartialEq, Eq, Clone)] pub enum LineLocation { /// The "red"/deleted side of the diff Left(u64), /// The "green"/added or "white"/existing side of the diff Right(u64), } /// Represents a single inline comment on a review #[derive(Debug, PartialEq, Eq)] pub struct InlineComment { /// File the comment is in /// /// Note that this is the new filename if the file was also moved pub file: String, pub line: LineLocation, /// For a spanned comment, the first line of the span. See `line` for docs on semantics pub start_line: Option, /// The user-supplied review comment pub comment: String, } /// Represents a single file-level comment on a review #[derive(Debug, PartialEq, Eq)] pub struct FileComment { /// File the comment is in /// /// Note that this is the new filename if the file was also moved pub file: String, /// The user-supplied review comment pub comment: String, } #[derive(Debug, PartialEq, Eq)] pub enum ReviewAction { Approve, RequestChanges, Comment, } /// Represents a comment of some sort on a review #[derive(Debug, PartialEq, Eq)] pub enum Comment { /// Overall review comment (the summary comment) Review(String), /// An inline comment (attached to a line) Inline(InlineComment), /// Overall approve, reject, or comment on review ReviewAction(ReviewAction), // A file-level comment (attached to the whole file) File(FileComment), } #[derive(Default)] struct StartState { /// Each line of review-level comment is stored as an entry comment: Vec, /// Only if there was unquoted content in the Start state we should /// send a review comment. If there was no unquoted content, there /// was no review comment. had_unquoted_content: bool, /// After we have seen the prr directive we assume the review /// comment is done. This allows us to ignore the PR description as /// long as we have the prr directive before it. had_review_action: bool, } struct FilePreambleState { /// Relative path of the file under diff file: String, /// Each line of file-level comment is stored as an entry comment: Vec, } #[derive(Clone)] struct FileDiffState { /// Relative path of the file under diff file: String, /// Current left line position. See `LineLocation` for docs on semantics of `line` left_line: u64, /// Current right line position. See `LineLocation` for docs on semantics of `line` right_line: u64, /// Current line position line: LineLocation, /// First line of the span. See `LineLocation` for docs on /// semantics of `line` span_start_line: Option, } struct SpanStartOrCommentState { /// State of the file diff before we entered this state file_diff_state: FileDiffState, } struct CommentState { /// State of the file diff before we entered comment processing file_diff_state: FileDiffState, /// Each line of comment is stored as an entry comment: Vec, } /// State machine states /// /// Only the following state transitions are valid: /// /// +---------------+ /// | | /// v | /// Start -> FilePreamble -> FileDiff -> StartSpanOrComment -> Comment /// ^ ^ | | ^ ^ | /// | | | | | | | /// | +--------+--+-+----------------------------+---+ /// | | | | /// +-------------+ +------------------------------+ /// enum State { /// Starting state Start(StartState), /// The `diff --git a/...` preamble as well as the lines before the first hunk FilePreamble(FilePreambleState), /// We are inside the diff of a file FileDiff(FileDiffState), /// We are either the start of a span or the beginning of a comment /// /// The uncertainty comes from the fact that comments typically begin with one /// or more newlines SpanStartOrComment(SpanStartOrCommentState), /// We are inside a user-supplied comment Comment(CommentState), } /// Simple state machine to parse a review file pub struct ReviewParser { state: State, } fn is_diff_header(s: &str) -> bool { s.starts_with("diff --git ") } /// Parses lines in the form of `@prr DIRECTIVE` /// /// Returns Some(directive) if found, else None fn is_prr_directive(s: &str) -> Option<&str> { let t = s.trim(); if let Some(d) = t.strip_prefix("@prr ") { Some(d) } else { None } } /// Parses the new filename out of a diff header fn parse_diff_header(line: &str) -> Result { if let Some(captures) = DIFF_START.captures(line) { let new: &str = captures.name("new").unwrap().as_str(); Ok(new.trim().to_owned()) } else { Err(anyhow!("Invalid diff header: could not parse")) } } /// Parses the starting left & right lines out of the hunk start fn parse_hunk_start(line: &str) -> Result> { if let Some(captures) = HUNK_START.captures(line) { let hunk_start_line_left: u64 = captures .name("lstart") .unwrap() .as_str() .parse() .context("Failed to parse hunk start left line")?; let hunk_start_line_right: u64 = captures .name("rstart") .map(|s| s.as_str()) .unwrap_or_else(|| { if hunk_start_line_left == 0 { "0" } else { unreachable!( "Unexpected non-zero left-hand-side of git diff header. Expected 0." ) } }) .parse() .context("Failed to parse hunk start right line")?; // Note that for newly added files or deleted files, both sides // of the line info might be zero. `saturating_*` operations must hence // be used for the following subtraction to be safe. return Ok(Some((hunk_start_line_left, hunk_start_line_right))); } Ok(None) } fn is_left_line(line: &str) -> bool { line.starts_with('-') } /// Given the current line and line positions, returns what the next line positions should be fn get_next_lines(line: &str, left: u64, right: u64) -> (u64, u64) { if is_left_line(line) { (left + 1, right) } else if line.starts_with('+') { (left, right + 1) } else { (left + 1, right + 1) } } impl ReviewParser { pub fn new() -> ReviewParser { ReviewParser { state: State::Start(StartState::default()), } } pub fn parse_line(&mut self, mut line: &str) -> Result> { let is_quoted = line.starts_with('>'); if is_quoted { if let Some(stripped) = line.strip_prefix("> ") { line = stripped; } else if let Some(stripped) = line.strip_prefix('>') { line = stripped; } } match &mut self.state { // we are adding all the lines, regardless if they are // quoted are not because they may be interleaving the // PR description as long as we haven't seen the prr // directive. Once the diff header starts, we determine // whether or not we should send the review comment. The // comment should only be sent, if we ever encountered a // non-quoted string in this state. State::Start(state) => { if is_quoted { if !is_diff_header(line) { if !state.had_review_action { state.comment.push("> ".to_owned() + line); } return Ok(None); } let mut review_comment = None; if state.had_unquoted_content { review_comment = Some(Comment::Review(state.comment.join("\n").trim().to_string())); } self.state = State::FilePreamble(FilePreambleState { file: parse_diff_header(line)?, comment: vec![], }); return Ok(review_comment); } else if let Some(d) = is_prr_directive(line) { state.had_review_action = true; return match d { "approve" => Ok(Some(Comment::ReviewAction(ReviewAction::Approve))), "reject" => Ok(Some(Comment::ReviewAction(ReviewAction::RequestChanges))), "comment" => Ok(Some(Comment::ReviewAction(ReviewAction::Comment))), _ => bail!("Unknown @prr directive: {}", d), }; } else { state.comment.push(line.to_owned()); if !state.had_unquoted_content { state.had_unquoted_content = true } } Ok(None) } State::FilePreamble(state) => { if !is_quoted { state.comment.push(line.to_owned()); } if is_diff_header(line) { self.state = State::FilePreamble(FilePreambleState { file: parse_diff_header(line)?, comment: vec![], }); return Ok(None); } if let Some((mut left_start, mut right_start)) = parse_hunk_start(line)? { // Subtract 1 b/c this line is before the actual diff hunk left_start = left_start.saturating_sub(1); right_start = right_start.saturating_sub(1); // Finish up our file-level comment if we had one let comment = if !state.comment.is_empty() { Some(Comment::File(FileComment { file: state.file.to_owned(), comment: state.comment.join("\n").trim().to_string(), })) } else { None }; self.state = State::FileDiff(FileDiffState { file: state.file.to_owned(), left_line: left_start, right_line: right_start, line: if is_left_line(line) { LineLocation::Left(left_start) } else { LineLocation::Right(right_start) }, span_start_line: None, }); if let Some(comment) = comment { return Ok(Some(comment)); } } Ok(None) } State::FileDiff(state) => { if is_quoted { if is_diff_header(line) { if state.span_start_line.is_some() { bail!( "Detected span that was not terminated with a comment, file: {}", state.file ); } self.state = State::FilePreamble(FilePreambleState { file: parse_diff_header(line)?, comment: vec![], }); } else if let Some((mut left_start, mut right_start)) = parse_hunk_start(line)? { if state.span_start_line.is_some() { bail!("Detected cross chunk span, file: {}", state.file); } // Subtract 1 b/c this line is before the actual diff hunk left_start = left_start.saturating_sub(1); right_start = right_start.saturating_sub(1); state.left_line = left_start; state.right_line = right_start; if is_left_line(line) { state.line = LineLocation::Left(left_start); } else { state.line = LineLocation::Right(right_start); } } else { let (next_left, next_right) = get_next_lines(line, state.left_line, state.right_line); state.left_line = next_left; state.right_line = next_right; if is_left_line(line) { state.line = LineLocation::Left(next_left); } else { state.line = LineLocation::Right(next_right); } } return Ok(None); } // Now that we know this line is not quoted, there's only two options: // 1) beginning of a spanned comment // 2) beginning of a comment if line.trim().is_empty() { self.state = State::SpanStartOrComment(SpanStartOrCommentState { file_diff_state: state.clone(), }) } else { self.state = State::Comment(CommentState { file_diff_state: state.clone(), comment: vec![line.to_owned()], }) } Ok(None) } State::SpanStartOrComment(state) => { if is_quoted { if state.file_diff_state.span_start_line.is_some() { bail!( "Detected span that was not terminated with a comment, file: {}", state.file_diff_state.file ); } // Back to the original file diff let (next_left, next_right) = get_next_lines( line, state.file_diff_state.left_line, state.file_diff_state.right_line, ); self.state = State::FileDiff(FileDiffState { file: state.file_diff_state.file.to_owned(), left_line: next_left, right_line: next_right, line: if is_left_line(line) { LineLocation::Left(next_left) } else { LineLocation::Right(next_right) }, span_start_line: Some(if is_left_line(line) { LineLocation::Left(next_left) } else { LineLocation::Right(next_right) }), }); Ok(None) } else if line.trim().is_empty() { // In a multi-line span spart Ok(None) } else { // In a comment now self.state = State::Comment(CommentState { file_diff_state: state.file_diff_state.clone(), comment: vec![line.to_owned()], }); Ok(None) } } State::Comment(state) => { if is_quoted { let comment = Comment::Inline(InlineComment { file: state.file_diff_state.file.clone(), line: state.file_diff_state.line.clone(), start_line: state.file_diff_state.span_start_line.clone(), comment: state.comment.join("\n").trim_end().to_string(), }); if is_diff_header(line) { self.state = State::FilePreamble(FilePreambleState { file: parse_diff_header(line)?, comment: vec![], }); } else { let (next_left, next_right) = get_next_lines( line, state.file_diff_state.left_line, state.file_diff_state.right_line, ); self.state = State::FileDiff(FileDiffState { file: state.file_diff_state.file.to_owned(), left_line: next_left, right_line: next_right, line: if is_left_line(line) { LineLocation::Left(next_left) } else { LineLocation::Right(next_right) }, span_start_line: None, }); } return Ok(Some(comment)); } state.comment.push(line.to_owned()); Ok(None) } } } pub fn finish(self) -> Option { match self.state { State::Comment(state) => Some(Comment::Inline(InlineComment { file: state.file_diff_state.file, line: state.file_diff_state.line, start_line: state.file_diff_state.span_start_line, comment: state.comment.join("\n").trim_end().to_string(), })), _ => None, } } } #[cfg(test)] mod tests { use super::*; fn test_fail(input: &str) { let mut parser = ReviewParser::new(); for line in input.lines() { if parser.parse_line(line).is_err() { return; } } panic!("Parser succeeded when it should have failed"); } fn test(input: &str, expected: &[Comment]) { let mut parser = ReviewParser::new(); let mut comments = Vec::new(); for line in input.lines() { if let Some(c) = parser.parse_line(line).unwrap() { comments.push(c); } } if let Some(c) = parser.finish() { comments.push(c); } assert!( comments == expected, "Parsed different comments than expected.\n Got: {:#?}\nExpected: {:#?}", comments, expected ); } #[test] fn single_comment() { let input = include_str!("../testdata/single_comment"); let expected = vec![Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: Some(LineLocation::Right(731)), comment: "Comment 1".to_string(), })]; test(input, &expected); } #[test] fn approve_review() { let input = include_str!("../testdata/approve_review"); let expected = vec![ Comment::ReviewAction(ReviewAction::Approve), Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: Some(LineLocation::Right(731)), comment: "Comment 1".to_string(), }), ]; test(input, &expected); } #[test] fn reject_review() { let input = include_str!("../testdata/reject_review"); let expected = vec![ Comment::ReviewAction(ReviewAction::RequestChanges), Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: Some(LineLocation::Right(731)), comment: "Comment 1".to_string(), }), ]; test(input, &expected); } #[test] fn review_comment() { let input = include_str!("../testdata/review_comment"); let expected = vec![ Comment::Review("Review comment".to_string()), Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: Some(LineLocation::Right(731)), comment: "Comment 1".to_string(), }), ]; test(input, &expected); } #[test] fn file_comment() { let input = include_str!("../testdata/file_comment"); let expected = vec![Comment::File(FileComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), comment: "This is a file-level comment!".to_string(), })]; test(input, &expected); } #[test] fn review_comment_whitespace() { let input = include_str!("../testdata/review_comment_whitespace"); let expected = vec![ Comment::ReviewAction(ReviewAction::Approve), Comment::Review("Review comment".to_string()), ]; test(input, &expected); } #[test] fn multiline_comment() { let input = include_str!("../testdata/multiline_comment"); let expected = vec![Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(736), start_line: None, comment: "Comment line 1\nComment line 2\n\nComment line 4".to_string(), })]; test(input, &expected); } #[test] fn back_to_back_span() { let input = include_str!("../testdata/back_to_back_span"); let expected = vec![ Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: Some(LineLocation::Right(731)), comment: "Comment 1".to_string(), }), Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(737), start_line: None, comment: "Comment 2".to_string(), }), ]; test(input, &expected); } #[test] fn multiple_files() { let input = include_str!("../testdata/multiple_files"); let expected = vec![ Comment::Inline(InlineComment { file: "libbpf-cargo/src/btf/btf.rs".to_string(), line: LineLocation::Right(734), start_line: None, comment: "Comment 1".to_string(), }), Comment::Inline(InlineComment { file: "libbpf-cargo/src/test.rs".to_string(), line: LineLocation::Right(2159), start_line: None, comment: "Comment 2".to_string(), }), ]; test(input, &expected); } #[test] fn hunk_start_no_trailing_whitespace() { let input = include_str!("../testdata/hunk_start_no_trailing_whitespace"); let expected = vec![Comment::Inline(InlineComment { file: "ch5.txt".to_string(), line: LineLocation::Right(7), start_line: None, comment: "Great passage".to_string(), })]; test(input, &expected); } #[test] fn add_oneliner() { let input = include_str!("../testdata/add_oneliner"); let expected = vec![ Comment::Inline(InlineComment { file: "foo.rs".to_string(), line: LineLocation::Right(0), start_line: None, comment: "Comment 1".to_string(), }), Comment::Inline(InlineComment { file: "foo.rs".to_string(), line: LineLocation::Right(1), start_line: None, comment: "Comment 2".to_string(), }), ]; test(input, &expected); } #[test] fn deleted_file() { let input = include_str!("../testdata/deleted_file"); let expected = vec![Comment::Inline(InlineComment { file: "ch1.txt".to_string(), line: LineLocation::Left(58), start_line: Some(LineLocation::Left(1)), comment: "Comment 1".to_string(), })]; test(input, &expected); } #[test] fn empty_file() { let input = include_str!("../testdata/empty_file"); let expected = vec![Comment::Inline(InlineComment { file: "libbpf-cargo/src/test.rs".to_string(), line: LineLocation::Right(2159), start_line: None, comment: "Comment".to_string(), })]; test(input, &expected); } #[test] fn trailing_comment() { let input = include_str!("../testdata/trailing_comment"); let expected = vec![Comment::Inline(InlineComment { file: "ch1.txt".to_string(), line: LineLocation::Left(59), start_line: Some(LineLocation::Left(1)), comment: "Comment 1".to_string(), })]; test(input, &expected); } #[test] /// https://github.com/danobi/prr/issues/3 fn spaces_in_filename() { let input = include_str!("../testdata/spaces_in_filename"); let expected = vec![Comment::Inline(InlineComment { file: "build/scripts/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json".to_string(), line: LineLocation::Right(2), start_line: None, comment: "foo".to_string(), })]; test(input, &expected); } #[test] fn unterminated_span() { let input = include_str!("../testdata/unterminated_span"); test_fail(input); } #[test] fn cross_file_span_ignored() { let input = include_str!("../testdata/cross_file_span_ignored"); test_fail(input); } #[test] fn unterminated_back_to_back_span() { let input = include_str!("../testdata/unterminated_back_to_back_span"); test_fail(input); } #[test] fn cross_hunk_span() { let input = include_str!("../testdata/cross_hunk_span"); test_fail(input); } #[test] fn unknown_directive() { let input = include_str!("../testdata/unknown_directive"); test_fail(input); } #[test] fn hunk_oneliner_regex() { let captures = HUNK_START .captures("@@ -0,0 +1 @@") .expect("Must match regex."); assert_eq!(captures.name("rstart").unwrap().as_str(), "1"); assert!(captures.name("rlen").is_none()); assert_eq!(captures.name("lstart").unwrap().as_str(), "0"); assert_eq!(captures.name("llen").unwrap().as_str(), "0"); } #[test] fn hunk_normal_regex() { let captures = HUNK_START .captures("@@ -0,7 +0,1 @@") .expect("Must match regex."); assert_eq!(captures.name("rstart").unwrap().as_str(), "0"); assert_eq!(captures.name("rlen").unwrap().as_str(), "1"); assert_eq!(captures.name("lstart").unwrap().as_str(), "0"); assert_eq!(captures.name("llen").unwrap().as_str(), "7"); } #[test] fn hunk_only_one_line_on_each_side() { let captures = HUNK_START .captures("@@ -5 +5 @@") .expect("Must match regex."); assert_eq!(captures.name("rstart").unwrap().as_str(), "5"); assert!(captures.name("rlen").is_none()); assert_eq!(captures.name("lstart").unwrap().as_str(), "5"); assert!(captures.name("llen").is_none()); } #[test] fn inline_and_review_comments_with_pr_description_present() { let input = include_str!("../testdata/inline_and_review_comments_with_pr_description"); let expected = vec![ Comment::ReviewAction(ReviewAction::RequestChanges), Comment::Review("Not necessary.".to_string()), Comment::Inline(InlineComment { file: "README.md".to_string(), line: LineLocation::Right(2), start_line: None, comment: "Doesn't seem necessary ...".to_string(), }), ]; test(input, &expected); } #[test] fn review_comments_interleaved_with_pr_description() { let input = include_str!("../testdata/review_comments_interleaved_with_pr_description"); let expected = vec![ Comment::ReviewAction(ReviewAction::RequestChanges), Comment::Review("Not necessary.\n\n\n> This is just for testing purposes.\n\nThis might be fine or not.".to_string()), Comment::Inline(InlineComment { file: "README.md".to_string(), line: LineLocation::Right(2), start_line: None, comment: "Doesn't seem necessary ...".to_string(), }), ]; test(input, &expected); } } prr-0.20.0/src/prr.rs000064400000000000000000000613211046102023000124510ustar 00000000000000use std::fs; use std::path::{Path, PathBuf}; use anyhow::{anyhow, bail, Context, Result}; use git2::{ApplyLocation, Diff, Repository, StatusOptions}; use http::{StatusCode, Uri}; use lazy_static::lazy_static; use octocrab::Octocrab; use prettytable::{format, row, Table}; use serde_derive::Deserialize; use serde_json::{json, Value}; use crate::parser::{FileComment, LineLocation, ReviewAction}; use crate::review::{get_all_existing, Review, ReviewStatus}; use regex::{Captures, Regex}; // Use lazy static to ensure regex is only compiled once lazy_static! { // Regex for short input. Example: // // danobi/prr-test-repo/6 // static ref SHORT: Regex = Regex::new(r"^(?P[\w\-_\.]+)/(?P[\w\-_\.]+)/(?P\d+)").unwrap(); // Regex for url input. Url looks something like: // // https://github.com/danobi/prr-test-repo/pull/6 // static ref URL: Regex = Regex::new(r".*github\.com/(?P.+)/(?P.+)/pull/(?P\d+)").unwrap(); } const GITHUB_BASE_URL: &str = "https://api.github.com"; #[derive(Debug, Deserialize)] struct PrrConfig { /// GH personal token token: String, /// Directory to place review files workdir: Option, /// Github URL /// /// Useful for enterprise instances with custom URLs url: Option, /// Activate experimental PR metadata support. Currently this option /// just activates downloading the actual PR description in addition /// to the diff. #[serde(default)] activate_pr_metadata_experiment: bool, } #[derive(Debug, Deserialize)] struct PrrLocalConfig { /// Default url for this current project repository: Option, /// Local workdir override workdir: Option, } #[derive(Debug, Deserialize)] struct Config { prr: PrrConfig, local: Option, } /// Main struct that coordinates all business logic and talks to GH pub struct Prr { /// User config config: Config, /// Path to local config file local_config: Option, /// Instantiated github client crab: Octocrab, } impl Config { /// Returns GH URL to use. Sanitizes if necessary. fn url(&self) -> String { match &self.prr.url { Some(url) => { // Custom URLs must have a trailing `/`. Otherwise the custom // path can be truncated. // // See: https://docs.rs/reqwest/0.11.22/reqwest/struct.Url.html#method.join let mut sanitized = url.clone(); if !url.ends_with('/') { sanitized.push('/'); } sanitized } None => GITHUB_BASE_URL.into(), } } } impl Prr { /// Create a new Prr object using the main config and/or the local config. /// If a local config has the `[prr]` section use this one instead of the main config. /// If `[prr]` section is not defined merge the local config with the main local. /// If local config file does not exist, use only the main config. /// /// A `[prr]` redefinition must be complete; if not, panics with a /// `redefinition of table `prr` for key `prr` at ...` pub fn new(config_path: &Path, local_config_path: Option) -> Result { let config_contents = fs::read_to_string(config_path).context("Failed to read config")?; let local_config_contents = if let Some(project_config_path) = &local_config_path { fs::read_to_string(project_config_path).context("Failed to read local config")? } else { String::new() }; let override_config = toml::from_str::(&local_config_contents); let config: Config = match override_config { // If `override_config` does not raise an error, use this one as config. Ok(config) => config, // Else merge the two config contents. Err(_) => { let contents = format!("{}\n{}", config_contents, local_config_contents); toml::from_str::(&contents)? } }; let octocrab = Octocrab::builder() .personal_token(config.prr.token.clone()) .base_uri(config.url()) .context("Failed to parse github base URL")? .build() .context("Failed to create GH client")?; Ok(Prr { config, local_config: local_config_path, crab: octocrab, }) } /// Returns path to prr workdir fn workdir(&self) -> Result { // Try local config first if let Some(lcfg) = &self.config.local { // Can't have a parsed local config without a stored path debug_assert!(self.local_config.is_some()); if let Some(wd) = &lcfg.workdir { if wd.starts_with('~') { bail!("Invalid workdir={wd}: may not use '~'"); } // We allow resolving relative paths in local config relative to the local config file let mut resolved_wd = PathBuf::new(); // No parent seems impossible but I think it's correct to not push anything if let Some(local_dir) = self.local_config.as_ref().unwrap().parent() { resolved_wd.push(local_dir); } // NB: pushing an absolute path overwrites the PathBuf resolved_wd.push(wd); return Ok(resolved_wd); } } // Now try global config if let Some(wd) = &self.config.prr.workdir { if wd.starts_with('~') { bail!("Invalid workdir={wd}: may not use '~'"); } let p = Path::new(wd).to_path_buf(); if !p.is_absolute() { bail!("Invalid workdir={wd}: must be absolute path"); } return Ok(p); } // Default workdir let xdg_dirs = xdg::BaseDirectories::with_prefix("prr")?; Ok(xdg_dirs.get_data_home()) } pub fn is_pr_metadata_experiment_active(&self) -> bool { self.config.prr.activate_pr_metadata_experiment } /// Parses a PR string in the form of `danobi/prr/24` and returns /// a tuple ("danobi", "prr", 24) or an error if string is malformed. /// If the local repository config is defined, it just needs the PR number. pub fn parse_pr_str(&self, s: &str) -> Result<(String, String, u64)> { let f = |captures: Captures| -> Result<(String, String, u64)> { let owner = captures.name("org").unwrap().as_str().to_owned(); let repo = captures.name("repo").unwrap().as_str().to_owned(); let pr_nr: u64 = captures .name("pr_num") .unwrap() .as_str() .parse() .context("Failed to parse pr number")?; Ok((owner, repo, pr_nr)) }; let repo = if let Some(local_config) = &self.config.local { if let Some(url) = &local_config.repository { if url.ends_with('/') { format!("{}{}", url, s) } else { format!("{}/{}", url, s) } } else { s.to_string() } } else { s.to_string() }; if let Some(captures) = SHORT.captures(&repo) { f(captures) } else if let Some(captures) = URL.captures(&repo) { f(captures) } else { bail!("Invalid PR ref format") } } /// Gets a new review from the internet and writes it to the filesystem pub async fn get_pr( &self, owner: &str, repo: &str, pr_num: u64, force: bool, ) -> Result { let pr_handler = self.crab.pulls(owner, repo); let diff = pr_handler .get_diff(pr_num) .await .context("Failed to fetch diff")?; let pr = pr_handler.get(pr_num).await.context("Failed to fetch pr")?; let commit_id = pr.head.sha; let mut pr_description = None; if self.is_pr_metadata_experiment_active() { pr_description = Some(pr.body.unwrap_or("".to_string())); } Review::new( &self.workdir()?, diff, owner, repo, pr_description, pr_num, commit_id, force, ) } /// Gets an existing review from the filesystem pub fn get_review(&self, owner: &str, repo: &str, pr_num: u64) -> Result { let workdir = self.workdir()?; Ok(Review::new_existing(&workdir, owner, repo, pr_num)) } pub async fn submit_pr(&self, owner: &str, repo: &str, pr_num: u64, debug: bool) -> Result<()> { let review = Review::new_existing(&self.workdir()?, owner, repo, pr_num); let (review_action, review_comment, inline_comments, file_comments) = review.comments()?; if review_comment.is_empty() && inline_comments.is_empty() && review_action != ReviewAction::Approve { bail!("No review comments"); } let mut body = json!({ "body": review_comment, "event": match review_action { ReviewAction::Approve => "APPROVE", ReviewAction::RequestChanges => "REQUEST_CHANGES", ReviewAction::Comment => "COMMENT" }, "comments": inline_comments .iter() .map(|c| { let (line, side) = match c.line { LineLocation::Left(line) => (line, "LEFT"), LineLocation::Right(line) => (line, "RIGHT"), }; let mut json_comment = json!({ "path": c.file, "line": line, "body": c.comment, "side": side, }); if let Some(start_line) = &c.start_line { let (line, side) = match start_line { LineLocation::Left(line) => (line, "LEFT"), LineLocation::Right(line) => (line, "RIGHT"), }; json_comment["start_line"] = (*line).into(); json_comment["start_side"] = side.into(); } json_comment }) .collect::>(), }); let commit = review.commit_id()?; if let Some(id) = &commit { if let serde_json::Value::Object(ref mut obj) = body { obj.insert("commit_id".to_string(), json!(id)); } } else if !file_comments.is_empty() { bail!( "Metadata contained no commit_id, but it's required to leave file-level comments" ); } if debug { println!("{}", serde_json::to_string_pretty(&body)?); } self.submit_review(&review, owner, repo, pr_num, &body) .await?; for fc in &file_comments { self.submit_file_comment(owner, repo, pr_num, commit.as_ref().unwrap(), fc) .await? } Ok(()) } async fn submit_review( &self, review: &Review, owner: &str, repo: &str, pr_num: u64, body: &Value, ) -> Result<()> { let path = format!("repos/{}/{}/pulls/{}/reviews", owner, repo, pr_num); let uri = Uri::builder() .path_and_query(path) .build() .context("Invalid URI")?; match self.crab._post(uri, Some(body)).await { Ok(resp) => { let status = resp.status(); if status != StatusCode::OK { let text = self .crab .body_to_string(resp) .await .context("Failed to decode failed response")?; bail!("Error during POST: Status code: {}, Body: {}", status, text); } review .mark_submitted() .context("Failed to update review metadata")?; Ok(()) } // GH is known to send unescaped control characters in JSON responses which // serde will fail to parse (not that it should succeed) Err(octocrab::Error::Json { source: _, backtrace: _, }) => { eprintln!("Warning: GH response had invalid JSON"); Ok(()) } Err(e) => bail!("Error during POST: {}", e), } } async fn submit_file_comment( &self, owner: &str, repo: &str, pr_num: u64, commit_id: &str, fc: &FileComment, ) -> Result<()> { let body = json!({ "body": fc.comment, "commit_id": commit_id, "path": fc.file, "subject_type": "file", }); let path = format!("repos/{}/{}/pulls/{}/comments", owner, repo, pr_num); let uri = Uri::builder() .path_and_query(path) .build() .context("Invalid URI")?; match self.crab._post(uri, Some(&body)).await { Ok(resp) => { let status = resp.status(); if status != StatusCode::CREATED { let text = self .crab .body_to_string(resp) .await .context("Failed to decode failed response")?; bail!("Error during POST: Status code: {}, Body: {}", status, text); } Ok(()) } // GH is known to send unescaped control characters in JSON responses which // serde will fail to parse (not that it should succeed) Err(octocrab::Error::Json { source: _, backtrace: _, }) => { eprintln!("Warning: GH response had invalid JSON"); Ok(()) } Err(e) => bail!("Error during POST: {}", e), } } pub fn apply_pr(&self, owner: &str, repo: &str, pr_num: u64, apply_repo: &Path) -> Result<()> { let review = Review::new_existing(&self.workdir()?, owner, repo, pr_num); let diff = Diff::from_buffer(review.diff()?.as_bytes()).context("Failed to load diff")?; let apply_repo_path = Path::new(apply_repo); let apply_repo = Repository::open(apply_repo_path).context("Failed to open git repository")?; // Best effort check to prevent clobbering any work in progress let mut opts = StatusOptions::new(); opts.include_ignored(false); let statuses = apply_repo .statuses(Some(&mut opts)) .context("Failed to get repo status")?; if !statuses.is_empty() { bail!("Working directory is dirty"); } apply_repo .apply(&diff, ApplyLocation::WorkDir, None) .context("Failed to apply diff") } pub fn print_status(&self, no_titles: bool) -> Result<()> { let mut table = Table::new(); let mut table_fmt = *format::consts::FORMAT_CLEAN; // Get rid of leading padding on each line table_fmt.padding(0, 2); table.set_format(table_fmt); if !no_titles { table.set_titles(row!["Handle", "Status", "Review file"]) } let reviews = get_all_existing(&self.workdir()?).context("Failed to get all reviews")?; for review in reviews { table.add_row(row![ review.handle(), review.status()?, review.path().display() ]); } table.printstd(); Ok(()) } /// Removes reviews from the filesystem pub async fn remove(&self, prs: &[String], force: bool, submitted: bool) -> Result<()> { for pr in prs { let (owner, repo, pr_num) = self.parse_pr_str(pr)?; let review = self.get_review(&owner, &repo, pr_num)?; review .remove(force) .with_context(|| anyhow!("Failed to remove {}", pr))?; } if !submitted { return Ok(()); } let reviews = get_all_existing(&self.workdir()?).context("Failed to all reviews")?; for review in reviews { if review.status()? == ReviewStatus::Submitted { let handle = review.handle(); review .remove(force) .with_context(|| anyhow!("Failed to remove {}", handle))?; } } Ok(()) } } #[cfg(test)] mod tests { use super::*; use std::fs::File; use std::io::Write; use tempfile::TempDir; // Lays down configs in a tempdir // // NB: Configs get deleted if returned `TempDir` is dropped fn config(global: &str, local: Option<&str>) -> (Prr, TempDir) { let dir = TempDir::new().unwrap(); let gpath = dir.path().join("config.toml"); let mut gfile = File::create(&gpath).unwrap(); write!(&mut gfile, "{}", global).unwrap(); let lpath = if let Some(lcontents) = local { let lpath = dir.path().join("local_config.toml"); let mut lfile = File::create(&lpath).unwrap(); write!(&mut lfile, "{}", lcontents).unwrap(); Some(lpath) } else { None }; let prr = Prr::new(&gpath, lpath).unwrap(); (prr, dir) } lazy_static! { // Basic dummy config just to avoid errors static ref PRR: (Prr, TempDir) = { let gconfig = r#" [prr] token = "test" workdir = "/tmp" "#; config(gconfig, None) }; } #[tokio::test] async fn test_parse_basic_pr_str() { let pr_ref = "example/prr/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr".to_string(), 42) ) } #[tokio::test] async fn test_parse_dotted_pr_str() { let pr_ref = "example/prr.test/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr.test".to_string(), 42) ) } #[tokio::test] async fn test_parse_underscored_pr_str() { let pr_ref = "example/prr_test/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr_test".to_string(), 42) ) } #[tokio::test] async fn test_parse_dashed_pr_str() { let pr_ref = "example/prr-test/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr-test".to_string(), 42) ) } #[tokio::test] async fn test_parse_numbered_pr_str() { let pr_ref = "example/prr1/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr1".to_string(), 42) ) } #[tokio::test] async fn test_parse_mixed_pr_str() { let pr_ref = "example/prr1.test_test-/42"; assert_eq!( PRR.0.parse_pr_str(pr_ref).unwrap(), ("example".to_string(), "prr1.test_test-".to_string(), 42) ) } #[tokio::test] async fn test_local_config_repository() { let gconfig = r#" [prr] token = "test" "#; let lconfig = r#" [local] repository = "testorg/testrepo" "#; let (prr, _dir) = config(gconfig, Some(lconfig)); assert_eq!( prr.parse_pr_str("42").unwrap(), ("testorg".to_string(), "testrepo".to_string(), 42) ) } #[tokio::test] async fn test_global_workdir() { let gconfig = r#" [prr] token = "test" workdir = "/globalworkdir" "#; let (prr, _dir) = config(gconfig, None); assert_eq!(prr.workdir().unwrap(), Path::new("/globalworkdir")) } #[tokio::test] async fn test_local_workdir() { let gconfig = r#" [prr] token = "test" "#; let lconfig = r#" [local] workdir = "/localworkdir" "#; let (prr, _dir) = config(gconfig, Some(lconfig)); assert_eq!(prr.workdir().unwrap(), Path::new("/localworkdir")) } #[tokio::test] async fn test_local_workdir_relative() { let gconfig = r#" [prr] token = "test" "#; let lconfig = r#" [local] workdir = "localrelativeworkdir" "#; let (prr, dir) = config(gconfig, Some(lconfig)); assert_eq!( prr.workdir().unwrap(), dir.path().join("localrelativeworkdir") ) } #[tokio::test] async fn test_local_workdir_override() { let gconfig = r#" [prr] token = "test" workdir = "/globalworkdir" "#; let lconfig = r#" [local] workdir = "/localworkdir" "#; let (prr, _dir) = config(gconfig, Some(lconfig)); assert_eq!(prr.workdir().unwrap(), Path::new("/localworkdir")) } #[tokio::test] async fn test_invalid_relative_workdir() { let gconfig = r#" [prr] token = "test" workdir = "relativeworkdir" "#; let (prr, _dir) = config(gconfig, None); assert!(prr.workdir().is_err()); } fn copy_dir_all(src: impl AsRef, dst: impl AsRef) { fs::create_dir_all(&dst).expect("could not create_dir_all"); for entry in fs::read_dir(src).expect("could not read_dir") { let entry = entry.expect("entry is not valid"); let ty = entry.file_type().expect("cannot get filetype"); if ty.is_dir() { copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name())); } else { fs::copy(entry.path(), dst.as_ref().join(entry.file_name())) .expect("copy in copy_dir_all failed"); } } } #[tokio::test] async fn test_apply_pr() { let gconfig = r#" [prr] token = "doesn'tmatter" workdir = "doesn'tmatter" "#; let lconfig = r#" [local] workdir = "testdata/" "#; let (prr, dir) = config(gconfig, Some(lconfig)); let test_review_path = dir.path().to_str().expect("tmp path invalid").to_string() + "/testdata/apply_pr"; fs::create_dir_all(&test_review_path).expect("failed to create temp directory"); copy_dir_all("testdata/review/apply_pr", &test_review_path); let test_repo_path = dir.path().to_str().unwrap().to_string() + "/testgitrepo/"; fs::create_dir_all(&test_repo_path).expect("couldn't create testgitrepo"); let test_repo = git2::Repository::init(&test_repo_path).expect("couldn't init testgitrepo"); std::fs::copy( "testdata/testgitrepo/README.md", test_repo_path.clone() + "README.md", ) .expect("copy README.md failed"); let mut index = test_repo.index().expect("couldn't get repo index"); index .add_path(Path::new("README.md")) .expect("couldn't add path"); let new_tree_oid = index.write_tree().expect("couldn't write tree"); index.write().expect("couldn't write index"); let signature = git2::Signature::now("someone", "someone@somewhere.com") .expect("failed to create signature"); let new_tree = test_repo.find_tree(new_tree_oid).unwrap(); test_repo .commit( Some("HEAD"), &signature, &signature, "Initial commit", &new_tree, &[], ) .expect("failed to commit"); // add non-tracked file for testing purposes std::fs::copy( "testdata/testgitrepo/README.md", test_repo_path.clone() + "README-not-tracked.md", ) .expect("copy README-not-tracked.md failed"); prr.apply_pr("apply_pr", "review", 1, Path::new(&test_repo_path)) .expect("apply_pr failed"); let got_after_apply = fs::read(test_repo_path.clone() + "README.md") .expect("failed to read README.md with diff applied"); let want_after_apply = fs::read("testdata/testgitrepo/README-applied.md") .expect("failed to read README-applied.md"); assert_eq!(got_after_apply, want_after_apply); } } prr-0.20.0/src/review.rs000064400000000000000000000645171046102023000131610ustar 00000000000000use std::fmt::{Display, Formatter, Result as fmt_result, Write as fmt_write}; use std::fs; use std::fs::OpenOptions; use std::io::Write; use std::path::{Path, PathBuf}; use std::time::SystemTime; use anyhow::{anyhow, bail, Context, Result}; use serde_derive::{Deserialize, Serialize}; use crate::parser::{Comment, FileComment, InlineComment, ReviewAction, ReviewParser}; /// We support a few common variants of snips. /// These are semantically identical. const SNIP_VARIANTS: &[&str] = &["[..]", "[...]"]; /// Represents the state of a single review pub struct Review { /// Path to workdir workdir: PathBuf, /// Name of the owner of the repository owner: String, /// Name of the repository repo: String, /// Issue # of the pull request pr_num: u64, } /// Metadata for a single review. Stored as dotfile next to user-facing review file #[derive(Serialize, Deserialize, Debug)] struct ReviewMetadata { /// Original .diff file contents. Used to detect corrupted review files original: String, /// Time (seconds since epoch) the review file was last submitted submitted: Option, /// The commit hash of the PR at the time the review was started commit_id: Option, } /// Status of a review #[derive(PartialEq, Debug)] pub enum ReviewStatus { /// Newly downloaded review; no changes yet New, /// Unsubmitted changes have been made to review file Reviewed, /// Review has been submitted. Any further changes to the review file are ignored Submitted, } /// Represents a single line in a review file. enum LineType<'a> { /// Original text (but stored without the leading `> `) Quoted(&'a str), /// A snip (`[..]`) Snip, /// User supplied comment Comment(&'a str), } impl Display for ReviewStatus { fn fmt(&self, f: &mut Formatter<'_>) -> fmt_result { let text = match self { Self::New => "NEW", Self::Reviewed => "REVIEWED", Self::Submitted => "SUBMITTED", }; write!(f, "{text}") } } impl<'a> From<&'a str> for LineType<'a> { fn from(line: &'a str) -> Self { if let Some(text) = line.strip_prefix("> ") { Self::Quoted(text) } else if SNIP_VARIANTS.contains(&line.trim()) { Self::Snip } else { Self::Comment(line) } } } fn prefix_lines(s: &str, prefix: &str) -> String { let mut ret = String::with_capacity(s.len()); for line in s.lines() { if line.is_empty() { ret += &(prefix.to_owned() + " \n"); } else { // Appending to heap allocated string cannot fail writeln!(ret, "{} {}", prefix, line).expect("Failed to write to string"); } } ret } /// Returns a list of all reviews in a workdir pub fn get_all_existing(workdir: &Path) -> Result> { // This pipeline does the following: // * Iterate through all org directories in workdir // * For each org directory, iterate through all contained repo directories // * For each repo directory, enumerate all non-metadata review files let reviews: Vec = fs::read_dir(workdir) .context("Failed to read workdir")? .filter_map(|entry| entry.ok()) .map(|org| org.path()) .filter(|org| org.is_dir()) .filter_map(|org| fs::read_dir(org).ok()) .flatten() .filter_map(|repo| repo.ok()) .map(|repo| repo.path()) .filter(|repo| repo.is_dir()) .filter_map(|repo| fs::read_dir(repo).ok()) .flatten() .filter_map(|review| review.ok()) .map(|review| review.path()) .filter(|review| review.is_file()) .filter(|review| match review.extension() { Some(e) => e == "prr", None => false, }) .collect(); let mut ret = Vec::with_capacity(reviews.len()); for review in reviews { let parts: Vec<_> = review .iter() .rev() .take(3) .map(|p| p.to_string_lossy()) .collect(); if parts.len() != 3 { bail!("malformed review file path: {}", review.display()); } let pr_num: u64 = parts[0] .strip_suffix(".prr") .unwrap_or(&parts[0]) .parse() .with_context(|| format!("Failed to parse PR num: {}", review.display()))?; // Note the vec has components reversed let r = Review::new_existing(workdir, &parts[2], &parts[1], pr_num); ret.push(r); } Ok(ret) } /// Recursive helper for `resolve_snips()`. /// /// This function will return Some(lines), where lines is a Vec of resolved /// lines. There should not be any trailing newlines in `lines`. /// /// The problem of resolving snips transposes pretty cleanly to the classic /// glob matching algorithm. We implement the glob matching fairly naively /// using recursion b/c it's cleaner to recurse when we want to eventually /// return a value. /// /// This would be in contrast to rsc's glob algorithm [0] where it's more /// efficient and has less pathological corner cases. We choose to trade off /// performance for simplicity here. /// /// [0]: https://research.swtch.com/glob fn resolve_snips_recurse<'a>(pattern: &[LineType<'a>], text: &[&'a str]) -> Option> { let mut resolved = Vec::new(); let mut pattern_idx = 0; let mut text_idx = 0; while pattern_idx < pattern.len() || text_idx < text.len() { if pattern_idx < pattern.len() { match pattern[pattern_idx] { LineType::Quoted(line) => { if text_idx < text.len() && text[text_idx] == line { resolved.push(format!("> {line}")); pattern_idx += 1; text_idx += 1; continue; } } // Comments are semantically irrelevant to snip resolution. But we still // need to account for them in returned output. LineType::Comment(line) => { resolved.push(line.to_string()); pattern_idx += 1; continue; } // Begin glob logic LineType::Snip => { // Here we try making the snip consume 0 lines, 1 line, and so forth. // // Skipping comments is technically a noop and in theory we could rework // this code to only skip matchable text. But that is just an optimization. for cand_text_idx in text_idx..=text.len() { let cand_pattern = &pattern[pattern_idx + 1..]; let cand_text = &text[cand_text_idx..]; if let Some(mut r) = resolve_snips_recurse(cand_pattern, cand_text) { let skipped: Vec = text[text_idx..cand_text_idx] .iter() .map(|&line| format!("> {line}")) .collect(); resolved.extend_from_slice(&skipped); resolved.append(&mut r); return Some(resolved); } } } } } // If we reach here, we either have some `pattern` or `text` still left to // process. Meaning one ran out before the other. Which implies a resolution // failure. return None; } // We've finished processing all of `text` and `pattern`. So resolution success. Some(resolved) } impl Review { /// Creates a new `Review` /// /// `review_file` is the path where the user-facing review file should /// be created. Additional metadata files (dotfiles) may be created in the same /// directory. pub fn new( workdir: &Path, diff: String, owner: &str, repo: &str, pr_description: Option, pr_num: u64, commit_id: String, force: bool, ) -> Result { let review = Review { workdir: workdir.to_owned(), owner: owner.to_owned(), repo: repo.to_owned(), pr_num, }; // First create directories leading up to review file if necessary let review_path = review.path(); let review_dir = review_path .parent() .ok_or_else(|| anyhow!("Review path has no parent!"))?; fs::create_dir_all(review_dir).context("Failed to create workdir directories")?; // Check if there are unsubmitted changes if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { bail!( "You have unsubmitted changes to the requested review. \ Either submit the existing changes, delete the existing review file, \ or re-run this command with --force." ); } // Now create review file let mut review_file = OpenOptions::new() .write(true) .create(true) .truncate(true) .open(&review_path) .context("Failed to create review file")?; let mut description = pr_description.unwrap_or_else(String::default); if !description.is_empty() { description += "\n"; } let original_contents = description + &diff; let prefixed_contents = prefix_lines(&original_contents, ">"); review_file .write_all(prefixed_contents.as_bytes()) .context("Failed to write review file")?; // Create metadata file let metadata = ReviewMetadata { original: original_contents, submitted: None, commit_id: Some(commit_id), }; let json = serde_json::to_string(&metadata)?; let metadata_path = review.metadata_path(); let mut metadata_file = OpenOptions::new() .write(true) .create(true) .truncate(true) .open(metadata_path) .context("Failed to create metadata file")?; metadata_file .write_all(json.as_bytes()) .context("Failed to write metadata file")?; Ok(review) } /// Creates a `Review` that already exists on disk /// /// Note we do not check that anything actually exists on disk because that is /// inherently racy. We'll handle ENOENT errors when we actually use any files. pub fn new_existing(workdir: &Path, owner: &str, repo: &str, pr_num: u64) -> Review { Review { workdir: workdir.to_owned(), owner: owner.to_owned(), repo: repo.to_owned(), pr_num, } } /// Parse the user-supplied comments on a review /// /// Returns (overall review action, overall review comment, inline comments, file comments) pub fn comments(&self) -> Result<(ReviewAction, String, Vec, Vec)> { let raw = fs::read_to_string(self.path()).context("Failed to read review file")?; let contents = self.resolve_snips(&raw)?; self.validate_review_file(&contents)?; let mut parser = ReviewParser::new(); let mut review_action = ReviewAction::Comment; let mut review_comment = String::new(); let mut inline_comments = Vec::new(); let mut file_comments = Vec::new(); for (idx, line) in contents.lines().enumerate() { let res = parser .parse_line(line) .with_context(|| format!("Failed to parse review on line {}", idx + 1))?; match res { Some(Comment::Review(c)) => { if !review_comment.is_empty() { bail!("Somehow saw more than one review comment"); } review_comment = c; } Some(Comment::Inline(c)) => inline_comments.push(c), Some(Comment::ReviewAction(a)) => review_action = a, Some(Comment::File(fc)) => file_comments.push(fc), None => {} } } match parser.finish() { Some(Comment::Inline(c)) => inline_comments.push(c), // Original diff must have been short to begin with Some(Comment::Review(_)) => bail!("Unexpected review comment at parser finish"), Some(Comment::ReviewAction(_)) => bail!("Unexpected review action at parser finish"), Some(Comment::File(_)) => bail!("Unexpected file-level comment at parser finish"), None => {} }; Ok(( review_action, review_comment, inline_comments, file_comments, )) } /// Update the review file's submission time pub fn mark_submitted(&self) -> Result<()> { let metadata_path = self.metadata_path(); let mut metadata = self.metadata()?; let submission_time = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("Time went backwards"); metadata.submitted = Some(submission_time.as_secs()); let json = serde_json::to_string(&metadata)?; let mut metadata_file = OpenOptions::new() .write(true) .create(true) .truncate(true) .open(metadata_path) .context("Failed to create metadata file")?; metadata_file .write_all(json.as_bytes()) .context("Failed to write metadata file")?; Ok(()) } /// Replaces all snips (`[...]`s) from `contents` with original, quoted text. /// Returns resolved contents as new string. fn resolve_snips(&self, contents: &str) -> Result { // First, classify contents into line types. This is henceforth // known as the "pattern" we want to resolve against original text. let pattern: Vec = contents.lines().map(LineType::from).collect(); // If the review file does not have any snips, just skip snip resolution. // // We do this so user gets more informative error message thru validate_review_file() // if they corrupted a quoted line. If we naively (and more efficiently) always // try to resolve snips, they might get the less informative error below. if !pattern.iter().any(|line| matches!(line, LineType::Snip)) { return Ok(contents.to_string()); } // Next, store original text as lines. It's easier to index into this way. // The original text here is unquoted. let original = self.metadata()?.original; let text: Vec<&str> = original.lines().collect(); Ok(resolve_snips_recurse(&pattern, &text) .ok_or_else(|| anyhow!("Failed to resolve snips. Did you corrupt quoted text?"))? .iter() .map(|line| format!("{line}\n")) .collect()) } /// Validates whether the user corrupted the quoted contents fn validate_review_file(&self, contents: &str) -> Result<()> { let mut reconstructed = String::with_capacity(contents.len()); for line in contents.lines() { if let Some(stripped) = line.strip_prefix("> ") { reconstructed += stripped.trim_end(); reconstructed += "\n"; } if line == ">" { reconstructed += "\n"; } } let metadata = self.metadata()?; let original: String = metadata .original .lines() .map(|line| line.trim_end().to_owned() + "\n") .collect(); if reconstructed != original { // Be helpful and provide exact line number of mismatch. // // This loop on zip() will work as long as there isn't any truncation or trailing junk // in the original text. To handle this case, there's the final bail!() for (idx, (l, r)) in reconstructed.lines().zip(original.lines()).enumerate() { if l != r { // Get number of user generated lines up until the mismatch let user_lines = contents .lines() .take(idx) .filter(|l| !l.starts_with('>')) .count(); let err = format!("Line {}, found '{l}' expected '{r}'", idx + 1 + user_lines); bail!("Detected corruption in quoted part of review file: {err}"); } } bail!("Detected corruption in quoted part of review file: found trailing or truncated lines"); } Ok(()) } /// Returns whether or not there exists review comments fn reviewed(&self) -> Result { let (_, review_comment, comments, file_comments) = self .comments() .with_context(|| anyhow!("Failed to parse comments for {}", self.path().display()))?; Ok(!review_comment.is_empty() || !comments.is_empty() || !file_comments.is_empty()) } /// Returns path to user-facing review file pub fn path(&self) -> PathBuf { let mut p = self.workdir.clone(); p.push(&self.owner); p.push(&self.repo); p.push(format!("{}.prr", self.pr_num)); p } /// Loads and returns the parsed contents of the metadata file for the review file fn metadata(&self) -> Result { let meta = fs::read_to_string(self.metadata_path()).context("Failed to load metadata file")?; serde_json::from_str::(&meta).context("Failed to parse metadata file") } fn has_metadata(&self) -> bool { fs::metadata(self.metadata_path()).is_ok() } fn metadata_path(&self) -> PathBuf { let mut metadata_path = self.path(); metadata_path.set_file_name(format!(".{}", self.pr_num)); metadata_path } /// Returns the commit_id associated with the review pub fn commit_id(&self) -> Result> { Ok(self.metadata()?.commit_id.clone()) } /// Returns the original review diff pub fn diff(&self) -> Result { Ok(self.metadata()?.original.clone()) } /// Returns a handle (eg "owner/repo/pr_num") to this review pub fn handle(&self) -> String { format!("{}/{}/{}", self.owner, self.repo, self.pr_num) } /// Gets the status of a review pub fn status(&self) -> Result { let metadata = self.metadata()?; let reviewed = self.reviewed()?; let status = if metadata.submitted.is_some() { ReviewStatus::Submitted } else if reviewed { ReviewStatus::Reviewed } else { ReviewStatus::New }; Ok(status) } /// Remove review from filesystem pub fn remove(self, force: bool) -> Result<()> { if !force && self.status()? == ReviewStatus::Reviewed { bail!( "You have unsubmitted changes to the requested review. \ Re-run this command with --force to ignore this check." ); } fs::remove_file(self.path()).context("Failed to remove review file")?; fs::remove_file(self.metadata_path()).context("Failed to remove metadata file")?; Ok(()) } } #[cfg(test)] mod tests { use std::collections::VecDeque; use std::fs::{create_dir_all, File}; use pretty_assertions::assert_eq as assert_eq_pretty; use tempfile::{tempdir, TempDir}; use super::*; fn setup(review: &str, metadata: &str) -> (Review, TempDir) { let dir = tempdir().expect("Failed to create tempdir"); // Create directory structure let project_dir = dir.path().join("some_owner").join("some_repo"); create_dir_all(&project_dir).expect("Failed to create workdir structure"); // Create and write review file let mut review_file = File::create(project_dir.join("3.prr")).expect("Failed to create review file"); review_file .write_all(review.as_bytes()) .expect("Failed to write review file"); // Create and write metadata file let mut metadata_file = File::create(project_dir.join(".3")).expect("Failed to create metadata file"); metadata_file .write_all(metadata.as_bytes()) .expect("Failed to write metadata file"); let r = Review::new_existing(dir.path(), "some_owner", "some_repo", 3); (r, dir) } // Review file has all trailing whitespace stripped #[test] fn test_validate_stripped() { let review = include_str!("../testdata/review/trailing_whitespace/review"); let metadata = include_str!("../testdata/review/trailing_whitespace/metadata"); let (r, _dir) = setup(review, metadata); r.validate_review_file(review) .expect("Failed to validate review file"); } // Step through review status state machine and validate each state #[test] fn test_review_status() { let review = include_str!("../testdata/review/status/review"); let metadata = include_str!("../testdata/review/status/metadata"); let (r, _dir) = setup(review, metadata); // Using more verbose match to ensure build failure if new states added. // We only need this verbosity once. match r.status().expect("Failed to get review status") { ReviewStatus::New => (), ReviewStatus::Reviewed => panic!("Unexpected Reviewed state"), ReviewStatus::Submitted => panic!("Unpexected Submitted state"), }; // Do a "review" let mut file = OpenOptions::new() .write(true) .append(true) .open(r.path()) .expect("Failed to open review file"); file.write_all(b"asdf\n") .expect("Failed to write review comment"); assert_eq!(r.status().unwrap(), ReviewStatus::Reviewed); // "Submit" the review r.mark_submitted().expect("Failed to submit review"); assert_eq!(r.status().unwrap(), ReviewStatus::Submitted); } #[test] fn test_review_validation_with_pr_description() { let review = include_str!("../testdata/review/pr_description/review"); let metadata = include_str!("../testdata/review/pr_description/metadata"); let (r, _dir) = setup(review, metadata); r.validate_review_file(review) .expect("Failed to validate review file with PR description"); } #[test] fn test_review_validation_with_interleaving_pr_description() { let review = include_str!("../testdata/review/pr_description_interleaving/review"); let metadata = include_str!("../testdata/review/pr_description_interleaving/metadata"); let (r, _dir) = setup(review, metadata); r.validate_review_file(review) .expect("Failed to validate review file with interleaving PR description"); } // Tests creation of a new review #[test] fn test_new_review() { // Create directory structure let workdir = tempdir().expect("Failed to create tempdir"); // Create a review let review = Review::new( workdir.path(), "some_review_contents".to_string(), "some_owner", "some_repo", Some("some_pr_desc".to_string()), 3, "111".to_string(), false, ) .expect("Failed to create new non-existent review"); // Check on disk "database" fs::metadata(review.path()).expect("Failed to read review file"); fs::metadata(review.metadata_path()).expect("Failed to read review file"); } #[test] fn test_snip_single() { let review = include_str!("../testdata/review/snip_single/review"); let gold = include_str!("../testdata/review/snip_single/gold"); let metadata = include_str!("../testdata/review/snip_single/metadata"); let (r, _dir) = setup(review, metadata); assert_eq_pretty!(r.resolve_snips(review).unwrap(), gold); } #[test] fn test_snip_multiple() { let review = include_str!("../testdata/review/snip_multiple/review"); let gold = include_str!("../testdata/review/snip_multiple/gold"); let metadata = include_str!("../testdata/review/snip_multiple/metadata"); let (r, _dir) = setup(review, metadata); assert_eq_pretty!(r.resolve_snips(review).unwrap(), gold); } #[test] fn test_snip_comments() { let review = include_str!("../testdata/review/snip_comments/review"); let gold = include_str!("../testdata/review/snip_comments/gold"); let metadata = include_str!("../testdata/review/snip_comments/metadata"); let (r, _dir) = setup(review, metadata); assert_eq_pretty!(r.resolve_snips(review).unwrap(), gold); } // Here we exhaustively check all possible single snips. It may be worth doing something // similar for multiple snips but it'll be a bit more complicated to implement. #[test] fn test_snip_single_exhaustive() { let gold = include_str!("../testdata/review/snip_single/gold"); let metadata = include_str!("../testdata/review/snip_single/metadata"); let (r, _dir) = setup("", metadata); let nr_lines = gold.lines().count(); for position in 0..=nr_lines { for length in 0..=nr_lines { let mut lines: VecDeque<&str> = gold.lines().collect(); let mut contents = String::new(); let mut idx = 0; while !lines.is_empty() { if idx == position { writeln!(&mut contents, "[...]").unwrap(); for _ in 0..length { lines.pop_front(); idx += 1; } } // A snip appended to gold file will go past "end" of lines if let Some(line) = lines.pop_front() { writeln!(&mut contents, "{line}").unwrap(); } idx += 1; } // Handle 0 length trailing snip if idx == position { writeln!(&mut contents, "[...]").unwrap(); } assert_eq_pretty!(r.resolve_snips(&contents).unwrap(), gold); } } } } prr-0.20.0/testdata/add_oneliner000064400000000000000000000002531046102023000146650ustar 00000000000000> diff --git a/foo.rs b/foo.rs > new file mode 100644 > index 0000000..5a64612 > --- /dev/null > +++ b/foo.rs > @@ -0,0 +1 @@ Comment 1 > +License: Unlicense Comment 2 prr-0.20.0/testdata/approve_review000064400000000000000000000026241046102023000153030ustar 00000000000000@prr approve > diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/back_to_back_span000064400000000000000000000026231046102023000156500ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { Comment 2 > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/cross_file_span_ignored000064400000000000000000000026051046102023000171250ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); Comment 1 > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/cross_hunk_span000064400000000000000000000040301046102023000154360ustar 00000000000000> diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + Cross span comment > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. prr-0.20.0/testdata/deleted_file000064400000000000000000000077741046102023000146660ustar 00000000000000> diff --git a/ch1.txt b/ch1.txt > deleted file mode 100644 > index d30353f..0000000 > --- a/ch1.txt > +++ /dev/null > @@ -1,59 +0,0 @@ > -THE ART OF WAR BY SUN TZU > - > -Translated by Lionel Giles > -Originally published 1910 > - > -This version was generated automatically at www.suntzusaid.com. > - > - > -CHAPTER 1. LAYING PLANS > - > -1. Sun Tzu said: The art of war is of vital importance to the State. > - > -2. It is a matter of life and death, a road either to safety or to ruin. Hence it is a subject of inquiry which can on no account be neglected. > - > -3. The art of war, then, is governed by five constant factors, to be taken into account in one's deliberations, when seeking to determine the conditions obtaining in the field. > - > -4. These are: (1) The Moral Law; (2) Heaven; (3) Earth; (4) The Commander; (5) Method and discipline. > - > -5,6. The MORAL LAW causes the people to be in complete accord with their ruler, so that they will follow him regardless of their lives, undismayed by any danger. > - > -7. HEAVEN signifies night and day, cold and heat, times and seasons. > - > -8. EARTH comprises distances, great and small; danger and security; open ground and narrow passes; the chances of life and death. > - > -9. The COMMANDER stands for the virtues of wisdom, sincerity, benevolence, courage and strictness. > - > -10. By METHOD AND DISCIPLINE are to be understood the marshaling of the army in its proper subdivisions, the graduations of rank among the officers, the maintenance of roads by which supplies may reach the army, and the control of military expenditure. > - > -11. These five heads should be familiar to every general: he who knows them will be victorious; he who knows them not will fail. > - > -12. Therefore, in your deliberations, when seeking to determine the military conditions, let them be made the basis of a comparison, in this wise: > - > -13. (1) Which of the two sovereigns is imbued with the Moral law? (2) Which of the two generals has most ability? (3) With whom lie the advantages derived from Heaven and Earth? (4) On which side is discipline most rigorously enforced? (5) Which army is stronger? (6) On which side are officers and men more highly trained? (7) In which army is there the greater constancy both in reward and punishment? > - > -14. By means of these seven considerations I can forecast victory or defeat. > - > -15. The general that hearkens to my counsel and acts upon it, will conquer: let such a one be retained in command! The general that hearkens not to my counsel nor acts upon it, will suffer defeat: let such a one be dismissed! > - > -16. While heeding the profit of my counsel, avail yourself also of any helpful circumstances over and beyond the ordinary rules. > - > -17. According as circumstances are favorable, one should modify one's plans. > - > -18. All warfare is based on deception. > - > -19. Hence, when able to attack, we must seem unable; when using our forces, we must seem inactive; when we are near, we must make the enemy believe we are far away; when far away, we must make him believe we are near. > - > -20. Hold out baits to entice the enemy. Feign disorder, and crush him. > - > -21. If he is secure at all points, be prepared for him. If he is in superior strength, evade him. > - > -22. If your opponent is of choleric temper, seek to irritate him. Pretend to be weak, that he may grow arrogant. > - > -23. If he is taking his ease, give him no rest. If his forces are united, separate them. > - > -24. Attack him where he is unprepared, appear where you are not expected. > - > -25. These military devices, leading to victory, must not be divulged beforehand. > - Comment 1 > -26. Now the general who wins a battle makes many calculations in his temple ere the battle is fought. The general who loses a battle makes but few calculations beforehand. Thus do many calculations lead to victory, and few calculations to defeat: how much more no calculation at all! It is by attention to this point that I can foresee who is likely to win or lose. prr-0.20.0/testdata/empty_file000064400000000000000000000017561046102023000144100ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index 0000000..fffb281 100644 > --- /dev/null > +++ b/libbpf-cargo/src/btf/btf.rs > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); Comment > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/file_comment000064400000000000000000000026321046102023000147060ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs This is a file-level comment! > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/hunk_start_no_trailing_whitespace000064400000000000000000000077241046102023000212370ustar 00000000000000> diff --git a/ch5.txt b/ch5.txt > new file mode 100644 > index 0000000..762722f > --- /dev/null > +++ b/ch5.txt > @@ -0,0 +1,47 @@ > +CHAPTER 5. ENERGY > + > +1. Sun Tzu said: The control of a large force is the same principle as the control of a few men: it is merely a question of dividing up their numbers. > + > +2. Fighting with a large army under your command is nowise different from fighting with a small one: it is merely a question of instituting signs and signals. > + > +3. To ensure that your whole host may withstand the brunt of the enemy's attack and remain unshaken---this is effected by maneuvers direct and indirect. Great passage > + > +4. That the impact of your army may be like a grindstone dashed against an egg---this is effected by the science of weak points and strong. > + > +5. In all fighting, the direct method may be used for joining battle, but indirect methods will be needed in order to secure victory. > + > +6. Indirect tactics, efficiently applied, are inexhaustible as Heaven and Earth, unending as the flow of rivers and streams; like the sun and moon, they end but to begin anew; like the four seasons, they pass away to return once more. > + > +7. There are not more than five musical notes, yet the combinations of these five give rise to more melodies than can ever be heard. > + > +8. There are not more than five primary colors (blue, yellow, red, white, and black), yet in combination they produce more hues than can ever been seen. > + > +9. There are not more than five cardinal tastes (sour, acrid, salt, sweet, bitter), yet combinations of them yield more flavors than can ever be tasted. > + > +10. In battle, there are not more than two methods of attack: the direct and the indirect; yet these two in combination give rise to an endless series of maneuvers. > + > +11. The direct and the indirect lead on to each other in turn. It is like moving in a circle---you never come to an end. Who can exhaust the possibilities of their combination? > + > +12. The onset of troops is like the rush of a torrent which will even roll stones along in its course. > + > +13. The quality of decision is like the well-timed swoop of a falcon which enables it to strike and destroy its victim. > + > +14. Therefore the good fighter will be terrible in his onset, and prompt in his decision. > + > +15. Energy may be likened to the bending of a crossbow; decision, to the releasing of a trigger. > + > +16. Amid the turmoil and tumult of battle, there may be seeming disorder and yet no real disorder at all; amid confusion and chaos, your array may be without head or tail, yet it will be proof against defeat. > + > +17. Simulated disorder postulates perfect discipline, simulated fear postulates courage; simulated weakness postulates strength. > + > +18. Hiding order beneath the cloak of disorder is simply a question of subdivision; concealing courage under a show of timidity presupposes a fund of latent energy; masking strength with weakness is to be effected by tactical dispositions. > + > +19. Thus one who is skillful at keeping the enemy on the move maintains deceitful appearances, according to which the enemy will act. He sacrifices something, that the enemy may snatch at it. > + > +20. By holding out baits, he keeps him on the march; then with a body of picked men he lies in wait for him. > + > +21. The clever combatant looks to the effect of combined energy, and does not require too much from individuals. Hence his ability to pick out the right men and utilize combined energy. > + > +22. When he utilizes combined energy, his fighting men become as it were like unto rolling logs or stones. For it is the nature of a log or stone to remain motionless on level ground, and to move when on a slope; if four-cornered, to come to a standstill, but if round-shaped, to go rolling down. > + > +23. Thus the energy developed by good fighting men is as the momentum of a round stone rolled down a mountain thousands of feet in height. So much on the subject of energy. prr-0.20.0/testdata/inline_and_review_comments_with_pr_description000064400000000000000000000007031046102023000237670ustar 00000000000000Not necessary. @prr reject > This is just for testing purposes. > diff --git a/README.md b/README.md > index eda592e..ba84732 100644 > --- a/README.md > +++ b/README.md > @@ -1,5 +1,5 @@ > -MA-FSA for Go > -============= > +MA-FSA for Golang > +================= Doesn't seem necessary ... > > Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA) > with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that prr-0.20.0/testdata/multiline_comment000064400000000000000000000026611046102023000157730ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { Comment line 1 Comment line 2 Comment line 4 > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/multiple_files000064400000000000000000000026171046102023000152650ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); Comment 2 > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/reject_review000064400000000000000000000026231046102023000151020ustar 00000000000000@prr reject > diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/review/apply_pr/review/.1000064400000000000000000000004701046102023000171110ustar 00000000000000{"original":"Much better this way!\n\ndiff --git a/README.md b/README.md\nindex 007306a..1a480f2 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,4 +1,4 @@\n For testing\n ===========\n \n-This is a readme\n+This is a better readme line!\n","submitted":null,"commit_id":"7e427a4fffc13a306d91deba55957dc800ee50a8"}prr-0.20.0/testdata/review/apply_pr/review/1.prr000064400000000000000000000003551046102023000176370ustar 00000000000000> Much better this way! > > diff --git a/README.md b/README.md > index 007306a..1a480f2 100644 > --- a/README.md > +++ b/README.md > @@ -1,4 +1,4 @@ > For testing > =========== > > -This is a readme > +This is a better readme line! prr-0.20.0/testdata/review/pr_description/metadata000064400000000000000000000007221046102023000203500ustar 00000000000000{"original":"This is just for testing purposes.\ndiff --git a/README.md b/README.md\nindex eda592e..ba84732 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,5 @@\n-MA-FSA for Go\n-=============\n+MA-FSA for Golang\n+=================\n \n Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA)\n with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that\n","submitted":null,"commit_id":"2c4e14eeb62b2279f185cec0eb986e388da96760"}prr-0.20.0/testdata/review/pr_description/review000064400000000000000000000007211046102023000200700ustar 00000000000000Not necessary but seems ok. @prr approve > This is just for testing purposes. > diff --git a/README.md b/README.md > index eda592e..ba84732 100644 > --- a/README.md > +++ b/README.md > @@ -1,5 +1,5 @@ > -MA-FSA for Go > -============= > +MA-FSA for Golang > +================= Doesn't seem necessary ... > > Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA) > with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that prr-0.20.0/testdata/review/pr_description_interleaving/metadata000064400000000000000000000007221046102023000231170ustar 00000000000000{"original":"This is just for testing purposes.\ndiff --git a/README.md b/README.md\nindex eda592e..ba84732 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,5 @@\n-MA-FSA for Go\n-=============\n+MA-FSA for Golang\n+=================\n \n Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA)\n with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that\n","submitted":null,"commit_id":"2c4e14eeb62b2279f185cec0eb986e388da96760"}prr-0.20.0/testdata/review/pr_description_interleaving/review000064400000000000000000000007401046102023000226400ustar 00000000000000Not necessary. @prr reject > This is just for testing purposes. This might be fine or not. > diff --git a/README.md b/README.md > index eda592e..ba84732 100644 > --- a/README.md > +++ b/README.md > @@ -1,5 +1,5 @@ > -MA-FSA for Go > -============= > +MA-FSA for Golang > +================= Doesn't seem necessary ... > > Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA) > with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that prr-0.20.0/testdata/review/snip_comments/gold000064400000000000000000000021261046102023000173470ustar 00000000000000> diff --git a/src/review.rs b/src/review.rs file comment! > index e39fd6f..e94680e 100644 > --- a/src/review.rs > +++ b/src/review.rs > @@ -155,7 +155,7 @@ impl Review { > fs::create_dir_all(review_dir).context("Failed to create workdir directories")?; > > // Check if there are unsubmitted changes > - if !force && review.status()? == ReviewStatus::Reviewed { > + if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { woah! > bail!( > "You have unsubmitted changes to the requested review. \ > Either submit the existing changes, delete the existing review file, \ > @@ -353,6 +353,10 @@ impl Review { > serde_json::from_str::(&meta).context("Failed to parse metadata file") > } > > + fn has_metadata(&self) -> bool { nice > + fs::metadata(self.metadata_path()).is_ok() sheesh > + } > + > fn metadata_path(&self) -> PathBuf { > let mut metadata_path = self.path(); > metadata_path.set_file_name(format!(".{}", self.pr_num)); prr-0.20.0/testdata/review/snip_comments/metadata000064400000000000000000000021711046102023000202020ustar 00000000000000{"original":"diff --git a/src/review.rs b/src/review.rs\nindex e39fd6f..e94680e 100644\n--- a/src/review.rs\n+++ b/src/review.rs\n@@ -155,7 +155,7 @@ impl Review {\n fs::create_dir_all(review_dir).context(\"Failed to create workdir directories\")?;\n \n // Check if there are unsubmitted changes\n- if !force && review.status()? == ReviewStatus::Reviewed {\n+ if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed {\n bail!(\n \"You have unsubmitted changes to the requested review. \\\n Either submit the existing changes, delete the existing review file, \\\n@@ -353,6 +353,10 @@ impl Review {\n serde_json::from_str::(&meta).context(\"Failed to parse metadata file\")\n }\n \n+ fn has_metadata(&self) -> bool {\n+ fs::metadata(self.metadata_path()).is_ok()\n+ }\n+\n fn metadata_path(&self) -> PathBuf {\n let mut metadata_path = self.path();\n metadata_path.set_file_name(format!(\".{}\", self.pr_num));\n","submitted":null,"commit_id":"1fa28537aa07ac608e9d5bc4ed953ddd4b348cee"}prr-0.20.0/testdata/review/snip_comments/review000064400000000000000000000012111046102023000177150ustar 00000000000000> diff --git a/src/review.rs b/src/review.rs file comment! [...] > - if !force && review.status()? == ReviewStatus::Reviewed { > + if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { woah! > bail!( > "You have unsubmitted changes to the requested review. \ > Either submit the existing changes, delete the existing review file, \ > @@ -353,6 +353,10 @@ impl Review { > serde_json::from_str::(&meta).context("Failed to parse metadata file") > } [...] nice > + fs::metadata(self.metadata_path()).is_ok() sheesh [...] prr-0.20.0/testdata/review/snip_multiple/gold000064400000000000000000000020611046102023000173530ustar 00000000000000> diff --git a/src/review.rs b/src/review.rs > index e39fd6f..e94680e 100644 > --- a/src/review.rs > +++ b/src/review.rs > @@ -155,7 +155,7 @@ impl Review { > fs::create_dir_all(review_dir).context("Failed to create workdir directories")?; > > // Check if there are unsubmitted changes > - if !force && review.status()? == ReviewStatus::Reviewed { > + if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { > bail!( > "You have unsubmitted changes to the requested review. \ > Either submit the existing changes, delete the existing review file, \ > @@ -353,6 +353,10 @@ impl Review { > serde_json::from_str::(&meta).context("Failed to parse metadata file") > } > > + fn has_metadata(&self) -> bool { > + fs::metadata(self.metadata_path()).is_ok() > + } > + > fn metadata_path(&self) -> PathBuf { > let mut metadata_path = self.path(); > metadata_path.set_file_name(format!(".{}", self.pr_num)); prr-0.20.0/testdata/review/snip_multiple/metadata000064400000000000000000000021711046102023000202100ustar 00000000000000{"original":"diff --git a/src/review.rs b/src/review.rs\nindex e39fd6f..e94680e 100644\n--- a/src/review.rs\n+++ b/src/review.rs\n@@ -155,7 +155,7 @@ impl Review {\n fs::create_dir_all(review_dir).context(\"Failed to create workdir directories\")?;\n \n // Check if there are unsubmitted changes\n- if !force && review.status()? == ReviewStatus::Reviewed {\n+ if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed {\n bail!(\n \"You have unsubmitted changes to the requested review. \\\n Either submit the existing changes, delete the existing review file, \\\n@@ -353,6 +353,10 @@ impl Review {\n serde_json::from_str::(&meta).context(\"Failed to parse metadata file\")\n }\n \n+ fn has_metadata(&self) -> bool {\n+ fs::metadata(self.metadata_path()).is_ok()\n+ }\n+\n fn metadata_path(&self) -> PathBuf {\n let mut metadata_path = self.path();\n metadata_path.set_file_name(format!(\".{}\", self.pr_num));\n","submitted":null,"commit_id":"1fa28537aa07ac608e9d5bc4ed953ddd4b348cee"}prr-0.20.0/testdata/review/snip_multiple/review000064400000000000000000000010721046102023000177300ustar 00000000000000[...] > index e39fd6f..e94680e 100644 [..] > +++ b/src/review.rs > @@ -155,7 +155,7 @@ impl Review { > fs::create_dir_all(review_dir).context("Failed to create workdir directories")?; > [...] > + if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { > bail!( > "You have unsubmitted changes to the requested review. \ [...] > } > > + fn has_metadata(&self) -> bool { > + fs::metadata(self.metadata_path()).is_ok() > + } > + > fn metadata_path(&self) -> PathBuf { [..] prr-0.20.0/testdata/review/snip_single/gold000064400000000000000000000020611046102023000170010ustar 00000000000000> diff --git a/src/review.rs b/src/review.rs > index e39fd6f..e94680e 100644 > --- a/src/review.rs > +++ b/src/review.rs > @@ -155,7 +155,7 @@ impl Review { > fs::create_dir_all(review_dir).context("Failed to create workdir directories")?; > > // Check if there are unsubmitted changes > - if !force && review.status()? == ReviewStatus::Reviewed { > + if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed { > bail!( > "You have unsubmitted changes to the requested review. \ > Either submit the existing changes, delete the existing review file, \ > @@ -353,6 +353,10 @@ impl Review { > serde_json::from_str::(&meta).context("Failed to parse metadata file") > } > > + fn has_metadata(&self) -> bool { > + fs::metadata(self.metadata_path()).is_ok() > + } > + > fn metadata_path(&self) -> PathBuf { > let mut metadata_path = self.path(); > metadata_path.set_file_name(format!(".{}", self.pr_num)); prr-0.20.0/testdata/review/snip_single/metadata000064400000000000000000000021711046102023000176360ustar 00000000000000{"original":"diff --git a/src/review.rs b/src/review.rs\nindex e39fd6f..e94680e 100644\n--- a/src/review.rs\n+++ b/src/review.rs\n@@ -155,7 +155,7 @@ impl Review {\n fs::create_dir_all(review_dir).context(\"Failed to create workdir directories\")?;\n \n // Check if there are unsubmitted changes\n- if !force && review.status()? == ReviewStatus::Reviewed {\n+ if !force && review.has_metadata() && review.status()? == ReviewStatus::Reviewed {\n bail!(\n \"You have unsubmitted changes to the requested review. \\\n Either submit the existing changes, delete the existing review file, \\\n@@ -353,6 +353,10 @@ impl Review {\n serde_json::from_str::(&meta).context(\"Failed to parse metadata file\")\n }\n \n+ fn has_metadata(&self) -> bool {\n+ fs::metadata(self.metadata_path()).is_ok()\n+ }\n+\n fn metadata_path(&self) -> PathBuf {\n let mut metadata_path = self.path();\n metadata_path.set_file_name(format!(\".{}\", self.pr_num));\n","submitted":null,"commit_id":"1fa28537aa07ac608e9d5bc4ed953ddd4b348cee"}prr-0.20.0/testdata/review/snip_single/review000064400000000000000000000005141046102023000173560ustar 00000000000000> diff --git a/src/review.rs b/src/review.rs [...] > } > > + fn has_metadata(&self) -> bool { > + fs::metadata(self.metadata_path()).is_ok() > + } > + > fn metadata_path(&self) -> PathBuf { > let mut metadata_path = self.path(); > metadata_path.set_file_name(format!(".{}", self.pr_num)); prr-0.20.0/testdata/review/status/metadata000064400000000000000000000005411046102023000166460ustar 00000000000000{"original":"diff --git a/src/utils.cpp b/src/utils.cpp\nindex b02c16bc3df..fca25d6c839 100644\n--- a/src/utils.cpp\n+++ b/src/utils.cpp\n@@ -1,5 +1,6 @@\n #include \n #include \n+#include \n #include \n #include \n #include \n","submitted":null,"commit_id":"58c3ef68bbb9082e5a16449baa15c18ccf7e5707"}prr-0.20.0/testdata/review/status/review000064400000000000000000000004251046102023000163700ustar 00000000000000> diff --git a/src/utils.cpp b/src/utils.cpp > index b02c16bc3df..fca25d6c839 100644 > --- a/src/utils.cpp > +++ b/src/utils.cpp > @@ -1,5 +1,6 @@ > #include > #include > +#include > #include > #include > #include prr-0.20.0/testdata/review/trailing_whitespace/metadata000064400000000000000000000040731046102023000213540ustar 00000000000000{"original":"diff --git a/ch2.txt b/ch2.txt\nindex 4d729e6..2641120 100644\n--- a/ch2.txt\n+++ b/ch2.txt\n@@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR\n \n 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. \n \n-2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. \n-\n-3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. \n-\n-4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. \n-\n-5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. \n \n 6. There is no instance of a country having benefited from prolonged warfare. \n \n@@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR\n \n 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. \n \n+asdf\n+asdf\n+asdf\n+adsf\n+\n 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. \n \n 18. This is called, using the conquered foe to augment one's own strength. \n","submitted":null,"commit_id":"ddb1d0d0d4accb2e9e39feb4597a7be1f21b62a9"}prr-0.20.0/testdata/review/trailing_whitespace/review000064400000000000000000000037531046102023000211010ustar 00000000000000> diff --git a/ch2.txt b/ch2.txt > index 4d729e6..2641120 100644 > --- a/ch2.txt > +++ b/ch2.txt > @@ -2,13 +2,6 @@ CHAPTER 2. WAGING WAR > > 1. Sun Tzu said: In the operations of war, where there are in the field a thousand swift chariots, as many heavy chariots, and a hundred thousand mail-clad soldiers, with provisions enough to carry them a thousand LI, the expenditure at home and at the front, including entertainment of guests, small items such as glue and paint, and sums spent on chariots and armor, will reach the total of a thousand ounces of silver per day. Such is the cost of raising an army of 100,000 men. > > -2. When you engage in actual fighting, if victory is long in coming, then men's weapons will grow dull and their ardor will be damped. If you lay siege to a town, you will exhaust your strength. > - > -3. Again, if the campaign is protracted, the resources of the State will not be equal to the strain. > - > -4. Now, when your weapons are dulled, your ardor damped, your strength exhausted and your treasure spent, other chieftains will spring up to take advantage of your extremity. Then no man, however wise, will be able to avert the consequences that must ensue. > - > -5. Thus, though we have heard of stupid haste in war, cleverness has never been seen associated with long delays. > > 6. There is no instance of a country having benefited from prolonged warfare. > > @@ -30,6 +23,11 @@ CHAPTER 2. WAGING WAR > > 16. Now in order to kill the enemy, our men must be roused to anger; that there may be advantage from defeating the enemy, they must have their rewards. > > +asdf > +asdf > +asdf > +adsf > + > 17. Therefore in chariot fighting, when ten or more chariots have been taken, those should be rewarded who took the first. Our own flags should be substituted for those of the enemy, and the chariots mingled and used in conjunction with ours. The captured soldiers should be kindly treated and kept. > > 18. This is called, using the conquered foe to augment one's own strength. prr-0.20.0/testdata/review_comment000064400000000000000000000026301046102023000152660ustar 00000000000000 Review comment > diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/review_comment_whitespace000064400000000000000000000026321046102023000175040ustar 00000000000000 @prr approve Review comment > diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/review_comments_interleaved_with_pr_description000064400000000000000000000007411046102023000241730ustar 00000000000000Not necessary. > This is just for testing purposes. This might be fine or not. @prr reject > diff --git a/README.md b/README.md > index eda592e..ba84732 100644 > --- a/README.md > +++ b/README.md > @@ -1,5 +1,5 @@ > -MA-FSA for Go > -============= > +MA-FSA for Golang > +================= Doesn't seem necessary ... > > Package mafsa implements Minimal Acyclic Finite State Automata (MA-FSA) > with Minimal Perfect Hashing (MPH). Basically, it's a set of strings that prr-0.20.0/testdata/single_comment000064400000000000000000000026071046102023000152520ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/spaces_in_filename000064400000000000000000000010221046102023000160410ustar 00000000000000> diff --git a/build/scripts/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json b/build/scripts/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json > new file mode 100644 > index 0000000..5daac7b > --- /dev/null > +++ b/build/scripts/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json > @@ -0,0 +1,1831 @@ > +{ > + "annotations": { foo > + "list": [ > + { > + "builtIn": 1, > + "datasource": "-- Grafana --", prr-0.20.0/testdata/testgitrepo/README-applied.md000064400000000000000000000000671046102023000175660ustar 00000000000000For testing =========== This is a better readme line! prr-0.20.0/testdata/testgitrepo/README.md000064400000000000000000000000521046102023000161440ustar 00000000000000For testing =========== This is a readme prr-0.20.0/testdata/trailing_comment000064400000000000000000000077731046102023000156130ustar 00000000000000> diff --git a/ch1.txt b/ch1.txt > deleted file mode 100644 > index d30353f..0000000 > --- a/ch1.txt > +++ /dev/null > @@ -1,59 +0,0 @@ > -THE ART OF WAR BY SUN TZU > - > -Translated by Lionel Giles > -Originally published 1910 > - > -This version was generated automatically at www.suntzusaid.com. > - > - > -CHAPTER 1. LAYING PLANS > - > -1. Sun Tzu said: The art of war is of vital importance to the State. > - > -2. It is a matter of life and death, a road either to safety or to ruin. Hence it is a subject of inquiry which can on no account be neglected. > - > -3. The art of war, then, is governed by five constant factors, to be taken into account in one's deliberations, when seeking to determine the conditions obtaining in the field. > - > -4. These are: (1) The Moral Law; (2) Heaven; (3) Earth; (4) The Commander; (5) Method and discipline. > - > -5,6. The MORAL LAW causes the people to be in complete accord with their ruler, so that they will follow him regardless of their lives, undismayed by any danger. > - > -7. HEAVEN signifies night and day, cold and heat, times and seasons. > - > -8. EARTH comprises distances, great and small; danger and security; open ground and narrow passes; the chances of life and death. > - > -9. The COMMANDER stands for the virtues of wisdom, sincerity, benevolence, courage and strictness. > - > -10. By METHOD AND DISCIPLINE are to be understood the marshaling of the army in its proper subdivisions, the graduations of rank among the officers, the maintenance of roads by which supplies may reach the army, and the control of military expenditure. > - > -11. These five heads should be familiar to every general: he who knows them will be victorious; he who knows them not will fail. > - > -12. Therefore, in your deliberations, when seeking to determine the military conditions, let them be made the basis of a comparison, in this wise: > - > -13. (1) Which of the two sovereigns is imbued with the Moral law? (2) Which of the two generals has most ability? (3) With whom lie the advantages derived from Heaven and Earth? (4) On which side is discipline most rigorously enforced? (5) Which army is stronger? (6) On which side are officers and men more highly trained? (7) In which army is there the greater constancy both in reward and punishment? > - > -14. By means of these seven considerations I can forecast victory or defeat. > - > -15. The general that hearkens to my counsel and acts upon it, will conquer: let such a one be retained in command! The general that hearkens not to my counsel nor acts upon it, will suffer defeat: let such a one be dismissed! > - > -16. While heeding the profit of my counsel, avail yourself also of any helpful circumstances over and beyond the ordinary rules. > - > -17. According as circumstances are favorable, one should modify one's plans. > - > -18. All warfare is based on deception. > - > -19. Hence, when able to attack, we must seem unable; when using our forces, we must seem inactive; when we are near, we must make the enemy believe we are far away; when far away, we must make him believe we are near. > - > -20. Hold out baits to entice the enemy. Feign disorder, and crush him. > - > -21. If he is secure at all points, be prepared for him. If he is in superior strength, evade him. > - > -22. If your opponent is of choleric temper, seek to irritate him. Pretend to be weak, that he may grow arrogant. > - > -23. If he is taking his ease, give him no rest. If his forces are united, separate them. > - > -24. Attack him where he is unprepared, appear where you are not expected. > - > -25. These military devices, leading to victory, must not be divulged beforehand. > - > -26. Now the general who wins a battle makes many calculations in his temple ere the battle is fought. The general who loses a battle makes but few calculations beforehand. Thus do many calculations lead to victory, and few calculations to defeat: how much more no calculation at all! It is by attention to this point that I can foresee who is likely to win or lose. Comment 1 prr-0.20.0/testdata/unknown_directive000064400000000000000000000026211046102023000160000ustar 00000000000000@prr asdf > diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; Comment 1 > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/unterminated_back_to_back_span000064400000000000000000000026101046102023000204230ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { > BtfKind::Void => { Comment 1 > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/testdata/unterminated_span000064400000000000000000000025731046102023000157710ustar 00000000000000> diff --git a/libbpf-cargo/src/btf/btf.rs b/libbpf-cargo/src/btf/btf.rs > index a26b2a5..fffb281 100644 > --- a/libbpf-cargo/src/btf/btf.rs > +++ b/libbpf-cargo/src/btf/btf.rs > @@ -731,7 +731,7 @@ impl<'a> Btf<'a> { > fn load_type(&mut self, data: &'a [u8]) -> Result> { > let t = data.pread::(0)?; > let extra = &data[size_of::()..]; > - let kind = (t.info >> 24) & 0xf; > + let kind = (t.info >> 24) & 0x1f; > > match BtfKind::try_from(kind)? { > BtfKind::Void => { > diff --git a/libbpf-cargo/src/test.rs b/libbpf-cargo/src/test.rs > index 5b08843..82a0586 100644 > --- a/libbpf-cargo/src/test.rs > +++ b/libbpf-cargo/src/test.rs > @@ -2145,3 +2145,27 @@ pub struct __anon_3 { > > assert_definition(&btf, struct_bpf_sock_tuple, expected_output); > } > + > +#[test] > +fn test_btf_dump_float() { > + let prog_text = r#" > +float f = 2.16; > +double d = 12.15; > +"#; > + > + let btf = build_btf_prog(prog_text); > + > + let f = find_type_in_btf!(btf, Var, "f"); > + let d = find_type_in_btf!(btf, Var, "d"); > + > + assert_eq!( > + "f32", > + btf.type_declaration(f) > + .expect("Failed to generate f decl") > + ); > + assert_eq!( > + "f64", > + btf.type_declaration(d) > + .expect("Failed to generate d decl") > + ); > +} prr-0.20.0/vim/ftdetect/prr.vim000064400000000000000000000000551046102023000144230ustar 00000000000000au BufNewFile,BufRead *.prr set filetype=prr prr-0.20.0/vim/ftplugin/prr.vim000064400000000000000000000000761046102023000144540ustar 00000000000000setlocal foldmethod=syntax let b:undo_ftplugin = 'setl fdm&' prr-0.20.0/vim/syntax/prr.vim000064400000000000000000000025021046102023000141460ustar 00000000000000" Vim syntax file " Language: prr " Maintainer: Daniel Xu " Last Change: 2023 Nov 07 " Credits: Bram Moolenaar , " Ɓukasz Niemier " Check whether an earlier file has defined a syntax already if exists("b:current_syntax") finish endif syn region prrFile start=/^> diff/ end=/^> diff/ms=s-1,me=s-1 transparent fold keepend contains=prrHeader,prrIndex,prrChunk syn region prrChunk start=/^> @@/ start=/^\n> /rs=e-2 end=/^> @@/ms=s-1,me=s-1 end=/^> diff/ms=s-1,me=s-1 end=/^$/ transparent fold keepend contains=CONTAINED,prrTag syn match prrAdded contained "^> +.*" syn match prrRemoved contained "^> -.*" syn match prrHeader contained "^> diff.*" syn match prrIndex contained "^> index.*" syn match prrChunkH contained "^> @@.*" syn match prrTag "^@.*" contains=prrTagName,prrResult transparent syn match prrTagName contained "@prr" nextgroup=prrResult syn keyword prrResult contained approve reject comment " Define the default highlighting. " Only used when an item doesn't have highlighting yet hi def link prrAdded Identifier hi def link prrRemoved Special hi def link prrTagName Keyword hi def link prrResult String hi def link prrHeader Include hi def link prrIndex Comment hi def link prrChunkH Function let b:current_syntax = "prr"